python (3.11.7)
       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_group
      12  from distutils.util import split_quoted, execute
      13  from distutils import log
      14  
      15  class ESC[4;38;5;81mCCompiler:
      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 source 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 prepend/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  int main (int argc, char **argv) {
     785      %s();
     786      return 0;
     787  }
     788  """ % funcname)
     789          finally:
     790              f.close()
     791          try:
     792              objects = self.compile([fname], include_dirs=include_dirs)
     793          except CompileError:
     794              return False
     795  
     796          try:
     797              self.link_executable(objects, "a.out",
     798                                   libraries=libraries,
     799                                   library_dirs=library_dirs)
     800          except (LinkError, TypeError):
     801              return False
     802          return True
     803  
     804      def find_library_file (self, dirs, lib, debug=0):
     805          """Search the specified list of directories for a static or shared
     806          library file 'lib' and return the full path to that file.  If
     807          'debug' true, look for a debugging version (if that makes sense on
     808          the current platform).  Return None if 'lib' wasn't found in any of
     809          the specified directories.
     810          """
     811          raise NotImplementedError
     812  
     813      # -- Filename generation methods -----------------------------------
     814  
     815      # The default implementation of the filename generating methods are
     816      # prejudiced towards the Unix/DOS/Windows view of the world:
     817      #   * object files are named by replacing the source file extension
     818      #     (eg. .c/.cpp -> .o/.obj)
     819      #   * library files (shared or static) are named by plugging the
     820      #     library name and extension into a format string, eg.
     821      #     "lib%s.%s" % (lib_name, ".a") for Unix static libraries
     822      #   * executables are named by appending an extension (possibly
     823      #     empty) to the program name: eg. progname + ".exe" for
     824      #     Windows
     825      #
     826      # To reduce redundant code, these methods expect to find
     827      # several attributes in the current object (presumably defined
     828      # as class attributes):
     829      #   * src_extensions -
     830      #     list of C/C++ source file extensions, eg. ['.c', '.cpp']
     831      #   * obj_extension -
     832      #     object file extension, eg. '.o' or '.obj'
     833      #   * static_lib_extension -
     834      #     extension for static library files, eg. '.a' or '.lib'
     835      #   * shared_lib_extension -
     836      #     extension for shared library/object files, eg. '.so', '.dll'
     837      #   * static_lib_format -
     838      #     format string for generating static library filenames,
     839      #     eg. 'lib%s.%s' or '%s.%s'
     840      #   * shared_lib_format
     841      #     format string for generating shared library filenames
     842      #     (probably same as static_lib_format, since the extension
     843      #     is one of the intended parameters to the format string)
     844      #   * exe_extension -
     845      #     extension for executable files, eg. '' or '.exe'
     846  
     847      def object_filenames(self, source_filenames, strip_dir=0, output_dir=''):
     848          if output_dir is None:
     849              output_dir = ''
     850          obj_names = []
     851          for src_name in source_filenames:
     852              base, ext = os.path.splitext(src_name)
     853              base = os.path.splitdrive(base)[1] # Chop off the drive
     854              base = base[os.path.isabs(base):]  # If abs, chop off leading /
     855              if ext not in self.src_extensions:
     856                  raise UnknownFileError(
     857                        "unknown file type '%s' (from '%s')" % (ext, src_name))
     858              if strip_dir:
     859                  base = os.path.basename(base)
     860              obj_names.append(os.path.join(output_dir,
     861                                            base + self.obj_extension))
     862          return obj_names
     863  
     864      def shared_object_filename(self, basename, strip_dir=0, output_dir=''):
     865          assert output_dir is not None
     866          if strip_dir:
     867              basename = os.path.basename(basename)
     868          return os.path.join(output_dir, basename + self.shared_lib_extension)
     869  
     870      def executable_filename(self, basename, strip_dir=0, output_dir=''):
     871          assert output_dir is not None
     872          if strip_dir:
     873              basename = os.path.basename(basename)
     874          return os.path.join(output_dir, basename + (self.exe_extension or ''))
     875  
     876      def library_filename(self, libname, lib_type='static',     # or 'shared'
     877                           strip_dir=0, output_dir=''):
     878          assert output_dir is not None
     879          if lib_type not in ("static", "shared", "dylib", "xcode_stub"):
     880              raise ValueError(
     881                    "'lib_type' must be \"static\", \"shared\", \"dylib\", or \"xcode_stub\"")
     882          fmt = getattr(self, lib_type + "_lib_format")
     883          ext = getattr(self, lib_type + "_lib_extension")
     884  
     885          dir, base = os.path.split(libname)
     886          filename = fmt % (base, ext)
     887          if strip_dir:
     888              dir = ''
     889  
     890          return os.path.join(output_dir, dir, filename)
     891  
     892  
     893      # -- Utility methods -----------------------------------------------
     894  
     895      def announce(self, msg, level=1):
     896          log.debug(msg)
     897  
     898      def debug_print(self, msg):
     899          from distutils.debug import DEBUG
     900          if DEBUG:
     901              print(msg)
     902  
     903      def warn(self, msg):
     904          sys.stderr.write("warning: %s\n" % msg)
     905  
     906      def execute(self, func, args, msg=None, level=1):
     907          execute(func, args, msg, self.dry_run)
     908  
     909      def spawn(self, cmd):
     910          spawn(cmd, dry_run=self.dry_run)
     911  
     912      def move_file(self, src, dst):
     913          return move_file(src, dst, dry_run=self.dry_run)
     914  
     915      def mkpath (self, name, mode=0o777):
     916          mkpath(name, mode, dry_run=self.dry_run)
     917  
     918  
     919  # Map a sys.platform/os.name ('posix', 'nt') to the default compiler
     920  # type for that platform. Keys are interpreted as re match
     921  # patterns. Order is important; platform mappings are preferred over
     922  # OS names.
     923  _default_compilers = (
     924  
     925      # Platform string mappings
     926  
     927      # on a cygwin built python we can use gcc like an ordinary UNIXish
     928      # compiler
     929      ('cygwin.*', 'unix'),
     930  
     931      # OS name mappings
     932      ('posix', 'unix'),
     933      ('nt', 'msvc'),
     934  
     935      )
     936  
     937  def get_default_compiler(osname=None, platform=None):
     938      """Determine the default compiler to use for the given platform.
     939  
     940         osname should be one of the standard Python OS names (i.e. the
     941         ones returned by os.name) and platform the common value
     942         returned by sys.platform for the platform in question.
     943  
     944         The default values are os.name and sys.platform in case the
     945         parameters are not given.
     946      """
     947      if osname is None:
     948          osname = os.name
     949      if platform is None:
     950          platform = sys.platform
     951      for pattern, compiler in _default_compilers:
     952          if re.match(pattern, platform) is not None or \
     953             re.match(pattern, osname) is not None:
     954              return compiler
     955      # Default to Unix compiler
     956      return 'unix'
     957  
     958  # Map compiler types to (module_name, class_name) pairs -- ie. where to
     959  # find the code that implements an interface to this compiler.  (The module
     960  # is assumed to be in the 'distutils' package.)
     961  compiler_class = { 'unix':    ('unixccompiler', 'UnixCCompiler',
     962                                 "standard UNIX-style compiler"),
     963                     'msvc':    ('_msvccompiler', 'MSVCCompiler',
     964                                 "Microsoft Visual C++"),
     965                     'cygwin':  ('cygwinccompiler', 'CygwinCCompiler',
     966                                 "Cygwin port of GNU C Compiler for Win32"),
     967                     'mingw32': ('cygwinccompiler', 'Mingw32CCompiler',
     968                                 "Mingw32 port of GNU C Compiler for Win32"),
     969                     'bcpp':    ('bcppcompiler', 'BCPPCompiler',
     970                                 "Borland C++ Compiler"),
     971                   }
     972  
     973  def show_compilers():
     974      """Print list of available compilers (used by the "--help-compiler"
     975      options to "build", "build_ext", "build_clib").
     976      """
     977      # XXX this "knows" that the compiler option it's describing is
     978      # "--compiler", which just happens to be the case for the three
     979      # commands that use it.
     980      from distutils.fancy_getopt import FancyGetopt
     981      compilers = []
     982      for compiler in compiler_class.keys():
     983          compilers.append(("compiler="+compiler, None,
     984                            compiler_class[compiler][2]))
     985      compilers.sort()
     986      pretty_printer = FancyGetopt(compilers)
     987      pretty_printer.print_help("List of available compilers:")
     988  
     989  
     990  def new_compiler(plat=None, compiler=None, verbose=0, dry_run=0, force=0):
     991      """Generate an instance of some CCompiler subclass for the supplied
     992      platform/compiler combination.  'plat' defaults to 'os.name'
     993      (eg. 'posix', 'nt'), and 'compiler' defaults to the default compiler
     994      for that platform.  Currently only 'posix' and 'nt' are supported, and
     995      the default compilers are "traditional Unix interface" (UnixCCompiler
     996      class) and Visual C++ (MSVCCompiler class).  Note that it's perfectly
     997      possible to ask for a Unix compiler object under Windows, and a
     998      Microsoft compiler object under Unix -- if you supply a value for
     999      'compiler', 'plat' is ignored.
    1000      """
    1001      if plat is None:
    1002          plat = os.name
    1003  
    1004      try:
    1005          if compiler is None:
    1006              compiler = get_default_compiler(plat)
    1007  
    1008          (module_name, class_name, long_description) = compiler_class[compiler]
    1009      except KeyError:
    1010          msg = "don't know how to compile C/C++ code on platform '%s'" % plat
    1011          if compiler is not None:
    1012              msg = msg + " with '%s' compiler" % compiler
    1013          raise DistutilsPlatformError(msg)
    1014  
    1015      try:
    1016          module_name = "distutils." + module_name
    1017          __import__ (module_name)
    1018          module = sys.modules[module_name]
    1019          klass = vars(module)[class_name]
    1020      except ImportError:
    1021          raise DistutilsModuleError(
    1022                "can't compile C/C++ code: unable to load module '%s'" % \
    1023                module_name)
    1024      except KeyError:
    1025          raise DistutilsModuleError(
    1026                 "can't compile C/C++ code: unable to find class '%s' "
    1027                 "in module '%s'" % (class_name, module_name))
    1028  
    1029      # XXX The None is necessary to preserve backwards compatibility
    1030      # with classes that expect verbose to be the first positional
    1031      # argument.
    1032      return klass(None, dry_run, force)
    1033  
    1034  
    1035  def gen_preprocess_options(macros, include_dirs):
    1036      """Generate C pre-processor options (-D, -U, -I) as used by at least
    1037      two types of compilers: the typical Unix compiler and Visual C++.
    1038      'macros' is the usual thing, a list of 1- or 2-tuples, where (name,)
    1039      means undefine (-U) macro 'name', and (name,value) means define (-D)
    1040      macro 'name' to 'value'.  'include_dirs' is just a list of directory
    1041      names to be added to the header file search path (-I).  Returns a list
    1042      of command-line options suitable for either Unix compilers or Visual
    1043      C++.
    1044      """
    1045      # XXX it would be nice (mainly aesthetic, and so we don't generate
    1046      # stupid-looking command lines) to go over 'macros' and eliminate
    1047      # redundant definitions/undefinitions (ie. ensure that only the
    1048      # latest mention of a particular macro winds up on the command
    1049      # line).  I don't think it's essential, though, since most (all?)
    1050      # Unix C compilers only pay attention to the latest -D or -U
    1051      # mention of a macro on their command line.  Similar situation for
    1052      # 'include_dirs'.  I'm punting on both for now.  Anyways, weeding out
    1053      # redundancies like this should probably be the province of
    1054      # CCompiler, since the data structures used are inherited from it
    1055      # and therefore common to all CCompiler classes.
    1056      pp_opts = []
    1057      for macro in macros:
    1058          if not (isinstance(macro, tuple) and 1 <= len(macro) <= 2):
    1059              raise TypeError(
    1060                    "bad macro definition '%s': "
    1061                    "each element of 'macros' list must be a 1- or 2-tuple"
    1062                    % macro)
    1063  
    1064          if len(macro) == 1:        # undefine this macro
    1065              pp_opts.append("-U%s" % macro[0])
    1066          elif len(macro) == 2:
    1067              if macro[1] is None:    # define with no explicit value
    1068                  pp_opts.append("-D%s" % macro[0])
    1069              else:
    1070                  # XXX *don't* need to be clever about quoting the
    1071                  # macro value here, because we're going to avoid the
    1072                  # shell at all costs when we spawn the command!
    1073                  pp_opts.append("-D%s=%s" % macro)
    1074  
    1075      for dir in include_dirs:
    1076          pp_opts.append("-I%s" % dir)
    1077      return pp_opts
    1078  
    1079  
    1080  def gen_lib_options (compiler, library_dirs, runtime_library_dirs, libraries):
    1081      """Generate linker options for searching library directories and
    1082      linking with specific libraries.  'libraries' and 'library_dirs' are,
    1083      respectively, lists of library names (not filenames!) and search
    1084      directories.  Returns a list of command-line options suitable for use
    1085      with some compiler (depending on the two format strings passed in).
    1086      """
    1087      lib_opts = []
    1088  
    1089      for dir in library_dirs:
    1090          lib_opts.append(compiler.library_dir_option(dir))
    1091  
    1092      for dir in runtime_library_dirs:
    1093          opt = compiler.runtime_library_dir_option(dir)
    1094          if isinstance(opt, list):
    1095              lib_opts = lib_opts + opt
    1096          else:
    1097              lib_opts.append(opt)
    1098  
    1099      # XXX it's important that we *not* remove redundant library mentions!
    1100      # sometimes you really do have to say "-lfoo -lbar -lfoo" in order to
    1101      # resolve all symbols.  I just hope we never have to say "-lfoo obj.o
    1102      # -lbar" to get things to work -- that's certainly a possibility, but a
    1103      # pretty nasty way to arrange your C code.
    1104  
    1105      for lib in libraries:
    1106          (lib_dir, lib_name) = os.path.split(lib)
    1107          if lib_dir:
    1108              lib_file = compiler.find_library_file([lib_dir], lib_name)
    1109              if lib_file:
    1110                  lib_opts.append(lib_file)
    1111              else:
    1112                  compiler.warn("no library file corresponding to "
    1113                                "'%s' found (skipping)" % lib)
    1114          else:
    1115              lib_opts.append(compiler.library_option (lib))
    1116      return lib_opts