Home | History | Annotate | Download | only in distutils
      1 """distutils.ccompiler
      2 
      3 Contains CCompiler, an abstract base class that defines the interface
      4 for the Distutils compiler abstraction model."""
      5 
      6 import sys, os, re
      7 from distutils.errors import *
      8 from distutils.spawn import spawn
      9 from distutils.file_util import move_file
     10 from distutils.dir_util import mkpath
     11 from distutils.dep_util import newer_pairwise, newer_group
     12 from distutils.util import split_quoted, execute
     13 from distutils import log
     14 
     15 class CCompiler:
     16     """Abstract base class to define the interface that must be implemented
     17     by real compiler classes.  Also has some utility methods used by
     18     several compiler classes.
     19 
     20     The basic idea behind a compiler abstraction class is that each
     21     instance can be used for all the compile/link steps in building a
     22     single project.  Thus, attributes common to all of those compile and
     23     link steps -- include directories, macros to define, libraries to link
     24     against, etc. -- are attributes of the compiler instance.  To allow for
     25     variability in how individual files are treated, most of those
     26     attributes may be varied on a per-compilation or per-link basis.
     27     """
     28 
     29     # 'compiler_type' is a class attribute that identifies this class.  It
     30     # keeps code that wants to know what kind of compiler it's dealing with
     31     # from having to import all possible compiler classes just to do an
     32     # 'isinstance'.  In concrete CCompiler subclasses, 'compiler_type'
     33     # should really, really be one of the keys of the 'compiler_class'
     34     # dictionary (see below -- used by the 'new_compiler()' factory
     35     # function) -- authors of new compiler interface classes are
     36     # responsible for updating 'compiler_class'!
     37     compiler_type = None
     38 
     39     # XXX things not handled by this compiler abstraction model:
     40     #   * client can't provide additional options for a compiler,
     41     #     e.g. warning, optimization, debugging flags.  Perhaps this
     42     #     should be the domain of concrete compiler abstraction classes
     43     #     (UnixCCompiler, MSVCCompiler, etc.) -- or perhaps the base
     44     #     class should have methods for the common ones.
     45     #   * can't completely override the include or library searchg
     46     #     path, ie. no "cc -I -Idir1 -Idir2" or "cc -L -Ldir1 -Ldir2".
     47     #     I'm not sure how widely supported this is even by Unix
     48     #     compilers, much less on other platforms.  And I'm even less
     49     #     sure how useful it is; maybe for cross-compiling, but
     50     #     support for that is a ways off.  (And anyways, cross
     51     #     compilers probably have a dedicated binary with the
     52     #     right paths compiled in.  I hope.)
     53     #   * can't do really freaky things with the library list/library
     54     #     dirs, e.g. "-Ldir1 -lfoo -Ldir2 -lfoo" to link against
     55     #     different versions of libfoo.a in different locations.  I
     56     #     think this is useless without the ability to null out the
     57     #     library search path anyways.
     58 
     59 
     60     # Subclasses that rely on the standard filename generation methods
     61     # implemented below should override these; see the comment near
     62     # those methods ('object_filenames()' et. al.) for details:
     63     src_extensions = None               # list of strings
     64     obj_extension = None                # string
     65     static_lib_extension = None
     66     shared_lib_extension = None         # string
     67     static_lib_format = None            # format string
     68     shared_lib_format = None            # prob. same as static_lib_format
     69     exe_extension = None                # string
     70 
     71     # Default language settings. language_map is used to detect a source
     72     # file or Extension target language, checking source filenames.
     73     # language_order is used to detect the language precedence, when deciding
     74     # what language to use when mixing source types. For example, if some
     75     # extension has two files with ".c" extension, and one with ".cpp", it
     76     # is still linked as c++.
     77     language_map = {".c"   : "c",
     78                     ".cc"  : "c++",
     79                     ".cpp" : "c++",
     80                     ".cxx" : "c++",
     81                     ".m"   : "objc",
     82                    }
     83     language_order = ["c++", "objc", "c"]
     84 
     85     def __init__(self, verbose=0, dry_run=0, force=0):
     86         self.dry_run = dry_run
     87         self.force = force
     88         self.verbose = verbose
     89 
     90         # 'output_dir': a common output directory for object, library,
     91         # shared object, and shared library files
     92         self.output_dir = None
     93 
     94         # 'macros': a list of macro definitions (or undefinitions).  A
     95         # macro definition is a 2-tuple (name, value), where the value is
     96         # either a string or None (no explicit value).  A macro
     97         # undefinition is a 1-tuple (name,).
     98         self.macros = []
     99 
    100         # 'include_dirs': a list of directories to search for include files
    101         self.include_dirs = []
    102 
    103         # 'libraries': a list of libraries to include in any link
    104         # (library names, not filenames: eg. "foo" not "libfoo.a")
    105         self.libraries = []
    106 
    107         # 'library_dirs': a list of directories to search for libraries
    108         self.library_dirs = []
    109 
    110         # 'runtime_library_dirs': a list of directories to search for
    111         # shared libraries/objects at runtime
    112         self.runtime_library_dirs = []
    113 
    114         # 'objects': a list of object files (or similar, such as explicitly
    115         # named library files) to include on any link
    116         self.objects = []
    117 
    118         for key in self.executables.keys():
    119             self.set_executable(key, self.executables[key])
    120 
    121     def set_executables(self, **kwargs):
    122         """Define the executables (and options for them) that will be run
    123         to perform the various stages of compilation.  The exact set of
    124         executables that may be specified here depends on the compiler
    125         class (via the 'executables' class attribute), but most will have:
    126           compiler      the C/C++ compiler
    127           linker_so     linker used to create shared objects and libraries
    128           linker_exe    linker used to create binary executables
    129           archiver      static library creator
    130 
    131         On platforms with a command-line (Unix, DOS/Windows), each of these
    132         is a string that will be split into executable name and (optional)
    133         list of arguments.  (Splitting the string is done similarly to how
    134         Unix shells operate: words are delimited by spaces, but quotes and
    135         backslashes can override this.  See
    136         'distutils.util.split_quoted()'.)
    137         """
    138 
    139         # Note that some CCompiler implementation classes will define class
    140         # attributes 'cpp', 'cc', etc. with hard-coded executable names;
    141         # this is appropriate when a compiler class is for exactly one
    142         # compiler/OS combination (eg. MSVCCompiler).  Other compiler
    143         # classes (UnixCCompiler, in particular) are driven by information
    144         # discovered at run-time, since there are many different ways to do
    145         # basically the same things with Unix C compilers.
    146 
    147         for key in kwargs:
    148             if key not in self.executables:
    149                 raise ValueError("unknown executable '%s' for class %s" %
    150                       (key, self.__class__.__name__))
    151             self.set_executable(key, kwargs[key])
    152 
    153     def set_executable(self, key, value):
    154         if isinstance(value, str):
    155             setattr(self, key, split_quoted(value))
    156         else:
    157             setattr(self, key, value)
    158 
    159     def _find_macro(self, name):
    160         i = 0
    161         for defn in self.macros:
    162             if defn[0] == name:
    163                 return i
    164             i += 1
    165         return None
    166 
    167     def _check_macro_definitions(self, definitions):
    168         """Ensures that every element of 'definitions' is a valid macro
    169         definition, ie. either (name,value) 2-tuple or a (name,) tuple.  Do
    170         nothing if all definitions are OK, raise TypeError otherwise.
    171         """
    172         for defn in definitions:
    173             if not (isinstance(defn, tuple) and
    174                     (len(defn) in (1, 2) and
    175                       (isinstance (defn[1], str) or defn[1] is None)) and
    176                     isinstance (defn[0], str)):
    177                 raise TypeError(("invalid macro definition '%s': " % defn) + \
    178                       "must be tuple (string,), (string, string), or " + \
    179                       "(string, None)")
    180 
    181 
    182     # -- Bookkeeping methods -------------------------------------------
    183 
    184     def define_macro(self, name, value=None):
    185         """Define a preprocessor macro for all compilations driven by this
    186         compiler object.  The optional parameter 'value' should be a
    187         string; if it is not supplied, then the macro will be defined
    188         without an explicit value and the exact outcome depends on the
    189         compiler used (XXX true? does ANSI say anything about this?)
    190         """
    191         # Delete from the list of macro definitions/undefinitions if
    192         # already there (so that this one will take precedence).
    193         i = self._find_macro (name)
    194         if i is not None:
    195             del self.macros[i]
    196 
    197         self.macros.append((name, value))
    198 
    199     def undefine_macro(self, name):
    200         """Undefine a preprocessor macro for all compilations driven by
    201         this compiler object.  If the same macro is defined by
    202         'define_macro()' and undefined by 'undefine_macro()' the last call
    203         takes precedence (including multiple redefinitions or
    204         undefinitions).  If the macro is redefined/undefined on a
    205         per-compilation basis (ie. in the call to 'compile()'), then that
    206         takes precedence.
    207         """
    208         # Delete from the list of macro definitions/undefinitions if
    209         # already there (so that this one will take precedence).
    210         i = self._find_macro (name)
    211         if i is not None:
    212             del self.macros[i]
    213 
    214         undefn = (name,)
    215         self.macros.append(undefn)
    216 
    217     def add_include_dir(self, dir):
    218         """Add 'dir' to the list of directories that will be searched for
    219         header files.  The compiler is instructed to search directories in
    220         the order in which they are supplied by successive calls to
    221         'add_include_dir()'.
    222         """
    223         self.include_dirs.append(dir)
    224 
    225     def set_include_dirs(self, dirs):
    226         """Set the list of directories that will be searched to 'dirs' (a
    227         list of strings).  Overrides any preceding calls to
    228         'add_include_dir()'; subsequence calls to 'add_include_dir()' add
    229         to the list passed to 'set_include_dirs()'.  This does not affect
    230         any list of standard include directories that the compiler may
    231         search by default.
    232         """
    233         self.include_dirs = dirs[:]
    234 
    235     def add_library(self, libname):
    236         """Add 'libname' to the list of libraries that will be included in
    237         all links driven by this compiler object.  Note that 'libname'
    238         should *not* be the name of a file containing a library, but the
    239         name of the library itself: the actual filename will be inferred by
    240         the linker, the compiler, or the compiler class (depending on the
    241         platform).
    242 
    243         The linker will be instructed to link against libraries in the
    244         order they were supplied to 'add_library()' and/or
    245         'set_libraries()'.  It is perfectly valid to duplicate library
    246         names; the linker will be instructed to link against libraries as
    247         many times as they are mentioned.
    248         """
    249         self.libraries.append(libname)
    250 
    251     def set_libraries(self, libnames):
    252         """Set the list of libraries to be included in all links driven by
    253         this compiler object to 'libnames' (a list of strings).  This does
    254         not affect any standard system libraries that the linker may
    255         include by default.
    256         """
    257         self.libraries = libnames[:]
    258 
    259     def add_library_dir(self, dir):
    260         """Add 'dir' to the list of directories that will be searched for
    261         libraries specified to 'add_library()' and 'set_libraries()'.  The
    262         linker will be instructed to search for libraries in the order they
    263         are supplied to 'add_library_dir()' and/or 'set_library_dirs()'.
    264         """
    265         self.library_dirs.append(dir)
    266 
    267     def set_library_dirs(self, dirs):
    268         """Set the list of library search directories to 'dirs' (a list of
    269         strings).  This does not affect any standard library search path
    270         that the linker may search by default.
    271         """
    272         self.library_dirs = dirs[:]
    273 
    274     def add_runtime_library_dir(self, dir):
    275         """Add 'dir' to the list of directories that will be searched for
    276         shared libraries at runtime.
    277         """
    278         self.runtime_library_dirs.append(dir)
    279 
    280     def set_runtime_library_dirs(self, dirs):
    281         """Set the list of directories to search for shared libraries at
    282         runtime to 'dirs' (a list of strings).  This does not affect any
    283         standard search path that the runtime linker may search by
    284         default.
    285         """
    286         self.runtime_library_dirs = dirs[:]
    287 
    288     def add_link_object(self, object):
    289         """Add 'object' to the list of object files (or analogues, such as
    290         explicitly named library files or the output of "resource
    291         compilers") to be included in every link driven by this compiler
    292         object.
    293         """
    294         self.objects.append(object)
    295 
    296     def set_link_objects(self, objects):
    297         """Set the list of object files (or analogues) to be included in
    298         every link to 'objects'.  This does not affect any standard object
    299         files that the linker may include by default (such as system
    300         libraries).
    301         """
    302         self.objects = objects[:]
    303 
    304 
    305     # -- Private utility methods --------------------------------------
    306     # (here for the convenience of subclasses)
    307 
    308     # Helper method to prep compiler in subclass compile() methods
    309 
    310     def _setup_compile(self, outdir, macros, incdirs, sources, depends,
    311                        extra):
    312         """Process arguments and decide which source files to compile."""
    313         if outdir is None:
    314             outdir = self.output_dir
    315         elif not isinstance(outdir, str):
    316             raise TypeError("'output_dir' must be a string or None")
    317 
    318         if macros is None:
    319             macros = self.macros
    320         elif isinstance(macros, list):
    321             macros = macros + (self.macros or [])
    322         else:
    323             raise TypeError("'macros' (if supplied) must be a list of tuples")
    324 
    325         if incdirs is None:
    326             incdirs = self.include_dirs
    327         elif isinstance(incdirs, (list, tuple)):
    328             incdirs = list(incdirs) + (self.include_dirs or [])
    329         else:
    330             raise TypeError(
    331                   "'include_dirs' (if supplied) must be a list of strings")
    332 
    333         if extra is None:
    334             extra = []
    335 
    336         # Get the list of expected output (object) files
    337         objects = self.object_filenames(sources, strip_dir=0,
    338                                         output_dir=outdir)
    339         assert len(objects) == len(sources)
    340 
    341         pp_opts = gen_preprocess_options(macros, incdirs)
    342 
    343         build = {}
    344         for i in range(len(sources)):
    345             src = sources[i]
    346             obj = objects[i]
    347             ext = os.path.splitext(src)[1]
    348             self.mkpath(os.path.dirname(obj))
    349             build[obj] = (src, ext)
    350 
    351         return macros, objects, extra, pp_opts, build
    352 
    353     def _get_cc_args(self, pp_opts, debug, before):
    354         # works for unixccompiler, cygwinccompiler
    355         cc_args = pp_opts + ['-c']
    356         if debug:
    357             cc_args[:0] = ['-g']
    358         if before:
    359             cc_args[:0] = before
    360         return cc_args
    361 
    362     def _fix_compile_args(self, output_dir, macros, include_dirs):
    363         """Typecheck and fix-up some of the arguments to the 'compile()'
    364         method, and return fixed-up values.  Specifically: if 'output_dir'
    365         is None, replaces it with 'self.output_dir'; ensures that 'macros'
    366         is a list, and augments it with 'self.macros'; ensures that
    367         'include_dirs' is a list, and augments it with 'self.include_dirs'.
    368         Guarantees that the returned values are of the correct type,
    369         i.e. for 'output_dir' either string or None, and for 'macros' and
    370         'include_dirs' either list or None.
    371         """
    372         if output_dir is None:
    373             output_dir = self.output_dir
    374         elif not isinstance(output_dir, str):
    375             raise TypeError("'output_dir' must be a string or None")
    376 
    377         if macros is None:
    378             macros = self.macros
    379         elif isinstance(macros, list):
    380             macros = macros + (self.macros or [])
    381         else:
    382             raise TypeError("'macros' (if supplied) must be a list of tuples")
    383 
    384         if include_dirs is None:
    385             include_dirs = self.include_dirs
    386         elif isinstance(include_dirs, (list, tuple)):
    387             include_dirs = list(include_dirs) + (self.include_dirs or [])
    388         else:
    389             raise TypeError(
    390                   "'include_dirs' (if supplied) must be a list of strings")
    391 
    392         return output_dir, macros, include_dirs
    393 
    394     def _prep_compile(self, sources, output_dir, depends=None):
    395         """Decide which souce files must be recompiled.
    396 
    397         Determine the list of object files corresponding to 'sources',
    398         and figure out which ones really need to be recompiled.
    399         Return a list of all object files and a dictionary telling
    400         which source files can be skipped.
    401         """
    402         # Get the list of expected output (object) files
    403         objects = self.object_filenames(sources, output_dir=output_dir)
    404         assert len(objects) == len(sources)
    405 
    406         # Return an empty dict for the "which source files can be skipped"
    407         # return value to preserve API compatibility.
    408         return objects, {}
    409 
    410     def _fix_object_args(self, objects, output_dir):
    411         """Typecheck and fix up some arguments supplied to various methods.
    412         Specifically: ensure that 'objects' is a list; if output_dir is
    413         None, replace with self.output_dir.  Return fixed versions of
    414         'objects' and 'output_dir'.
    415         """
    416         if not isinstance(objects, (list, tuple)):
    417             raise TypeError("'objects' must be a list or tuple of strings")
    418         objects = list(objects)
    419 
    420         if output_dir is None:
    421             output_dir = self.output_dir
    422         elif not isinstance(output_dir, str):
    423             raise TypeError("'output_dir' must be a string or None")
    424 
    425         return (objects, output_dir)
    426 
    427     def _fix_lib_args(self, libraries, library_dirs, runtime_library_dirs):
    428         """Typecheck and fix up some of the arguments supplied to the
    429         'link_*' methods.  Specifically: ensure that all arguments are
    430         lists, and augment them with their permanent versions
    431         (eg. 'self.libraries' augments 'libraries').  Return a tuple with
    432         fixed versions of all arguments.
    433         """
    434         if libraries is None:
    435             libraries = self.libraries
    436         elif isinstance(libraries, (list, tuple)):
    437             libraries = list (libraries) + (self.libraries or [])
    438         else:
    439             raise TypeError(
    440                   "'libraries' (if supplied) must be a list of strings")
    441 
    442         if library_dirs is None:
    443             library_dirs = self.library_dirs
    444         elif isinstance(library_dirs, (list, tuple)):
    445             library_dirs = list (library_dirs) + (self.library_dirs or [])
    446         else:
    447             raise TypeError(
    448                   "'library_dirs' (if supplied) must be a list of strings")
    449 
    450         if runtime_library_dirs is None:
    451             runtime_library_dirs = self.runtime_library_dirs
    452         elif isinstance(runtime_library_dirs, (list, tuple)):
    453             runtime_library_dirs = (list(runtime_library_dirs) +
    454                                     (self.runtime_library_dirs or []))
    455         else:
    456             raise TypeError("'runtime_library_dirs' (if supplied) "
    457                             "must be a list of strings")
    458 
    459         return (libraries, library_dirs, runtime_library_dirs)
    460 
    461     def _need_link(self, objects, output_file):
    462         """Return true if we need to relink the files listed in 'objects'
    463         to recreate 'output_file'.
    464         """
    465         if self.force:
    466             return True
    467         else:
    468             if self.dry_run:
    469                 newer = newer_group (objects, output_file, missing='newer')
    470             else:
    471                 newer = newer_group (objects, output_file)
    472             return newer
    473 
    474     def detect_language(self, sources):
    475         """Detect the language of a given file, or list of files. Uses
    476         language_map, and language_order to do the job.
    477         """
    478         if not isinstance(sources, list):
    479             sources = [sources]
    480         lang = None
    481         index = len(self.language_order)
    482         for source in sources:
    483             base, ext = os.path.splitext(source)
    484             extlang = self.language_map.get(ext)
    485             try:
    486                 extindex = self.language_order.index(extlang)
    487                 if extindex < index:
    488                     lang = extlang
    489                     index = extindex
    490             except ValueError:
    491                 pass
    492         return lang
    493 
    494 
    495     # -- Worker methods ------------------------------------------------
    496     # (must be implemented by subclasses)
    497 
    498     def preprocess(self, source, output_file=None, macros=None,
    499                    include_dirs=None, extra_preargs=None, extra_postargs=None):
    500         """Preprocess a single C/C++ source file, named in 'source'.
    501         Output will be written to file named 'output_file', or stdout if
    502         'output_file' not supplied.  'macros' is a list of macro
    503         definitions as for 'compile()', which will augment the macros set
    504         with 'define_macro()' and 'undefine_macro()'.  'include_dirs' is a
    505         list of directory names that will be added to the default list.
    506 
    507         Raises PreprocessError on failure.
    508         """
    509         pass
    510 
    511     def compile(self, sources, output_dir=None, macros=None,
    512                 include_dirs=None, debug=0, extra_preargs=None,
    513                 extra_postargs=None, depends=None):
    514         """Compile one or more source files.
    515 
    516         'sources' must be a list of filenames, most likely C/C++
    517         files, but in reality anything that can be handled by a
    518         particular compiler and compiler class (eg. MSVCCompiler can
    519         handle resource files in 'sources').  Return a list of object
    520         filenames, one per source filename in 'sources'.  Depending on
    521         the implementation, not all source files will necessarily be
    522         compiled, but all corresponding object filenames will be
    523         returned.
    524 
    525         If 'output_dir' is given, object files will be put under it, while
    526         retaining their original path component.  That is, "foo/bar.c"
    527         normally compiles to "foo/bar.o" (for a Unix implementation); if
    528         'output_dir' is "build", then it would compile to
    529         "build/foo/bar.o".
    530 
    531         'macros', if given, must be a list of macro definitions.  A macro
    532         definition is either a (name, value) 2-tuple or a (name,) 1-tuple.
    533         The former defines a macro; if the value is None, the macro is
    534         defined without an explicit value.  The 1-tuple case undefines a
    535         macro.  Later definitions/redefinitions/ undefinitions take
    536         precedence.
    537 
    538         'include_dirs', if given, must be a list of strings, the
    539         directories to add to the default include file search path for this
    540         compilation only.
    541 
    542         'debug' is a boolean; if true, the compiler will be instructed to
    543         output debug symbols in (or alongside) the object file(s).
    544 
    545         'extra_preargs' and 'extra_postargs' are implementation- dependent.
    546         On platforms that have the notion of a command-line (e.g. Unix,
    547         DOS/Windows), they are most likely lists of strings: extra
    548         command-line arguments to prepand/append to the compiler command
    549         line.  On other platforms, consult the implementation class
    550         documentation.  In any event, they are intended as an escape hatch
    551         for those occasions when the abstract compiler framework doesn't
    552         cut the mustard.
    553 
    554         'depends', if given, is a list of filenames that all targets
    555         depend on.  If a source file is older than any file in
    556         depends, then the source file will be recompiled.  This
    557         supports dependency tracking, but only at a coarse
    558         granularity.
    559 
    560         Raises CompileError on failure.
    561         """
    562         # A concrete compiler class can either override this method
    563         # entirely or implement _compile().
    564         macros, objects, extra_postargs, pp_opts, build = \
    565                 self._setup_compile(output_dir, macros, include_dirs, sources,
    566                                     depends, extra_postargs)
    567         cc_args = self._get_cc_args(pp_opts, debug, extra_preargs)
    568 
    569         for obj in objects:
    570             try:
    571                 src, ext = build[obj]
    572             except KeyError:
    573                 continue
    574             self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
    575 
    576         # Return *all* object filenames, not just the ones we just built.
    577         return objects
    578 
    579     def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
    580         """Compile 'src' to product 'obj'."""
    581         # A concrete compiler class that does not override compile()
    582         # should implement _compile().
    583         pass
    584 
    585     def create_static_lib(self, objects, output_libname, output_dir=None,
    586                           debug=0, target_lang=None):
    587         """Link a bunch of stuff together to create a static library file.
    588         The "bunch of stuff" consists of the list of object files supplied
    589         as 'objects', the extra object files supplied to
    590         'add_link_object()' and/or 'set_link_objects()', the libraries
    591         supplied to 'add_library()' and/or 'set_libraries()', and the
    592         libraries supplied as 'libraries' (if any).
    593 
    594         'output_libname' should be a library name, not a filename; the
    595         filename will be inferred from the library name.  'output_dir' is
    596         the directory where the library file will be put.
    597 
    598         'debug' is a boolean; if true, debugging information will be
    599         included in the library (note that on most platforms, it is the
    600         compile step where this matters: the 'debug' flag is included here
    601         just for consistency).
    602 
    603         'target_lang' is the target language for which the given objects
    604         are being compiled. This allows specific linkage time treatment of
    605         certain languages.
    606 
    607         Raises LibError on failure.
    608         """
    609         pass
    610 
    611 
    612     # values for target_desc parameter in link()
    613     SHARED_OBJECT = "shared_object"
    614     SHARED_LIBRARY = "shared_library"
    615     EXECUTABLE = "executable"
    616 
    617     def link(self,
    618              target_desc,
    619              objects,
    620              output_filename,
    621              output_dir=None,
    622              libraries=None,
    623              library_dirs=None,
    624              runtime_library_dirs=None,
    625              export_symbols=None,
    626              debug=0,
    627              extra_preargs=None,
    628              extra_postargs=None,
    629              build_temp=None,
    630              target_lang=None):
    631         """Link a bunch of stuff together to create an executable or
    632         shared library file.
    633 
    634         The "bunch of stuff" consists of the list of object files supplied
    635         as 'objects'.  'output_filename' should be a filename.  If
    636         'output_dir' is supplied, 'output_filename' is relative to it
    637         (i.e. 'output_filename' can provide directory components if
    638         needed).
    639 
    640         'libraries' is a list of libraries to link against.  These are
    641         library names, not filenames, since they're translated into
    642         filenames in a platform-specific way (eg. "foo" becomes "libfoo.a"
    643         on Unix and "foo.lib" on DOS/Windows).  However, they can include a
    644         directory component, which means the linker will look in that
    645         specific directory rather than searching all the normal locations.
    646 
    647         'library_dirs', if supplied, should be a list of directories to
    648         search for libraries that were specified as bare library names
    649         (ie. no directory component).  These are on top of the system
    650         default and those supplied to 'add_library_dir()' and/or
    651         'set_library_dirs()'.  'runtime_library_dirs' is a list of
    652         directories that will be embedded into the shared library and used
    653         to search for other shared libraries that *it* depends on at
    654         run-time.  (This may only be relevant on Unix.)
    655 
    656         'export_symbols' is a list of symbols that the shared library will
    657         export.  (This appears to be relevant only on Windows.)
    658 
    659         'debug' is as for 'compile()' and 'create_static_lib()', with the
    660         slight distinction that it actually matters on most platforms (as
    661         opposed to 'create_static_lib()', which includes a 'debug' flag
    662         mostly for form's sake).
    663 
    664         'extra_preargs' and 'extra_postargs' are as for 'compile()' (except
    665         of course that they supply command-line arguments for the
    666         particular linker being used).
    667 
    668         'target_lang' is the target language for which the given objects
    669         are being compiled. This allows specific linkage time treatment of
    670         certain languages.
    671 
    672         Raises LinkError on failure.
    673         """
    674         raise NotImplementedError
    675 
    676 
    677     # Old 'link_*()' methods, rewritten to use the new 'link()' method.
    678 
    679     def link_shared_lib(self,
    680                         objects,
    681                         output_libname,
    682                         output_dir=None,
    683                         libraries=None,
    684                         library_dirs=None,
    685                         runtime_library_dirs=None,
    686                         export_symbols=None,
    687                         debug=0,
    688                         extra_preargs=None,
    689                         extra_postargs=None,
    690                         build_temp=None,
    691                         target_lang=None):
    692         self.link(CCompiler.SHARED_LIBRARY, objects,
    693                   self.library_filename(output_libname, lib_type='shared'),
    694                   output_dir,
    695                   libraries, library_dirs, runtime_library_dirs,
    696                   export_symbols, debug,
    697                   extra_preargs, extra_postargs, build_temp, target_lang)
    698 
    699 
    700     def link_shared_object(self,
    701                            objects,
    702                            output_filename,
    703                            output_dir=None,
    704                            libraries=None,
    705                            library_dirs=None,
    706                            runtime_library_dirs=None,
    707                            export_symbols=None,
    708                            debug=0,
    709                            extra_preargs=None,
    710                            extra_postargs=None,
    711                            build_temp=None,
    712                            target_lang=None):
    713         self.link(CCompiler.SHARED_OBJECT, objects,
    714                   output_filename, output_dir,
    715                   libraries, library_dirs, runtime_library_dirs,
    716                   export_symbols, debug,
    717                   extra_preargs, extra_postargs, build_temp, target_lang)
    718 
    719 
    720     def link_executable(self,
    721                         objects,
    722                         output_progname,
    723                         output_dir=None,
    724                         libraries=None,
    725                         library_dirs=None,
    726                         runtime_library_dirs=None,
    727                         debug=0,
    728                         extra_preargs=None,
    729                         extra_postargs=None,
    730                         target_lang=None):
    731         self.link(CCompiler.EXECUTABLE, objects,
    732                   self.executable_filename(output_progname), output_dir,
    733                   libraries, library_dirs, runtime_library_dirs, None,
    734                   debug, extra_preargs, extra_postargs, None, target_lang)
    735 
    736 
    737     # -- Miscellaneous methods -----------------------------------------
    738     # These are all used by the 'gen_lib_options() function; there is
    739     # no appropriate default implementation so subclasses should
    740     # implement all of these.
    741 
    742     def library_dir_option(self, dir):
    743         """Return the compiler option to add 'dir' to the list of
    744         directories searched for libraries.
    745         """
    746         raise NotImplementedError
    747 
    748     def runtime_library_dir_option(self, dir):
    749         """Return the compiler option to add 'dir' to the list of
    750         directories searched for runtime libraries.
    751         """
    752         raise NotImplementedError
    753 
    754     def library_option(self, lib):
    755         """Return the compiler option to add 'lib' to the list of libraries
    756         linked into the shared library or executable.
    757         """
    758         raise NotImplementedError
    759 
    760     def has_function(self, funcname, includes=None, include_dirs=None,
    761                      libraries=None, library_dirs=None):
    762         """Return a boolean indicating whether funcname is supported on
    763         the current platform.  The optional arguments can be used to
    764         augment the compilation environment.
    765         """
    766         # this can't be included at module scope because it tries to
    767         # import math which might not be available at that point - maybe
    768         # the necessary logic should just be inlined?
    769         import tempfile
    770         if includes is None:
    771             includes = []
    772         if include_dirs is None:
    773             include_dirs = []
    774         if libraries is None:
    775             libraries = []
    776         if library_dirs is None:
    777             library_dirs = []
    778         fd, fname = tempfile.mkstemp(".c", funcname, text=True)
    779         f = os.fdopen(fd, "w")
    780         try:
    781             for incl in includes:
    782                 f.write("""#include "%s"\n""" % incl)
    783             f.write("""\
    784 main (int argc, char **argv) {
    785     %s();
    786 }
    787 """ % funcname)
    788         finally:
    789             f.close()
    790         try:
    791             objects = self.compile([fname], include_dirs=include_dirs)
    792         except CompileError:
    793             return False
    794 
    795         try:
    796             self.link_executable(objects, "a.out",
    797                                  libraries=libraries,
    798                                  library_dirs=library_dirs)
    799         except (LinkError, TypeError):
    800             return False
    801         return True
    802 
    803     def find_library_file (self, dirs, lib, debug=0):
    804         """Search the specified list of directories for a static or shared
    805         library file 'lib' and return the full path to that file.  If
    806         'debug' true, look for a debugging version (if that makes sense on
    807         the current platform).  Return None if 'lib' wasn't found in any of
    808         the specified directories.
    809         """
    810         raise NotImplementedError
    811 
    812     # -- Filename generation methods -----------------------------------
    813 
    814     # The default implementation of the filename generating methods are
    815     # prejudiced towards the Unix/DOS/Windows view of the world:
    816     #   * object files are named by replacing the source file extension
    817     #     (eg. .c/.cpp -> .o/.obj)
    818     #   * library files (shared or static) are named by plugging the
    819     #     library name and extension into a format string, eg.
    820     #     "lib%s.%s" % (lib_name, ".a") for Unix static libraries
    821     #   * executables are named by appending an extension (possibly
    822     #     empty) to the program name: eg. progname + ".exe" for
    823     #     Windows
    824     #
    825     # To reduce redundant code, these methods expect to find
    826     # several attributes in the current object (presumably defined
    827     # as class attributes):
    828     #   * src_extensions -
    829     #     list of C/C++ source file extensions, eg. ['.c', '.cpp']
    830     #   * obj_extension -
    831     #     object file extension, eg. '.o' or '.obj'
    832     #   * static_lib_extension -
    833     #     extension for static library files, eg. '.a' or '.lib'
    834     #   * shared_lib_extension -
    835     #     extension for shared library/object files, eg. '.so', '.dll'
    836     #   * static_lib_format -
    837     #     format string for generating static library filenames,
    838     #     eg. 'lib%s.%s' or '%s.%s'
    839     #   * shared_lib_format
    840     #     format string for generating shared library filenames
    841     #     (probably same as static_lib_format, since the extension
    842     #     is one of the intended parameters to the format string)
    843     #   * exe_extension -
    844     #     extension for executable files, eg. '' or '.exe'
    845 
    846     def object_filenames(self, source_filenames, strip_dir=0, output_dir=''):
    847         if output_dir is None:
    848             output_dir = ''
    849         obj_names = []
    850         for src_name in source_filenames:
    851             base, ext = os.path.splitext(src_name)
    852             base = os.path.splitdrive(base)[1] # Chop off the drive
    853             base = base[os.path.isabs(base):]  # If abs, chop off leading /
    854             if ext not in self.src_extensions:
    855                 raise UnknownFileError(
    856                       "unknown file type '%s' (from '%s')" % (ext, src_name))
    857             if strip_dir:
    858                 base = os.path.basename(base)
    859             obj_names.append(os.path.join(output_dir,
    860                                           base + self.obj_extension))
    861         return obj_names
    862 
    863     def shared_object_filename(self, basename, strip_dir=0, output_dir=''):
    864         assert output_dir is not None
    865         if strip_dir:
    866             basename = os.path.basename(basename)
    867         return os.path.join(output_dir, basename + self.shared_lib_extension)
    868 
    869     def executable_filename(self, basename, strip_dir=0, output_dir=''):
    870         assert output_dir is not None
    871         if strip_dir:
    872             basename = os.path.basename(basename)
    873         return os.path.join(output_dir, basename + (self.exe_extension or ''))
    874 
    875     def library_filename(self, libname, lib_type='static',     # or 'shared'
    876                          strip_dir=0, output_dir=''):
    877         assert output_dir is not None
    878         if lib_type not in ("static", "shared", "dylib", "xcode_stub"):
    879             raise ValueError(
    880                   "'lib_type' must be \"static\", \"shared\", \"dylib\", or \"xcode_stub\"")
    881         fmt = getattr(self, lib_type + "_lib_format")
    882         ext = getattr(self, lib_type + "_lib_extension")
    883 
    884         dir, base = os.path.split(libname)
    885         filename = fmt % (base, ext)
    886         if strip_dir:
    887             dir = ''
    888 
    889         return os.path.join(output_dir, dir, filename)
    890 
    891 
    892     # -- Utility methods -----------------------------------------------
    893 
    894     def announce(self, msg, level=1):
    895         log.debug(msg)
    896 
    897     def debug_print(self, msg):
    898         from distutils.debug import DEBUG
    899         if DEBUG:
    900             print(msg)
    901 
    902     def warn(self, msg):
    903         sys.stderr.write("warning: %s\n" % msg)
    904 
    905     def execute(self, func, args, msg=None, level=1):
    906         execute(func, args, msg, self.dry_run)
    907 
    908     def spawn(self, cmd):
    909         spawn(cmd, dry_run=self.dry_run)
    910 
    911     def move_file(self, src, dst):
    912         return move_file(src, dst, dry_run=self.dry_run)
    913 
    914     def mkpath (self, name, mode=0o777):
    915         mkpath(name, mode, dry_run=self.dry_run)
    916 
    917 
    918 # Map a sys.platform/os.name ('posix', 'nt') to the default compiler
    919 # type for that platform. Keys are interpreted as re match
    920 # patterns. Order is important; platform mappings are preferred over
    921 # OS names.
    922 _default_compilers = (
    923 
    924     # Platform string mappings
    925 
    926     # on a cygwin built python we can use gcc like an ordinary UNIXish
    927     # compiler
    928     ('cygwin.*', 'unix'),
    929 
    930     # OS name mappings
    931     ('posix', 'unix'),
    932     ('nt', 'msvc'),
    933 
    934     )
    935 
    936 def get_default_compiler(osname=None, platform=None):
    937     """Determine the default compiler to use for the given platform.
    938 
    939        osname should be one of the standard Python OS names (i.e. the
    940        ones returned by os.name) and platform the common value
    941        returned by sys.platform for the platform in question.
    942 
    943        The default values are os.name and sys.platform in case the
    944        parameters are not given.
    945     """
    946     if osname is None:
    947         osname = os.name
    948     if platform is None:
    949         platform = sys.platform
    950     for pattern, compiler in _default_compilers:
    951         if re.match(pattern, platform) is not None or \
    952            re.match(pattern, osname) is not None:
    953             return compiler
    954     # Default to Unix compiler
    955     return 'unix'
    956 
    957 # Map compiler types to (module_name, class_name) pairs -- ie. where to
    958 # find the code that implements an interface to this compiler.  (The module
    959 # is assumed to be in the 'distutils' package.)
    960 compiler_class = { 'unix':    ('unixccompiler', 'UnixCCompiler',
    961                                "standard UNIX-style compiler"),
    962                    'msvc':    ('_msvccompiler', 'MSVCCompiler',
    963                                "Microsoft Visual C++"),
    964                    'cygwin':  ('cygwinccompiler', 'CygwinCCompiler',
    965                                "Cygwin port of GNU C Compiler for Win32"),
    966                    'mingw32': ('cygwinccompiler', 'Mingw32CCompiler',
    967                                "Mingw32 port of GNU C Compiler for Win32"),
    968                    'bcpp':    ('bcppcompiler', 'BCPPCompiler',
    969                                "Borland C++ Compiler"),
    970                  }
    971 
    972 def show_compilers():
    973     """Print list of available compilers (used by the "--help-compiler"
    974     options to "build", "build_ext", "build_clib").
    975     """
    976     # XXX this "knows" that the compiler option it's describing is
    977     # "--compiler", which just happens to be the case for the three
    978     # commands that use it.
    979     from distutils.fancy_getopt import FancyGetopt
    980     compilers = []
    981     for compiler in compiler_class.keys():
    982         compilers.append(("compiler="+compiler, None,
    983                           compiler_class[compiler][2]))
    984     compilers.sort()
    985     pretty_printer = FancyGetopt(compilers)
    986     pretty_printer.print_help("List of available compilers:")
    987 
    988 
    989 def new_compiler(plat=None, compiler=None, verbose=0, dry_run=0, force=0):
    990     """Generate an instance of some CCompiler subclass for the supplied
    991     platform/compiler combination.  'plat' defaults to 'os.name'
    992     (eg. 'posix', 'nt'), and 'compiler' defaults to the default compiler
    993     for that platform.  Currently only 'posix' and 'nt' are supported, and
    994     the default compilers are "traditional Unix interface" (UnixCCompiler
    995     class) and Visual C++ (MSVCCompiler class).  Note that it's perfectly
    996     possible to ask for a Unix compiler object under Windows, and a
    997     Microsoft compiler object under Unix -- if you supply a value for
    998     'compiler', 'plat' is ignored.
    999     """
   1000     if plat is None:
   1001         plat = os.name
   1002 
   1003     try:
   1004         if compiler is None:
   1005             compiler = get_default_compiler(plat)
   1006 
   1007         (module_name, class_name, long_description) = compiler_class[compiler]
   1008     except KeyError:
   1009         msg = "don't know how to compile C/C++ code on platform '%s'" % plat
   1010         if compiler is not None:
   1011             msg = msg + " with '%s' compiler" % compiler
   1012         raise DistutilsPlatformError(msg)
   1013 
   1014     try:
   1015         module_name = "distutils." + module_name
   1016         __import__ (module_name)
   1017         module = sys.modules[module_name]
   1018         klass = vars(module)[class_name]
   1019     except ImportError:
   1020         raise DistutilsModuleError(
   1021               "can't compile C/C++ code: unable to load module '%s'" % \
   1022               module_name)
   1023     except KeyError:
   1024         raise DistutilsModuleError(
   1025                "can't compile C/C++ code: unable to find class '%s' "
   1026                "in module '%s'" % (class_name, module_name))
   1027 
   1028     # XXX The None is necessary to preserve backwards compatibility
   1029     # with classes that expect verbose to be the first positional
   1030     # argument.
   1031     return klass(None, dry_run, force)
   1032 
   1033 
   1034 def gen_preprocess_options(macros, include_dirs):
   1035     """Generate C pre-processor options (-D, -U, -I) as used by at least
   1036     two types of compilers: the typical Unix compiler and Visual C++.
   1037     'macros' is the usual thing, a list of 1- or 2-tuples, where (name,)
   1038     means undefine (-U) macro 'name', and (name,value) means define (-D)
   1039     macro 'name' to 'value'.  'include_dirs' is just a list of directory
   1040     names to be added to the header file search path (-I).  Returns a list
   1041     of command-line options suitable for either Unix compilers or Visual
   1042     C++.
   1043     """
   1044     # XXX it would be nice (mainly aesthetic, and so we don't generate
   1045     # stupid-looking command lines) to go over 'macros' and eliminate
   1046     # redundant definitions/undefinitions (ie. ensure that only the
   1047     # latest mention of a particular macro winds up on the command
   1048     # line).  I don't think it's essential, though, since most (all?)
   1049     # Unix C compilers only pay attention to the latest -D or -U
   1050     # mention of a macro on their command line.  Similar situation for
   1051     # 'include_dirs'.  I'm punting on both for now.  Anyways, weeding out
   1052     # redundancies like this should probably be the province of
   1053     # CCompiler, since the data structures used are inherited from it
   1054     # and therefore common to all CCompiler classes.
   1055     pp_opts = []
   1056     for macro in macros:
   1057         if not (isinstance(macro, tuple) and 1 <= len(macro) <= 2):
   1058             raise TypeError(
   1059                   "bad macro definition '%s': "
   1060                   "each element of 'macros' list must be a 1- or 2-tuple"
   1061                   % macro)
   1062 
   1063         if len(macro) == 1:        # undefine this macro
   1064             pp_opts.append("-U%s" % macro[0])
   1065         elif len(macro) == 2:
   1066             if macro[1] is None:    # define with no explicit value
   1067                 pp_opts.append("-D%s" % macro[0])
   1068             else:
   1069                 # XXX *don't* need to be clever about quoting the
   1070                 # macro value here, because we're going to avoid the
   1071                 # shell at all costs when we spawn the command!
   1072                 pp_opts.append("-D%s=%s" % macro)
   1073 
   1074     for dir in include_dirs:
   1075         pp_opts.append("-I%s" % dir)
   1076     return pp_opts
   1077 
   1078 
   1079 def gen_lib_options (compiler, library_dirs, runtime_library_dirs, libraries):
   1080     """Generate linker options for searching library directories and
   1081     linking with specific libraries.  'libraries' and 'library_dirs' are,
   1082     respectively, lists of library names (not filenames!) and search
   1083     directories.  Returns a list of command-line options suitable for use
   1084     with some compiler (depending on the two format strings passed in).
   1085     """
   1086     lib_opts = []
   1087 
   1088     for dir in library_dirs:
   1089         lib_opts.append(compiler.library_dir_option(dir))
   1090 
   1091     for dir in runtime_library_dirs:
   1092         opt = compiler.runtime_library_dir_option(dir)
   1093         if isinstance(opt, list):
   1094             lib_opts = lib_opts + opt
   1095         else:
   1096             lib_opts.append(opt)
   1097 
   1098     # XXX it's important that we *not* remove redundant library mentions!
   1099     # sometimes you really do have to say "-lfoo -lbar -lfoo" in order to
   1100     # resolve all symbols.  I just hope we never have to say "-lfoo obj.o
   1101     # -lbar" to get things to work -- that's certainly a possibility, but a
   1102     # pretty nasty way to arrange your C code.
   1103 
   1104     for lib in libraries:
   1105         (lib_dir, lib_name) = os.path.split(lib)
   1106         if lib_dir:
   1107             lib_file = compiler.find_library_file([lib_dir], lib_name)
   1108             if lib_file:
   1109                 lib_opts.append(lib_file)
   1110             else:
   1111                 compiler.warn("no library file corresponding to "
   1112                               "'%s' found (skipping)" % lib)
   1113         else:
   1114             lib_opts.append(compiler.library_option (lib))
   1115     return lib_opts
   1116