mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			189 lines
		
	
	
	
		
			6.4 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
	
		
			6.4 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
| \chapter{Building C and \Cpp{} Extensions on \UNIX{}
 | |
|      \label{building-on-unix}}
 | |
| 
 | |
| \sectionauthor{Jim Fulton}{jim@zope.com}
 | |
| 
 | |
| 
 | |
| %The make file make file, building C extensions on Unix
 | |
| 
 | |
| 
 | |
| Starting in Python 1.4, Python provides a special make file for
 | |
| building make files for building dynamically-linked extensions and
 | |
| custom interpreters.  The make file make file builds a make file
 | |
| that reflects various system variables determined by configure when
 | |
| the Python interpreter was built, so people building module's don't
 | |
| have to resupply these settings.  This vastly simplifies the process
 | |
| of building extensions and custom interpreters on Unix systems.
 | |
| 
 | |
| The make file make file is distributed as the file
 | |
| \file{Misc/Makefile.pre.in} in the Python source distribution.  The
 | |
| first step in building extensions or custom interpreters is to copy
 | |
| this make file to a development directory containing extension module
 | |
| source.
 | |
| 
 | |
| The make file make file, \file{Makefile.pre.in} uses metadata
 | |
| provided in a file named \file{Setup}.  The format of the \file{Setup}
 | |
| file is the same as the \file{Setup} (or \file{Setup.dist}) file
 | |
| provided in the \file{Modules/} directory of the Python source
 | |
| distribution.  The \file{Setup} file contains variable definitions:
 | |
| 
 | |
| \begin{verbatim}
 | |
| EC=/projects/ExtensionClass
 | |
| \end{verbatim}
 | |
| 
 | |
| and module description lines.  It can also contain blank lines and
 | |
| comment lines that start with \character{\#}.
 | |
| 
 | |
| A module description line includes a module name, source files,
 | |
| options, variable references, and other input files, such
 | |
| as libraries or object files.  Consider a simple example:
 | |
| 
 | |
| \begin{verbatim}
 | |
| ExtensionClass ExtensionClass.c
 | |
| \end{verbatim}
 | |
| 
 | |
| This is the simplest form of a module definition line.  It defines a
 | |
| module, \module{ExtensionClass}, which has a single source file,
 | |
| \file{ExtensionClass.c}.
 | |
| 
 | |
| This slightly more complex example uses an \strong{-I} option to
 | |
| specify an include directory:
 | |
| 
 | |
| \begin{verbatim}
 | |
| EC=/projects/ExtensionClass
 | |
| cPersistence cPersistence.c -I$(EC)
 | |
| \end{verbatim} % $ <-- bow to font lock
 | |
| 
 | |
| This example also illustrates the format for variable references.
 | |
| 
 | |
| For systems that support dynamic linking, the \file{Setup} file should 
 | |
| begin:
 | |
| 
 | |
| \begin{verbatim}
 | |
| *shared*
 | |
| \end{verbatim}
 | |
| 
 | |
| to indicate that the modules defined in \file{Setup} are to be built
 | |
| as dynamically linked modules.  A line containing only \samp{*static*}
 | |
| can be used to indicate the subsequently listed modules should be
 | |
| statically linked.
 | |
| 
 | |
| Here is a complete \file{Setup} file for building a
 | |
| \module{cPersistent} module:
 | |
| 
 | |
| \begin{verbatim}
 | |
| # Set-up file to build the cPersistence module. 
 | |
| # Note that the text should begin in the first column.
 | |
| *shared*
 | |
| 
 | |
| # We need the path to the directory containing the ExtensionClass
 | |
| # include file.
 | |
| EC=/projects/ExtensionClass
 | |
| cPersistence cPersistence.c -I$(EC)
 | |
| \end{verbatim} % $ <-- bow to font lock
 | |
| 
 | |
| After the \file{Setup} file has been created, \file{Makefile.pre.in}
 | |
| is run with the \samp{boot} target to create a make file:
 | |
| 
 | |
| \begin{verbatim}
 | |
| make -f Makefile.pre.in boot
 | |
| \end{verbatim}
 | |
| 
 | |
| This creates the file, Makefile.  To build the extensions, simply
 | |
| run the created make file:
 | |
| 
 | |
| \begin{verbatim}
 | |
| make
 | |
| \end{verbatim}
 | |
| 
 | |
| It's not necessary to re-run \file{Makefile.pre.in} if the
 | |
| \file{Setup} file is changed.  The make file automatically rebuilds
 | |
| itself if the \file{Setup} file changes.
 | |
| 
 | |
| 
 | |
| \section{Building Custom Interpreters \label{custom-interps}}
 | |
| 
 | |
| The make file built by \file{Makefile.pre.in} can be run with the
 | |
| \samp{static} target to build an interpreter:
 | |
| 
 | |
| \begin{verbatim}
 | |
| make static
 | |
| \end{verbatim}
 | |
| 
 | |
| Any modules defined in the \file{Setup} file before the
 | |
| \samp{*shared*} line will be statically linked into the interpreter.
 | |
| Typically, a \samp{*shared*} line is omitted from the
 | |
| \file{Setup} file when a custom interpreter is desired.
 | |
| 
 | |
| 
 | |
| \section{Module Definition Options \label{module-defn-options}}
 | |
| 
 | |
| Several compiler options are supported:
 | |
| 
 | |
| \begin{tableii}{l|l}{programopt}{Option}{Meaning}
 | |
|   \lineii{-C}{Tell the C pre-processor not to discard comments}
 | |
|   \lineii{-D\var{name}=\var{value}}{Define a macro}
 | |
|   \lineii{-I\var{dir}}{Specify an include directory, \var{dir}}
 | |
|   \lineii{-L\var{dir}}{Specify a link-time library directory, \var{dir}}
 | |
|   \lineii{-R\var{dir}}{Specify a run-time library directory, \var{dir}}
 | |
|   \lineii{-l\var{lib}}{Link a library, \var{lib}}
 | |
|   \lineii{-U\var{name}}{Undefine a macro}
 | |
| \end{tableii}
 | |
| 
 | |
| Other compiler options can be included (snuck in) by putting them
 | |
| in variables.
 | |
| 
 | |
| Source files can include files with \file{.c}, \file{.C}, \file{.cc},
 | |
| \file{.cpp}, \file{.cxx}, and \file{.c++} extensions. 
 | |
| 
 | |
| Other input files include files with \file{.a}, \file{.o}, \file{.sl}, 
 | |
| and \file{.so} extensions.
 | |
| 
 | |
| 
 | |
| \section{Example \label{module-defn-example}}
 | |
| 
 | |
| Here is a more complicated example from \file{Modules/Setup.dist}:
 | |
| 
 | |
| \begin{verbatim}
 | |
| GMP=/ufs/guido/src/gmp
 | |
| mpz mpzmodule.c -I$(GMP) $(GMP)/libgmp.a
 | |
| \end{verbatim}
 | |
| 
 | |
| which could also be written as:
 | |
| 
 | |
| \begin{verbatim}
 | |
| mpz mpzmodule.c -I$(GMP) -L$(GMP) -lgmp
 | |
| \end{verbatim}
 | |
| 
 | |
| 
 | |
| \section{Distributing your extension modules
 | |
|      \label{distributing}}
 | |
| 
 | |
| There are two ways to distribute extension modules for others to use.
 | |
| The way that allows the easiest cross-platform support is to use the
 | |
| \module{distutils}\refstmodindex{distutils} package.  The manual
 | |
| \citetitle[../dist/dist.html]{Distributing Python Modules} contains
 | |
| information on this approach.  It is recommended that all new
 | |
| extensions be distributed using this approach to allow easy building
 | |
| and installation across platforms.  Older extensions should migrate to
 | |
| this approach as well.
 | |
| 
 | |
| What follows describes the older approach; there are still many
 | |
| extensions which use this.
 | |
| 
 | |
| When distributing your extension modules in source form, make sure to
 | |
| include a \file{Setup} file.  The \file{Setup} file should be named
 | |
| \file{Setup.in} in the distribution.  The make file make file,
 | |
| \file{Makefile.pre.in}, will copy \file{Setup.in} to \file{Setup} if
 | |
| the person installing the extension doesn't do so manually.
 | |
| Distributing a \file{Setup.in} file makes it easy for people to
 | |
| customize the \file{Setup} file while keeping the original in
 | |
| \file{Setup.in}.
 | |
| 
 | |
| It is a good idea to include a copy of \file{Makefile.pre.in} for
 | |
| people who do not have a source distribution of Python.
 | |
| 
 | |
| Do not distribute a make file.  People building your modules
 | |
| should use \file{Makefile.pre.in} to build their own make file.  A
 | |
| \file{README} file included in the package should provide simple
 | |
| instructions to perform the build.
 | 
