blob: 38c4ae8ec59035a3fe66e76b9aa6519bc5fdb2d6 [file] [log] [blame]
Greg Ward3f81cf71999-07-10 02:03:53 +00001"""distutils.ccompiler
2
3Contains CCompiler, an abstract base class that defines the interface
4for the Distutils compiler abstraction model."""
5
Greg Ward3ce77fd2000-03-02 01:49:45 +00006__revision__ = "$Id$"
Greg Ward3f81cf71999-07-10 02:03:53 +00007
Tarek Ziadé88e2c5d2009-12-21 01:49:00 +00008import sys
9import os
10import re
11
12from distutils.errors import CompileError, LinkError, UnknownFileError
Greg Warde1aaaa61999-08-14 23:50:50 +000013from distutils.spawn import spawn
Greg Warde5c62bf2000-06-25 02:08:18 +000014from distutils.file_util import move_file
15from distutils.dir_util import mkpath
16from distutils.dep_util import newer_pairwise, newer_group
Greg Ward9dddbb42000-08-02 01:38:20 +000017from distutils.util import split_quoted, execute
Jeremy Hyltoncd8a1142002-06-04 20:14:43 +000018from distutils import log
Greg Ward3f81cf71999-07-10 02:03:53 +000019
20class CCompiler:
21 """Abstract base class to define the interface that must be implemented
Greg Wardc3a43b42000-06-24 18:10:48 +000022 by real compiler classes. Also has some utility methods used by
23 several compiler classes.
Greg Ward3f81cf71999-07-10 02:03:53 +000024
Greg Wardc3a43b42000-06-24 18:10:48 +000025 The basic idea behind a compiler abstraction class is that each
26 instance can be used for all the compile/link steps in building a
27 single project. Thus, attributes common to all of those compile and
28 link steps -- include directories, macros to define, libraries to link
29 against, etc. -- are attributes of the compiler instance. To allow for
30 variability in how individual files are treated, most of those
31 attributes may be varied on a per-compilation or per-link basis.
32 """
Greg Ward3f81cf71999-07-10 02:03:53 +000033
Greg Ward802d6b71999-09-29 12:20:55 +000034 # 'compiler_type' is a class attribute that identifies this class. It
35 # keeps code that wants to know what kind of compiler it's dealing with
36 # from having to import all possible compiler classes just to do an
37 # 'isinstance'. In concrete CCompiler subclasses, 'compiler_type'
38 # should really, really be one of the keys of the 'compiler_class'
39 # dictionary (see below -- used by the 'new_compiler()' factory
40 # function) -- authors of new compiler interface classes are
41 # responsible for updating 'compiler_class'!
42 compiler_type = None
Greg Ward3f81cf71999-07-10 02:03:53 +000043
44 # XXX things not handled by this compiler abstraction model:
45 # * client can't provide additional options for a compiler,
46 # e.g. warning, optimization, debugging flags. Perhaps this
47 # should be the domain of concrete compiler abstraction classes
48 # (UnixCCompiler, MSVCCompiler, etc.) -- or perhaps the base
49 # class should have methods for the common ones.
Greg Ward3f81cf71999-07-10 02:03:53 +000050 # * can't completely override the include or library searchg
51 # path, ie. no "cc -I -Idir1 -Idir2" or "cc -L -Ldir1 -Ldir2".
Greg Warde1aaaa61999-08-14 23:50:50 +000052 # I'm not sure how widely supported this is even by Unix
Greg Ward3f81cf71999-07-10 02:03:53 +000053 # compilers, much less on other platforms. And I'm even less
Greg Warde1aaaa61999-08-14 23:50:50 +000054 # sure how useful it is; maybe for cross-compiling, but
55 # support for that is a ways off. (And anyways, cross
56 # compilers probably have a dedicated binary with the
57 # right paths compiled in. I hope.)
Greg Ward3f81cf71999-07-10 02:03:53 +000058 # * can't do really freaky things with the library list/library
59 # dirs, e.g. "-Ldir1 -lfoo -Ldir2 -lfoo" to link against
60 # different versions of libfoo.a in different locations. I
61 # think this is useless without the ability to null out the
62 # library search path anyways.
Fred Drakeb94b8492001-12-06 20:51:35 +000063
Greg Ward3f81cf71999-07-10 02:03:53 +000064
Greg Ward32c4a8a2000-03-06 03:40:29 +000065 # Subclasses that rely on the standard filename generation methods
66 # implemented below should override these; see the comment near
67 # those methods ('object_filenames()' et. al.) for details:
68 src_extensions = None # list of strings
69 obj_extension = None # string
70 static_lib_extension = None
71 shared_lib_extension = None # string
72 static_lib_format = None # format string
73 shared_lib_format = None # prob. same as static_lib_format
74 exe_extension = None # string
75
Gustavo Niemeyer6b016852002-11-05 16:12:02 +000076 # Default language settings. language_map is used to detect a source
77 # file or Extension target language, checking source filenames.
78 # language_order is used to detect the language precedence, when deciding
79 # what language to use when mixing source types. For example, if some
80 # extension has two files with ".c" extension, and one with ".cpp", it
81 # is still linked as c++.
82 language_map = {".c" : "c",
83 ".cc" : "c++",
84 ".cpp" : "c++",
85 ".cxx" : "c++",
86 ".m" : "objc",
87 }
88 language_order = ["c++", "objc", "c"]
Greg Ward32c4a8a2000-03-06 03:40:29 +000089
Collin Winter5b7e9d72007-08-30 03:52:21 +000090 def __init__(self, verbose=0, dry_run=0, force=0):
Greg Warde1aaaa61999-08-14 23:50:50 +000091 self.dry_run = dry_run
Greg Ward3febd601999-10-03 20:41:02 +000092 self.force = force
Skip Montanaro70e1d9b2002-10-01 17:39:59 +000093 self.verbose = verbose
Greg Ward3f81cf71999-07-10 02:03:53 +000094
Greg Ward9b17cb51999-09-13 03:07:24 +000095 # 'output_dir': a common output directory for object, library,
96 # shared object, and shared library files
97 self.output_dir = None
98
Greg Ward3f81cf71999-07-10 02:03:53 +000099 # 'macros': a list of macro definitions (or undefinitions). A
100 # macro definition is a 2-tuple (name, value), where the value is
101 # either a string or None (no explicit value). A macro
102 # undefinition is a 1-tuple (name,).
103 self.macros = []
104
Greg Ward3f81cf71999-07-10 02:03:53 +0000105 # 'include_dirs': a list of directories to search for include files
106 self.include_dirs = []
107
108 # 'libraries': a list of libraries to include in any link
109 # (library names, not filenames: eg. "foo" not "libfoo.a")
110 self.libraries = []
111
112 # 'library_dirs': a list of directories to search for libraries
113 self.library_dirs = []
114
Greg Warde1aaaa61999-08-14 23:50:50 +0000115 # 'runtime_library_dirs': a list of directories to search for
116 # shared libraries/objects at runtime
117 self.runtime_library_dirs = []
118
Greg Ward3f81cf71999-07-10 02:03:53 +0000119 # 'objects': a list of object files (or similar, such as explicitly
120 # named library files) to include on any link
121 self.objects = []
122
Greg Warde5c62bf2000-06-25 02:08:18 +0000123 for key in self.executables.keys():
124 self.set_executable(key, self.executables[key])
125
Collin Winter5b7e9d72007-08-30 03:52:21 +0000126 def set_executables(self, **kwargs):
Greg Warde5c62bf2000-06-25 02:08:18 +0000127 """Define the executables (and options for them) that will be run
128 to perform the various stages of compilation. The exact set of
129 executables that may be specified here depends on the compiler
130 class (via the 'executables' class attribute), but most will have:
131 compiler the C/C++ compiler
132 linker_so linker used to create shared objects and libraries
133 linker_exe linker used to create binary executables
134 archiver static library creator
135
136 On platforms with a command-line (Unix, DOS/Windows), each of these
137 is a string that will be split into executable name and (optional)
138 list of arguments. (Splitting the string is done similarly to how
139 Unix shells operate: words are delimited by spaces, but quotes and
140 backslashes can override this. See
141 'distutils.util.split_quoted()'.)
142 """
143
144 # Note that some CCompiler implementation classes will define class
145 # attributes 'cpp', 'cc', etc. with hard-coded executable names;
146 # this is appropriate when a compiler class is for exactly one
147 # compiler/OS combination (eg. MSVCCompiler). Other compiler
148 # classes (UnixCCompiler, in particular) are driven by information
149 # discovered at run-time, since there are many different ways to do
150 # basically the same things with Unix C compilers.
151
Christian Heimesc3f30c42008-02-22 16:37:40 +0000152 for key in kwargs:
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000153 if key not in self.executables:
Christian Heimesc3f30c42008-02-22 16:37:40 +0000154 raise ValueError("unknown executable '%s' for class %s" %
Collin Winter5b7e9d72007-08-30 03:52:21 +0000155 (key, self.__class__.__name__))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000156 self.set_executable(key, kwargs[key])
Greg Warde5c62bf2000-06-25 02:08:18 +0000157
158 def set_executable(self, key, value):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000159 if isinstance(value, str):
Greg Warde5c62bf2000-06-25 02:08:18 +0000160 setattr(self, key, split_quoted(value))
161 else:
162 setattr(self, key, value)
Fred Drakeb94b8492001-12-06 20:51:35 +0000163
Collin Winter5b7e9d72007-08-30 03:52:21 +0000164 def _find_macro(self, name):
Greg Ward3f81cf71999-07-10 02:03:53 +0000165 i = 0
166 for defn in self.macros:
167 if defn[0] == name:
168 return i
Collin Winter5b7e9d72007-08-30 03:52:21 +0000169 i += 1
Greg Ward3f81cf71999-07-10 02:03:53 +0000170 return None
171
Collin Winter5b7e9d72007-08-30 03:52:21 +0000172 def _check_macro_definitions(self, definitions):
Greg Ward3f81cf71999-07-10 02:03:53 +0000173 """Ensures that every element of 'definitions' is a valid macro
Greg Wardc3a43b42000-06-24 18:10:48 +0000174 definition, ie. either (name,value) 2-tuple or a (name,) tuple. Do
175 nothing if all definitions are OK, raise TypeError otherwise.
176 """
Greg Ward3f81cf71999-07-10 02:03:53 +0000177 for defn in definitions:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000178 if not (isinstance(defn, tuple) and
179 (len(defn) in (1, 2) and
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000180 (isinstance (defn[1], str) or defn[1] is None)) and
181 isinstance (defn[0], str)):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000182 raise TypeError(("invalid macro definition '%s': " % defn) + \
Greg Ward3f81cf71999-07-10 02:03:53 +0000183 "must be tuple (string,), (string, string), or " + \
Collin Winter5b7e9d72007-08-30 03:52:21 +0000184 "(string, None)")
Greg Ward3f81cf71999-07-10 02:03:53 +0000185
186
187 # -- Bookkeeping methods -------------------------------------------
188
Collin Winter5b7e9d72007-08-30 03:52:21 +0000189 def define_macro(self, name, value=None):
Greg Wardc3a43b42000-06-24 18:10:48 +0000190 """Define a preprocessor macro for all compilations driven by this
191 compiler object. The optional parameter 'value' should be a
192 string; if it is not supplied, then the macro will be defined
193 without an explicit value and the exact outcome depends on the
194 compiler used (XXX true? does ANSI say anything about this?)
195 """
Greg Ward3f81cf71999-07-10 02:03:53 +0000196 # Delete from the list of macro definitions/undefinitions if
197 # already there (so that this one will take precedence).
198 i = self._find_macro (name)
199 if i is not None:
200 del self.macros[i]
201
Collin Winter5b7e9d72007-08-30 03:52:21 +0000202 self.macros.append((name, value))
Greg Ward3f81cf71999-07-10 02:03:53 +0000203
Collin Winter5b7e9d72007-08-30 03:52:21 +0000204 def undefine_macro(self, name):
Greg Ward3f81cf71999-07-10 02:03:53 +0000205 """Undefine a preprocessor macro for all compilations driven by
Greg Wardc3a43b42000-06-24 18:10:48 +0000206 this compiler object. If the same macro is defined by
207 'define_macro()' and undefined by 'undefine_macro()' the last call
208 takes precedence (including multiple redefinitions or
209 undefinitions). If the macro is redefined/undefined on a
210 per-compilation basis (ie. in the call to 'compile()'), then that
211 takes precedence.
212 """
Greg Ward3f81cf71999-07-10 02:03:53 +0000213 # Delete from the list of macro definitions/undefinitions if
214 # already there (so that this one will take precedence).
215 i = self._find_macro (name)
216 if i is not None:
217 del self.macros[i]
218
219 undefn = (name,)
Collin Winter5b7e9d72007-08-30 03:52:21 +0000220 self.macros.append(undefn)
Greg Ward3f81cf71999-07-10 02:03:53 +0000221
Collin Winter5b7e9d72007-08-30 03:52:21 +0000222 def add_include_dir(self, dir):
Greg Wardc3a43b42000-06-24 18:10:48 +0000223 """Add 'dir' to the list of directories that will be searched for
224 header files. The compiler is instructed to search directories in
225 the order in which they are supplied by successive calls to
226 'add_include_dir()'.
227 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000228 self.include_dirs.append(dir)
Greg Ward3f81cf71999-07-10 02:03:53 +0000229
Collin Winter5b7e9d72007-08-30 03:52:21 +0000230 def set_include_dirs(self, dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +0000231 """Set the list of directories that will be searched to 'dirs' (a
232 list of strings). Overrides any preceding calls to
233 'add_include_dir()'; subsequence calls to 'add_include_dir()' add
234 to the list passed to 'set_include_dirs()'. This does not affect
235 any list of standard include directories that the compiler may
236 search by default.
237 """
Antoine Pitrou56a00de2009-05-15 17:34:21 +0000238 self.include_dirs = dirs[:]
Greg Ward3f81cf71999-07-10 02:03:53 +0000239
Collin Winter5b7e9d72007-08-30 03:52:21 +0000240 def add_library(self, libname):
Greg Wardc3a43b42000-06-24 18:10:48 +0000241 """Add 'libname' to the list of libraries that will be included in
242 all links driven by this compiler object. Note that 'libname'
243 should *not* be the name of a file containing a library, but the
244 name of the library itself: the actual filename will be inferred by
245 the linker, the compiler, or the compiler class (depending on the
246 platform).
Greg Ward3f81cf71999-07-10 02:03:53 +0000247
Greg Wardc3a43b42000-06-24 18:10:48 +0000248 The linker will be instructed to link against libraries in the
249 order they were supplied to 'add_library()' and/or
250 'set_libraries()'. It is perfectly valid to duplicate library
251 names; the linker will be instructed to link against libraries as
252 many times as they are mentioned.
253 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000254 self.libraries.append(libname)
Greg Ward3f81cf71999-07-10 02:03:53 +0000255
Collin Winter5b7e9d72007-08-30 03:52:21 +0000256 def set_libraries(self, libnames):
Greg Wardc3a43b42000-06-24 18:10:48 +0000257 """Set the list of libraries to be included in all links driven by
258 this compiler object to 'libnames' (a list of strings). This does
259 not affect any standard system libraries that the linker may
260 include by default.
261 """
Antoine Pitrou56a00de2009-05-15 17:34:21 +0000262 self.libraries = libnames[:]
Greg Ward3f81cf71999-07-10 02:03:53 +0000263
Collin Winter5b7e9d72007-08-30 03:52:21 +0000264 def add_library_dir(self, dir):
Greg Ward3f81cf71999-07-10 02:03:53 +0000265 """Add 'dir' to the list of directories that will be searched for
Greg Wardc3a43b42000-06-24 18:10:48 +0000266 libraries specified to 'add_library()' and 'set_libraries()'. The
267 linker will be instructed to search for libraries in the order they
268 are supplied to 'add_library_dir()' and/or 'set_library_dirs()'.
269 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000270 self.library_dirs.append(dir)
Greg Ward3f81cf71999-07-10 02:03:53 +0000271
Collin Winter5b7e9d72007-08-30 03:52:21 +0000272 def set_library_dirs(self, dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +0000273 """Set the list of library search directories to 'dirs' (a list of
274 strings). This does not affect any standard library search path
275 that the linker may search by default.
276 """
Antoine Pitrou56a00de2009-05-15 17:34:21 +0000277 self.library_dirs = dirs[:]
Greg Ward3f81cf71999-07-10 02:03:53 +0000278
Collin Winter5b7e9d72007-08-30 03:52:21 +0000279 def add_runtime_library_dir(self, dir):
Greg Warde1aaaa61999-08-14 23:50:50 +0000280 """Add 'dir' to the list of directories that will be searched for
Greg Wardc3a43b42000-06-24 18:10:48 +0000281 shared libraries at runtime.
282 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000283 self.runtime_library_dirs.append(dir)
Greg Warde1aaaa61999-08-14 23:50:50 +0000284
Collin Winter5b7e9d72007-08-30 03:52:21 +0000285 def set_runtime_library_dirs(self, dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +0000286 """Set the list of directories to search for shared libraries at
287 runtime to 'dirs' (a list of strings). This does not affect any
288 standard search path that the runtime linker may search by
289 default.
290 """
Antoine Pitrou56a00de2009-05-15 17:34:21 +0000291 self.runtime_library_dirs = dirs[:]
Greg Warde1aaaa61999-08-14 23:50:50 +0000292
Collin Winter5b7e9d72007-08-30 03:52:21 +0000293 def add_link_object(self, object):
Greg Wardc3a43b42000-06-24 18:10:48 +0000294 """Add 'object' to the list of object files (or analogues, such as
Greg Ward612eb9f2000-07-27 02:13:20 +0000295 explicitly named library files or the output of "resource
Greg Wardc3a43b42000-06-24 18:10:48 +0000296 compilers") to be included in every link driven by this compiler
297 object.
298 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000299 self.objects.append(object)
Greg Ward3f81cf71999-07-10 02:03:53 +0000300
Collin Winter5b7e9d72007-08-30 03:52:21 +0000301 def set_link_objects(self, objects):
Greg Wardc3a43b42000-06-24 18:10:48 +0000302 """Set the list of object files (or analogues) to be included in
303 every link to 'objects'. This does not affect any standard object
304 files that the linker may include by default (such as system
305 libraries).
306 """
Antoine Pitrou56a00de2009-05-15 17:34:21 +0000307 self.objects = objects[:]
Greg Ward3f81cf71999-07-10 02:03:53 +0000308
309
Thomas Hellere6500802002-04-25 17:03:30 +0000310 # -- Private utility methods --------------------------------------
Greg Ward32c4a8a2000-03-06 03:40:29 +0000311 # (here for the convenience of subclasses)
312
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000313 # Helper method to prep compiler in subclass compile() methods
314
315 def _setup_compile(self, outdir, macros, incdirs, sources, depends,
316 extra):
Tarek Ziadéac4e6ea2010-01-11 23:15:52 +0000317 """Process arguments and decide which source files to compile."""
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000318 if outdir is None:
319 outdir = self.output_dir
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000320 elif not isinstance(outdir, str):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000321 raise TypeError("'output_dir' must be a string or None")
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000322
323 if macros is None:
324 macros = self.macros
Collin Winter5b7e9d72007-08-30 03:52:21 +0000325 elif isinstance(macros, list):
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000326 macros = macros + (self.macros or [])
327 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000328 raise TypeError("'macros' (if supplied) must be a list of tuples")
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000329
330 if incdirs is None:
331 incdirs = self.include_dirs
Collin Winter5b7e9d72007-08-30 03:52:21 +0000332 elif isinstance(incdirs, (list, tuple)):
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000333 incdirs = list(incdirs) + (self.include_dirs or [])
334 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000335 raise TypeError(
336 "'include_dirs' (if supplied) must be a list of strings")
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000337
338 if extra is None:
339 extra = []
340
341 # Get the list of expected output (object) files
Collin Winter5b7e9d72007-08-30 03:52:21 +0000342 objects = self.object_filenames(sources, strip_dir=0,
Andrew M. Kuchling8c6e0ec2002-12-29 17:00:57 +0000343 output_dir=outdir)
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000344 assert len(objects) == len(sources)
345
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000346 pp_opts = gen_preprocess_options(macros, incdirs)
347
348 build = {}
349 for i in range(len(sources)):
350 src = sources[i]
351 obj = objects[i]
352 ext = os.path.splitext(src)[1]
353 self.mkpath(os.path.dirname(obj))
Tarek Ziadéac4e6ea2010-01-11 23:15:52 +0000354 build[obj] = (src, ext)
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000355
356 return macros, objects, extra, pp_opts, build
357
358 def _get_cc_args(self, pp_opts, debug, before):
359 # works for unixccompiler, emxccompiler, cygwinccompiler
360 cc_args = pp_opts + ['-c']
361 if debug:
362 cc_args[:0] = ['-g']
363 if before:
364 cc_args[:0] = before
365 return cc_args
366
Collin Winter5b7e9d72007-08-30 03:52:21 +0000367 def _fix_compile_args(self, output_dir, macros, include_dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +0000368 """Typecheck and fix-up some of the arguments to the 'compile()'
369 method, and return fixed-up values. Specifically: if 'output_dir'
370 is None, replaces it with 'self.output_dir'; ensures that 'macros'
371 is a list, and augments it with 'self.macros'; ensures that
372 'include_dirs' is a list, and augments it with 'self.include_dirs'.
373 Guarantees that the returned values are of the correct type,
374 i.e. for 'output_dir' either string or None, and for 'macros' and
375 'include_dirs' either list or None.
376 """
Greg Ward32c4a8a2000-03-06 03:40:29 +0000377 if output_dir is None:
378 output_dir = self.output_dir
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000379 elif not isinstance(output_dir, str):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000380 raise TypeError("'output_dir' must be a string or None")
Greg Ward32c4a8a2000-03-06 03:40:29 +0000381
382 if macros is None:
383 macros = self.macros
Collin Winter5b7e9d72007-08-30 03:52:21 +0000384 elif isinstance(macros, list):
Greg Ward32c4a8a2000-03-06 03:40:29 +0000385 macros = macros + (self.macros or [])
386 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000387 raise TypeError("'macros' (if supplied) must be a list of tuples")
Greg Ward32c4a8a2000-03-06 03:40:29 +0000388
389 if include_dirs is None:
390 include_dirs = self.include_dirs
Collin Winter5b7e9d72007-08-30 03:52:21 +0000391 elif isinstance(include_dirs, (list, tuple)):
392 include_dirs = list(include_dirs) + (self.include_dirs or [])
Greg Ward32c4a8a2000-03-06 03:40:29 +0000393 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000394 raise TypeError(
395 "'include_dirs' (if supplied) must be a list of strings")
Fred Drakeb94b8492001-12-06 20:51:35 +0000396
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000397 return output_dir, macros, include_dirs
Greg Ward32c4a8a2000-03-06 03:40:29 +0000398
Collin Winter5b7e9d72007-08-30 03:52:21 +0000399 def _fix_object_args(self, objects, output_dir):
Greg Wardc3a43b42000-06-24 18:10:48 +0000400 """Typecheck and fix up some arguments supplied to various methods.
401 Specifically: ensure that 'objects' is a list; if output_dir is
402 None, replace with self.output_dir. Return fixed versions of
403 'objects' and 'output_dir'.
404 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000405 if not isinstance(objects, (list, tuple)):
406 raise TypeError("'objects' must be a list or tuple of strings")
407 objects = list(objects)
Fred Drakeb94b8492001-12-06 20:51:35 +0000408
Greg Ward32c4a8a2000-03-06 03:40:29 +0000409 if output_dir is None:
410 output_dir = self.output_dir
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000411 elif not isinstance(output_dir, str):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000412 raise TypeError("'output_dir' must be a string or None")
Greg Ward32c4a8a2000-03-06 03:40:29 +0000413
Greg Wardf10f95d2000-03-26 21:37:09 +0000414 return (objects, output_dir)
Greg Ward32c4a8a2000-03-06 03:40:29 +0000415
Collin Winter5b7e9d72007-08-30 03:52:21 +0000416 def _fix_lib_args(self, libraries, library_dirs, runtime_library_dirs):
Greg Wardf10f95d2000-03-26 21:37:09 +0000417 """Typecheck and fix up some of the arguments supplied to the
Greg Wardc3a43b42000-06-24 18:10:48 +0000418 'link_*' methods. Specifically: ensure that all arguments are
419 lists, and augment them with their permanent versions
420 (eg. 'self.libraries' augments 'libraries'). Return a tuple with
421 fixed versions of all arguments.
422 """
Greg Wardf10f95d2000-03-26 21:37:09 +0000423 if libraries is None:
424 libraries = self.libraries
Collin Winter5b7e9d72007-08-30 03:52:21 +0000425 elif isinstance(libraries, (list, tuple)):
Greg Wardf10f95d2000-03-26 21:37:09 +0000426 libraries = list (libraries) + (self.libraries or [])
Greg Ward32c4a8a2000-03-06 03:40:29 +0000427 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000428 raise TypeError(
429 "'libraries' (if supplied) must be a list of strings")
Greg Ward32c4a8a2000-03-06 03:40:29 +0000430
Greg Wardf10f95d2000-03-26 21:37:09 +0000431 if library_dirs is None:
432 library_dirs = self.library_dirs
Collin Winter5b7e9d72007-08-30 03:52:21 +0000433 elif isinstance(library_dirs, (list, tuple)):
Greg Wardf10f95d2000-03-26 21:37:09 +0000434 library_dirs = list (library_dirs) + (self.library_dirs or [])
435 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000436 raise TypeError(
437 "'library_dirs' (if supplied) must be a list of strings")
Greg Wardf10f95d2000-03-26 21:37:09 +0000438
439 if runtime_library_dirs is None:
440 runtime_library_dirs = self.runtime_library_dirs
Collin Winter5b7e9d72007-08-30 03:52:21 +0000441 elif isinstance(runtime_library_dirs, (list, tuple)):
442 runtime_library_dirs = (list(runtime_library_dirs) +
Greg Wardf10f95d2000-03-26 21:37:09 +0000443 (self.runtime_library_dirs or []))
444 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000445 raise TypeError("'runtime_library_dirs' (if supplied) "
446 "must be a list of strings")
Greg Wardf10f95d2000-03-26 21:37:09 +0000447
448 return (libraries, library_dirs, runtime_library_dirs)
449
Collin Winter5b7e9d72007-08-30 03:52:21 +0000450 def _need_link(self, objects, output_file):
Greg Wardc3a43b42000-06-24 18:10:48 +0000451 """Return true if we need to relink the files listed in 'objects'
452 to recreate 'output_file'.
453 """
Greg Ward32c4a8a2000-03-06 03:40:29 +0000454 if self.force:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000455 return True
Greg Ward32c4a8a2000-03-06 03:40:29 +0000456 else:
457 if self.dry_run:
458 newer = newer_group (objects, output_file, missing='newer')
459 else:
460 newer = newer_group (objects, output_file)
461 return newer
462
Collin Winter5b7e9d72007-08-30 03:52:21 +0000463 def detect_language(self, sources):
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000464 """Detect the language of a given file, or list of files. Uses
465 language_map, and language_order to do the job.
466 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000467 if not isinstance(sources, list):
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000468 sources = [sources]
469 lang = None
470 index = len(self.language_order)
471 for source in sources:
472 base, ext = os.path.splitext(source)
473 extlang = self.language_map.get(ext)
474 try:
475 extindex = self.language_order.index(extlang)
476 if extindex < index:
477 lang = extlang
478 index = extindex
479 except ValueError:
480 pass
481 return lang
482
Greg Ward32c4a8a2000-03-06 03:40:29 +0000483
Greg Ward3f81cf71999-07-10 02:03:53 +0000484 # -- Worker methods ------------------------------------------------
485 # (must be implemented by subclasses)
486
Collin Winter5b7e9d72007-08-30 03:52:21 +0000487 def preprocess(self, source, output_file=None, macros=None,
488 include_dirs=None, extra_preargs=None, extra_postargs=None):
Greg Ward3ff3b032000-06-21 02:58:46 +0000489 """Preprocess a single C/C++ source file, named in 'source'.
490 Output will be written to file named 'output_file', or stdout if
491 'output_file' not supplied. 'macros' is a list of macro
492 definitions as for 'compile()', which will augment the macros set
493 with 'define_macro()' and 'undefine_macro()'. 'include_dirs' is a
494 list of directory names that will be added to the default list.
Greg Warde5c62bf2000-06-25 02:08:18 +0000495
496 Raises PreprocessError on failure.
Greg Ward3ff3b032000-06-21 02:58:46 +0000497 """
498 pass
499
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000500 def compile(self, sources, output_dir=None, macros=None,
501 include_dirs=None, debug=0, extra_preargs=None,
502 extra_postargs=None, depends=None):
503 """Compile one or more source files.
504
505 'sources' must be a list of filenames, most likely C/C++
506 files, but in reality anything that can be handled by a
507 particular compiler and compiler class (eg. MSVCCompiler can
508 handle resource files in 'sources'). Return a list of object
509 filenames, one per source filename in 'sources'. Depending on
510 the implementation, not all source files will necessarily be
511 compiled, but all corresponding object filenames will be
512 returned.
Greg Ward32c4a8a2000-03-06 03:40:29 +0000513
Greg Wardc3a43b42000-06-24 18:10:48 +0000514 If 'output_dir' is given, object files will be put under it, while
515 retaining their original path component. That is, "foo/bar.c"
516 normally compiles to "foo/bar.o" (for a Unix implementation); if
517 'output_dir' is "build", then it would compile to
518 "build/foo/bar.o".
Greg Ward3f81cf71999-07-10 02:03:53 +0000519
Greg Wardc3a43b42000-06-24 18:10:48 +0000520 'macros', if given, must be a list of macro definitions. A macro
521 definition is either a (name, value) 2-tuple or a (name,) 1-tuple.
522 The former defines a macro; if the value is None, the macro is
523 defined without an explicit value. The 1-tuple case undefines a
524 macro. Later definitions/redefinitions/ undefinitions take
525 precedence.
Greg Ward3f81cf71999-07-10 02:03:53 +0000526
Greg Wardc3a43b42000-06-24 18:10:48 +0000527 'include_dirs', if given, must be a list of strings, the
528 directories to add to the default include file search path for this
529 compilation only.
Greg Ward3c045a52000-02-09 02:16:14 +0000530
Greg Wardc3a43b42000-06-24 18:10:48 +0000531 'debug' is a boolean; if true, the compiler will be instructed to
532 output debug symbols in (or alongside) the object file(s).
Greg Ward802d6b71999-09-29 12:20:55 +0000533
Greg Wardc3a43b42000-06-24 18:10:48 +0000534 'extra_preargs' and 'extra_postargs' are implementation- dependent.
535 On platforms that have the notion of a command-line (e.g. Unix,
536 DOS/Windows), they are most likely lists of strings: extra
537 command-line arguments to prepand/append to the compiler command
538 line. On other platforms, consult the implementation class
539 documentation. In any event, they are intended as an escape hatch
540 for those occasions when the abstract compiler framework doesn't
541 cut the mustard.
Greg Wardd1517112000-05-30 01:56:44 +0000542
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000543 'depends', if given, is a list of filenames that all targets
544 depend on. If a source file is older than any file in
545 depends, then the source file will be recompiled. This
546 supports dependency tracking, but only at a coarse
547 granularity.
548
Greg Wardc3a43b42000-06-24 18:10:48 +0000549 Raises CompileError on failure.
550 """
Jeremy Hylton6e08d222002-06-18 18:42:41 +0000551 # A concrete compiler class can either override this method
552 # entirely or implement _compile().
Jeremy Hylton6e08d222002-06-18 18:42:41 +0000553 macros, objects, extra_postargs, pp_opts, build = \
554 self._setup_compile(output_dir, macros, include_dirs, sources,
555 depends, extra_postargs)
556 cc_args = self._get_cc_args(pp_opts, debug, extra_preargs)
557
Thomas Heller9436a752003-12-05 20:12:23 +0000558 for obj in objects:
559 try:
560 src, ext = build[obj]
561 except KeyError:
562 continue
Jeremy Hylton6e08d222002-06-18 18:42:41 +0000563 self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
564
565 # Return *all* object filenames, not just the ones we just built.
566 return objects
567
568 def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
569 """Compile 'src' to product 'obj'."""
Jeremy Hylton6e08d222002-06-18 18:42:41 +0000570 # A concrete compiler class that does not override compile()
571 # should implement _compile().
572 pass
Greg Ward3f81cf71999-07-10 02:03:53 +0000573
Collin Winter5b7e9d72007-08-30 03:52:21 +0000574 def create_static_lib(self, objects, output_libname, output_dir=None,
575 debug=0, target_lang=None):
Greg Wardc3a43b42000-06-24 18:10:48 +0000576 """Link a bunch of stuff together to create a static library file.
577 The "bunch of stuff" consists of the list of object files supplied
578 as 'objects', the extra object files supplied to
579 'add_link_object()' and/or 'set_link_objects()', the libraries
580 supplied to 'add_library()' and/or 'set_libraries()', and the
581 libraries supplied as 'libraries' (if any).
Greg Ward3f81cf71999-07-10 02:03:53 +0000582
Greg Wardc3a43b42000-06-24 18:10:48 +0000583 'output_libname' should be a library name, not a filename; the
584 filename will be inferred from the library name. 'output_dir' is
585 the directory where the library file will be put.
Greg Ward3c045a52000-02-09 02:16:14 +0000586
Greg Wardc3a43b42000-06-24 18:10:48 +0000587 'debug' is a boolean; if true, debugging information will be
588 included in the library (note that on most platforms, it is the
589 compile step where this matters: the 'debug' flag is included here
590 just for consistency).
Greg Wardd1517112000-05-30 01:56:44 +0000591
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000592 'target_lang' is the target language for which the given objects
593 are being compiled. This allows specific linkage time treatment of
594 certain languages.
595
Greg Wardc3a43b42000-06-24 18:10:48 +0000596 Raises LibError on failure.
597 """
Greg Ward3c045a52000-02-09 02:16:14 +0000598 pass
Fred Drakeb94b8492001-12-06 20:51:35 +0000599
Greg Ward3c045a52000-02-09 02:16:14 +0000600
Greg Ward42406482000-09-27 02:08:14 +0000601 # values for target_desc parameter in link()
602 SHARED_OBJECT = "shared_object"
603 SHARED_LIBRARY = "shared_library"
604 EXECUTABLE = "executable"
605
Collin Winter5b7e9d72007-08-30 03:52:21 +0000606 def link(self,
607 target_desc,
608 objects,
609 output_filename,
610 output_dir=None,
611 libraries=None,
612 library_dirs=None,
613 runtime_library_dirs=None,
614 export_symbols=None,
615 debug=0,
616 extra_preargs=None,
617 extra_postargs=None,
618 build_temp=None,
619 target_lang=None):
Greg Ward42406482000-09-27 02:08:14 +0000620 """Link a bunch of stuff together to create an executable or
621 shared library file.
622
623 The "bunch of stuff" consists of the list of object files supplied
624 as 'objects'. 'output_filename' should be a filename. If
625 'output_dir' is supplied, 'output_filename' is relative to it
626 (i.e. 'output_filename' can provide directory components if
627 needed).
Greg Ward3febd601999-10-03 20:41:02 +0000628
Greg Wardc3a43b42000-06-24 18:10:48 +0000629 'libraries' is a list of libraries to link against. These are
630 library names, not filenames, since they're translated into
631 filenames in a platform-specific way (eg. "foo" becomes "libfoo.a"
632 on Unix and "foo.lib" on DOS/Windows). However, they can include a
633 directory component, which means the linker will look in that
634 specific directory rather than searching all the normal locations.
Greg Ward5299b6a2000-05-20 13:23:21 +0000635
Greg Wardc3a43b42000-06-24 18:10:48 +0000636 'library_dirs', if supplied, should be a list of directories to
637 search for libraries that were specified as bare library names
638 (ie. no directory component). These are on top of the system
639 default and those supplied to 'add_library_dir()' and/or
640 'set_library_dirs()'. 'runtime_library_dirs' is a list of
641 directories that will be embedded into the shared library and used
642 to search for other shared libraries that *it* depends on at
643 run-time. (This may only be relevant on Unix.)
Greg Ward802d6b71999-09-29 12:20:55 +0000644
Greg Wardc3a43b42000-06-24 18:10:48 +0000645 'export_symbols' is a list of symbols that the shared library will
646 export. (This appears to be relevant only on Windows.)
Greg Ward3c045a52000-02-09 02:16:14 +0000647
Greg Wardc3a43b42000-06-24 18:10:48 +0000648 'debug' is as for 'compile()' and 'create_static_lib()', with the
649 slight distinction that it actually matters on most platforms (as
650 opposed to 'create_static_lib()', which includes a 'debug' flag
651 mostly for form's sake).
Greg Wardd1517112000-05-30 01:56:44 +0000652
Greg Wardc3a43b42000-06-24 18:10:48 +0000653 'extra_preargs' and 'extra_postargs' are as for 'compile()' (except
654 of course that they supply command-line arguments for the
655 particular linker being used).
Greg Ward3f81cf71999-07-10 02:03:53 +0000656
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000657 'target_lang' is the target language for which the given objects
658 are being compiled. This allows specific linkage time treatment of
659 certain languages.
660
Greg Wardc3a43b42000-06-24 18:10:48 +0000661 Raises LinkError on failure.
662 """
Greg Ward42406482000-09-27 02:08:14 +0000663 raise NotImplementedError
664
Fred Drakeb94b8492001-12-06 20:51:35 +0000665
Greg Ward264cf742000-09-27 02:24:21 +0000666 # Old 'link_*()' methods, rewritten to use the new 'link()' method.
Greg Ward42406482000-09-27 02:08:14 +0000667
Collin Winter5b7e9d72007-08-30 03:52:21 +0000668 def link_shared_lib(self,
669 objects,
670 output_libname,
671 output_dir=None,
672 libraries=None,
673 library_dirs=None,
674 runtime_library_dirs=None,
675 export_symbols=None,
676 debug=0,
677 extra_preargs=None,
678 extra_postargs=None,
679 build_temp=None,
680 target_lang=None):
Fred Drakeb94b8492001-12-06 20:51:35 +0000681 self.link(CCompiler.SHARED_LIBRARY, objects,
Greg Ward42406482000-09-27 02:08:14 +0000682 self.library_filename(output_libname, lib_type='shared'),
683 output_dir,
684 libraries, library_dirs, runtime_library_dirs,
685 export_symbols, debug,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000686 extra_preargs, extra_postargs, build_temp, target_lang)
Fred Drakeb94b8492001-12-06 20:51:35 +0000687
Greg Ward3f81cf71999-07-10 02:03:53 +0000688
Collin Winter5b7e9d72007-08-30 03:52:21 +0000689 def link_shared_object(self,
690 objects,
691 output_filename,
692 output_dir=None,
693 libraries=None,
694 library_dirs=None,
695 runtime_library_dirs=None,
696 export_symbols=None,
697 debug=0,
698 extra_preargs=None,
699 extra_postargs=None,
700 build_temp=None,
701 target_lang=None):
Greg Ward42406482000-09-27 02:08:14 +0000702 self.link(CCompiler.SHARED_OBJECT, objects,
703 output_filename, output_dir,
704 libraries, library_dirs, runtime_library_dirs,
705 export_symbols, debug,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000706 extra_preargs, extra_postargs, build_temp, target_lang)
Greg Ward3f81cf71999-07-10 02:03:53 +0000707
Greg Warde1aaaa61999-08-14 23:50:50 +0000708
Collin Winter5b7e9d72007-08-30 03:52:21 +0000709 def link_executable(self,
710 objects,
711 output_progname,
712 output_dir=None,
713 libraries=None,
714 library_dirs=None,
715 runtime_library_dirs=None,
716 debug=0,
717 extra_preargs=None,
718 extra_postargs=None,
719 target_lang=None):
Fred Drakeb94b8492001-12-06 20:51:35 +0000720 self.link(CCompiler.EXECUTABLE, objects,
Greg Ward264cf742000-09-27 02:24:21 +0000721 self.executable_filename(output_progname), output_dir,
Fred Drakeb94b8492001-12-06 20:51:35 +0000722 libraries, library_dirs, runtime_library_dirs, None,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000723 debug, extra_preargs, extra_postargs, None, target_lang)
Greg Ward5baf1c22000-01-09 22:41:02 +0000724
725
Greg Wardf7edea72000-05-20 13:31:32 +0000726 # -- Miscellaneous methods -----------------------------------------
727 # These are all used by the 'gen_lib_options() function; there is
728 # no appropriate default implementation so subclasses should
729 # implement all of these.
730
Collin Winter5b7e9d72007-08-30 03:52:21 +0000731 def library_dir_option(self, dir):
Greg Wardc3a43b42000-06-24 18:10:48 +0000732 """Return the compiler option to add 'dir' to the list of
733 directories searched for libraries.
734 """
Greg Wardf7edea72000-05-20 13:31:32 +0000735 raise NotImplementedError
736
Collin Winter5b7e9d72007-08-30 03:52:21 +0000737 def runtime_library_dir_option(self, dir):
Greg Wardc3a43b42000-06-24 18:10:48 +0000738 """Return the compiler option to add 'dir' to the list of
739 directories searched for runtime libraries.
740 """
Greg Wardf7edea72000-05-20 13:31:32 +0000741 raise NotImplementedError
742
Collin Winter5b7e9d72007-08-30 03:52:21 +0000743 def library_option(self, lib):
Greg Wardf7edea72000-05-20 13:31:32 +0000744 """Return the compiler option to add 'dir' to the list of libraries
Greg Wardc3a43b42000-06-24 18:10:48 +0000745 linked into the shared library or executable.
746 """
Greg Wardf7edea72000-05-20 13:31:32 +0000747 raise NotImplementedError
748
Collin Winter5b7e9d72007-08-30 03:52:21 +0000749 def has_function(self, funcname, includes=None, include_dirs=None,
750 libraries=None, library_dirs=None):
Skip Montanarofa012612003-04-24 19:49:23 +0000751 """Return a boolean indicating whether funcname is supported on
752 the current platform. The optional arguments can be used to
753 augment the compilation environment.
754 """
Skip Montanarofa012612003-04-24 19:49:23 +0000755 # this can't be included at module scope because it tries to
756 # import math which might not be available at that point - maybe
757 # the necessary logic should just be inlined?
758 import tempfile
759 if includes is None:
760 includes = []
761 if include_dirs is None:
762 include_dirs = []
763 if libraries is None:
764 libraries = []
765 if library_dirs is None:
766 library_dirs = []
767 fd, fname = tempfile.mkstemp(".c", funcname, text=True)
768 f = os.fdopen(fd, "w")
769 for incl in includes:
770 f.write("""#include "%s"\n""" % incl)
771 f.write("""\
772main (int argc, char **argv) {
773 %s();
774}
775""" % funcname)
776 f.close()
777 try:
778 objects = self.compile([fname], include_dirs=include_dirs)
779 except CompileError:
780 return False
781
782 try:
783 self.link_executable(objects, "a.out",
784 libraries=libraries,
785 library_dirs=library_dirs)
786 except (LinkError, TypeError):
787 return False
788 return True
789
Greg Warde5e60152000-08-04 01:28:39 +0000790 def find_library_file (self, dirs, lib, debug=0):
Greg Wardf7edea72000-05-20 13:31:32 +0000791 """Search the specified list of directories for a static or shared
Greg Warde5e60152000-08-04 01:28:39 +0000792 library file 'lib' and return the full path to that file. If
793 'debug' true, look for a debugging version (if that makes sense on
794 the current platform). Return None if 'lib' wasn't found in any of
795 the specified directories.
Greg Wardc3a43b42000-06-24 18:10:48 +0000796 """
Greg Wardf7edea72000-05-20 13:31:32 +0000797 raise NotImplementedError
798
Greg Ward32c4a8a2000-03-06 03:40:29 +0000799 # -- Filename generation methods -----------------------------------
Greg Warde1aaaa61999-08-14 23:50:50 +0000800
Greg Ward32c4a8a2000-03-06 03:40:29 +0000801 # The default implementation of the filename generating methods are
802 # prejudiced towards the Unix/DOS/Windows view of the world:
803 # * object files are named by replacing the source file extension
804 # (eg. .c/.cpp -> .o/.obj)
805 # * library files (shared or static) are named by plugging the
806 # library name and extension into a format string, eg.
807 # "lib%s.%s" % (lib_name, ".a") for Unix static libraries
808 # * executables are named by appending an extension (possibly
809 # empty) to the program name: eg. progname + ".exe" for
810 # Windows
811 #
812 # To reduce redundant code, these methods expect to find
813 # several attributes in the current object (presumably defined
814 # as class attributes):
815 # * src_extensions -
816 # list of C/C++ source file extensions, eg. ['.c', '.cpp']
817 # * obj_extension -
818 # object file extension, eg. '.o' or '.obj'
819 # * static_lib_extension -
820 # extension for static library files, eg. '.a' or '.lib'
821 # * shared_lib_extension -
822 # extension for shared library/object files, eg. '.so', '.dll'
823 # * static_lib_format -
824 # format string for generating static library filenames,
825 # eg. 'lib%s.%s' or '%s.%s'
826 # * shared_lib_format
827 # format string for generating shared library filenames
828 # (probably same as static_lib_format, since the extension
829 # is one of the intended parameters to the format string)
830 # * exe_extension -
831 # extension for executable files, eg. '' or '.exe'
Greg Ward9b17cb51999-09-13 03:07:24 +0000832
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000833 def object_filenames(self, source_filenames, strip_dir=0, output_dir=''):
Guido van Rossumcc3a6df2002-10-01 04:14:17 +0000834 if output_dir is None:
835 output_dir = ''
Greg Ward32c4a8a2000-03-06 03:40:29 +0000836 obj_names = []
837 for src_name in source_filenames:
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000838 base, ext = os.path.splitext(src_name)
Andrew M. Kuchling10da45e2003-02-26 18:52:07 +0000839 base = os.path.splitdrive(base)[1] # Chop off the drive
840 base = base[os.path.isabs(base):] # If abs, chop off leading /
Greg Ward32c4a8a2000-03-06 03:40:29 +0000841 if ext not in self.src_extensions:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000842 raise UnknownFileError(
843 "unknown file type '%s' (from '%s')" % (ext, src_name))
Greg Ward32c4a8a2000-03-06 03:40:29 +0000844 if strip_dir:
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000845 base = os.path.basename(base)
846 obj_names.append(os.path.join(output_dir,
847 base + self.obj_extension))
Greg Ward32c4a8a2000-03-06 03:40:29 +0000848 return obj_names
Greg Warde1aaaa61999-08-14 23:50:50 +0000849
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000850 def shared_object_filename(self, basename, strip_dir=0, output_dir=''):
851 assert output_dir is not None
Greg Ward32c4a8a2000-03-06 03:40:29 +0000852 if strip_dir:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000853 basename = os.path.basename(basename)
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000854 return os.path.join(output_dir, basename + self.shared_lib_extension)
Greg Warde1aaaa61999-08-14 23:50:50 +0000855
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000856 def executable_filename(self, basename, strip_dir=0, output_dir=''):
857 assert output_dir is not None
Greg Ward42406482000-09-27 02:08:14 +0000858 if strip_dir:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000859 basename = os.path.basename(basename)
Greg Ward42406482000-09-27 02:08:14 +0000860 return os.path.join(output_dir, basename + (self.exe_extension or ''))
Greg Ward26e48ea1999-08-29 18:17:36 +0000861
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000862 def library_filename(self, libname, lib_type='static', # or 'shared'
863 strip_dir=0, output_dir=''):
864 assert output_dir is not None
865 if lib_type not in ("static", "shared", "dylib"):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000866 raise ValueError(
867 "'lib_type' must be \"static\", \"shared\" or \"dylib\"")
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000868 fmt = getattr(self, lib_type + "_lib_format")
869 ext = getattr(self, lib_type + "_lib_extension")
Greg Ward32c4a8a2000-03-06 03:40:29 +0000870
Collin Winter5b7e9d72007-08-30 03:52:21 +0000871 dir, base = os.path.split(libname)
Greg Ward32c4a8a2000-03-06 03:40:29 +0000872 filename = fmt % (base, ext)
873 if strip_dir:
874 dir = ''
875
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000876 return os.path.join(output_dir, dir, filename)
Greg Ward32c4a8a2000-03-06 03:40:29 +0000877
Greg Warde1aaaa61999-08-14 23:50:50 +0000878
879 # -- Utility methods -----------------------------------------------
880
Collin Winter5b7e9d72007-08-30 03:52:21 +0000881 def announce(self, msg, level=1):
Jeremy Hyltoncd8a1142002-06-04 20:14:43 +0000882 log.debug(msg)
Greg Ward9b17cb51999-09-13 03:07:24 +0000883
Collin Winter5b7e9d72007-08-30 03:52:21 +0000884 def debug_print(self, msg):
Jeremy Hyltonfcd73532002-09-11 16:31:53 +0000885 from distutils.debug import DEBUG
Greg Wardf813e592000-08-04 01:31:13 +0000886 if DEBUG:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000887 print(msg)
Greg Wardf813e592000-08-04 01:31:13 +0000888
Collin Winter5b7e9d72007-08-30 03:52:21 +0000889 def warn(self, msg):
890 sys.stderr.write("warning: %s\n" % msg)
Greg Ward3febd601999-10-03 20:41:02 +0000891
Collin Winter5b7e9d72007-08-30 03:52:21 +0000892 def execute(self, func, args, msg=None, level=1):
Jeremy Hyltoncd8a1142002-06-04 20:14:43 +0000893 execute(func, args, msg, self.dry_run)
Greg Ward9dddbb42000-08-02 01:38:20 +0000894
Collin Winter5b7e9d72007-08-30 03:52:21 +0000895 def spawn(self, cmd):
896 spawn(cmd, dry_run=self.dry_run)
Greg Warde1aaaa61999-08-14 23:50:50 +0000897
Collin Winter5b7e9d72007-08-30 03:52:21 +0000898 def move_file(self, src, dst):
899 return move_file(src, dst, dry_run=self.dry_run)
Greg Ward9b17cb51999-09-13 03:07:24 +0000900
Benjamin Peterson6ebe78f2008-12-21 00:06:59 +0000901 def mkpath (self, name, mode=0o777):
902 mkpath(name, mode, dry_run=self.dry_run)
Greg Ward3f81cf71999-07-10 02:03:53 +0000903
904
Marc-André Lemburg636b9062001-02-19 09:20:04 +0000905# Map a sys.platform/os.name ('posix', 'nt') to the default compiler
906# type for that platform. Keys are interpreted as re match
907# patterns. Order is important; platform mappings are preferred over
908# OS names.
909_default_compilers = (
910
911 # Platform string mappings
Andrew M. Kuchlinga34dbe02001-02-27 19:13:15 +0000912
913 # on a cygwin built python we can use gcc like an ordinary UNIXish
914 # compiler
915 ('cygwin.*', 'unix'),
Marc-André Lemburg2544f512002-01-31 18:56:00 +0000916 ('os2emx', 'emx'),
Fred Drakeb94b8492001-12-06 20:51:35 +0000917
Marc-André Lemburg636b9062001-02-19 09:20:04 +0000918 # OS name mappings
919 ('posix', 'unix'),
920 ('nt', 'msvc'),
Fred Drakeb94b8492001-12-06 20:51:35 +0000921
Marc-André Lemburg636b9062001-02-19 09:20:04 +0000922 )
923
924def get_default_compiler(osname=None, platform=None):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000925 """Determine the default compiler to use for the given platform.
Marc-André Lemburg636b9062001-02-19 09:20:04 +0000926
Collin Winter5b7e9d72007-08-30 03:52:21 +0000927 osname should be one of the standard Python OS names (i.e. the
928 ones returned by os.name) and platform the common value
929 returned by sys.platform for the platform in question.
Marc-André Lemburg636b9062001-02-19 09:20:04 +0000930
Collin Winter5b7e9d72007-08-30 03:52:21 +0000931 The default values are os.name and sys.platform in case the
932 parameters are not given.
Marc-André Lemburg636b9062001-02-19 09:20:04 +0000933 """
934 if osname is None:
935 osname = os.name
936 if platform is None:
937 platform = sys.platform
938 for pattern, compiler in _default_compilers:
939 if re.match(pattern, platform) is not None or \
940 re.match(pattern, osname) is not None:
941 return compiler
942 # Default to Unix compiler
943 return 'unix'
Greg Ward802d6b71999-09-29 12:20:55 +0000944
945# Map compiler types to (module_name, class_name) pairs -- ie. where to
946# find the code that implements an interface to this compiler. (The module
947# is assumed to be in the 'distutils' package.)
Greg Ward2ff78872000-06-24 00:23:20 +0000948compiler_class = { 'unix': ('unixccompiler', 'UnixCCompiler',
949 "standard UNIX-style compiler"),
950 'msvc': ('msvccompiler', 'MSVCCompiler',
951 "Microsoft Visual C++"),
952 'cygwin': ('cygwinccompiler', 'CygwinCCompiler',
953 "Cygwin port of GNU C Compiler for Win32"),
954 'mingw32': ('cygwinccompiler', 'Mingw32CCompiler',
955 "Mingw32 port of GNU C Compiler for Win32"),
Greg Wardbfc79d62000-06-28 01:29:09 +0000956 'bcpp': ('bcppcompiler', 'BCPPCompiler',
957 "Borland C++ Compiler"),
Marc-André Lemburg2544f512002-01-31 18:56:00 +0000958 'emx': ('emxccompiler', 'EMXCCompiler',
959 "EMX port of GNU C Compiler for OS/2"),
Greg Ward802d6b71999-09-29 12:20:55 +0000960 }
961
Greg Ward9d17a7a2000-06-07 03:00:06 +0000962def show_compilers():
Greg Ward2ff78872000-06-24 00:23:20 +0000963 """Print list of available compilers (used by the "--help-compiler"
964 options to "build", "build_ext", "build_clib").
965 """
966 # XXX this "knows" that the compiler option it's describing is
967 # "--compiler", which just happens to be the case for the three
968 # commands that use it.
Fred Drakeb94b8492001-12-06 20:51:35 +0000969 from distutils.fancy_getopt import FancyGetopt
Greg Ward2ff78872000-06-24 00:23:20 +0000970 compilers = []
Greg Ward9d17a7a2000-06-07 03:00:06 +0000971 for compiler in compiler_class.keys():
Jeremy Hylton65d6edb2000-07-07 20:45:21 +0000972 compilers.append(("compiler="+compiler, None,
Greg Ward2ff78872000-06-24 00:23:20 +0000973 compiler_class[compiler][2]))
974 compilers.sort()
975 pretty_printer = FancyGetopt(compilers)
Greg Ward9d17a7a2000-06-07 03:00:06 +0000976 pretty_printer.print_help("List of available compilers:")
Fred Drakeb94b8492001-12-06 20:51:35 +0000977
Greg Ward802d6b71999-09-29 12:20:55 +0000978
Collin Winter5b7e9d72007-08-30 03:52:21 +0000979def new_compiler(plat=None, compiler=None, verbose=0, dry_run=0, force=0):
Greg Ward802d6b71999-09-29 12:20:55 +0000980 """Generate an instance of some CCompiler subclass for the supplied
Greg Wardc3a43b42000-06-24 18:10:48 +0000981 platform/compiler combination. 'plat' defaults to 'os.name'
982 (eg. 'posix', 'nt'), and 'compiler' defaults to the default compiler
983 for that platform. Currently only 'posix' and 'nt' are supported, and
984 the default compilers are "traditional Unix interface" (UnixCCompiler
985 class) and Visual C++ (MSVCCompiler class). Note that it's perfectly
986 possible to ask for a Unix compiler object under Windows, and a
987 Microsoft compiler object under Unix -- if you supply a value for
988 'compiler', 'plat' is ignored.
989 """
Greg Ward802d6b71999-09-29 12:20:55 +0000990 if plat is None:
991 plat = os.name
992
993 try:
994 if compiler is None:
Marc-André Lemburg636b9062001-02-19 09:20:04 +0000995 compiler = get_default_compiler(plat)
Fred Drakeb94b8492001-12-06 20:51:35 +0000996
Greg Ward2ff78872000-06-24 00:23:20 +0000997 (module_name, class_name, long_description) = compiler_class[compiler]
Greg Ward802d6b71999-09-29 12:20:55 +0000998 except KeyError:
999 msg = "don't know how to compile C/C++ code on platform '%s'" % plat
1000 if compiler is not None:
1001 msg = msg + " with '%s' compiler" % compiler
Collin Winter5b7e9d72007-08-30 03:52:21 +00001002 raise DistutilsPlatformError(msg)
Fred Drakeb94b8492001-12-06 20:51:35 +00001003
Greg Ward802d6b71999-09-29 12:20:55 +00001004 try:
1005 module_name = "distutils." + module_name
1006 __import__ (module_name)
1007 module = sys.modules[module_name]
1008 klass = vars(module)[class_name]
1009 except ImportError:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001010 raise DistutilsModuleError(
Greg Ward802d6b71999-09-29 12:20:55 +00001011 "can't compile C/C++ code: unable to load module '%s'" % \
Collin Winter5b7e9d72007-08-30 03:52:21 +00001012 module_name)
Greg Ward802d6b71999-09-29 12:20:55 +00001013 except KeyError:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001014 raise DistutilsModuleError(
1015 "can't compile C/C++ code: unable to find class '%s' "
1016 "in module '%s'" % (class_name, module_name))
Greg Ward802d6b71999-09-29 12:20:55 +00001017
Jeremy Hyltoncd8a1142002-06-04 20:14:43 +00001018 # XXX The None is necessary to preserve backwards compatibility
1019 # with classes that expect verbose to be the first positional
1020 # argument.
Collin Winter5b7e9d72007-08-30 03:52:21 +00001021 return klass(None, dry_run, force)
Greg Wardf7a39ec1999-09-08 02:29:08 +00001022
1023
Collin Winter5b7e9d72007-08-30 03:52:21 +00001024def gen_preprocess_options(macros, include_dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +00001025 """Generate C pre-processor options (-D, -U, -I) as used by at least
1026 two types of compilers: the typical Unix compiler and Visual C++.
1027 'macros' is the usual thing, a list of 1- or 2-tuples, where (name,)
1028 means undefine (-U) macro 'name', and (name,value) means define (-D)
1029 macro 'name' to 'value'. 'include_dirs' is just a list of directory
1030 names to be added to the header file search path (-I). Returns a list
1031 of command-line options suitable for either Unix compilers or Visual
1032 C++.
1033 """
Greg Wardf7a39ec1999-09-08 02:29:08 +00001034 # XXX it would be nice (mainly aesthetic, and so we don't generate
1035 # stupid-looking command lines) to go over 'macros' and eliminate
1036 # redundant definitions/undefinitions (ie. ensure that only the
1037 # latest mention of a particular macro winds up on the command
1038 # line). I don't think it's essential, though, since most (all?)
1039 # Unix C compilers only pay attention to the latest -D or -U
1040 # mention of a macro on their command line. Similar situation for
Greg Ward0bdd90a1999-12-12 17:19:58 +00001041 # 'include_dirs'. I'm punting on both for now. Anyways, weeding out
Greg Wardf7a39ec1999-09-08 02:29:08 +00001042 # redundancies like this should probably be the province of
1043 # CCompiler, since the data structures used are inherited from it
1044 # and therefore common to all CCompiler classes.
Greg Wardf7a39ec1999-09-08 02:29:08 +00001045 pp_opts = []
1046 for macro in macros:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001047 if not (isinstance(macro, tuple) and 1 <= len(macro) <= 2):
1048 raise TypeError(
1049 "bad macro definition '%s': "
1050 "each element of 'macros' list must be a 1- or 2-tuple"
1051 % macro)
Greg Wardfbf8aff1999-09-21 18:35:09 +00001052
Collin Winter5b7e9d72007-08-30 03:52:21 +00001053 if len(macro) == 1: # undefine this macro
1054 pp_opts.append("-U%s" % macro[0])
1055 elif len(macro) == 2:
Greg Wardf7a39ec1999-09-08 02:29:08 +00001056 if macro[1] is None: # define with no explicit value
Collin Winter5b7e9d72007-08-30 03:52:21 +00001057 pp_opts.append("-D%s" % macro[0])
Greg Wardf7a39ec1999-09-08 02:29:08 +00001058 else:
1059 # XXX *don't* need to be clever about quoting the
1060 # macro value here, because we're going to avoid the
1061 # shell at all costs when we spawn the command!
Collin Winter5b7e9d72007-08-30 03:52:21 +00001062 pp_opts.append("-D%s=%s" % macro)
Greg Wardf7a39ec1999-09-08 02:29:08 +00001063
Greg Ward0bdd90a1999-12-12 17:19:58 +00001064 for dir in include_dirs:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001065 pp_opts.append("-I%s" % dir)
Greg Wardf7a39ec1999-09-08 02:29:08 +00001066 return pp_opts
1067
Greg Wardf7a39ec1999-09-08 02:29:08 +00001068
Tarek Ziadécc9144a2009-06-28 21:29:24 +00001069def gen_lib_options(compiler, library_dirs, runtime_library_dirs, libraries):
Greg Wardf7a39ec1999-09-08 02:29:08 +00001070 """Generate linker options for searching library directories and
Tarek Ziadécc9144a2009-06-28 21:29:24 +00001071 linking with specific libraries.
1072
1073 'libraries' and 'library_dirs' are, respectively, lists of library names
1074 (not filenames!) and search directories. Returns a list of command-line
1075 options suitable for use with some compiler (depending on the two format
1076 strings passed in).
Greg Wardc3a43b42000-06-24 18:10:48 +00001077 """
Greg Wardf7a39ec1999-09-08 02:29:08 +00001078 lib_opts = []
1079
1080 for dir in library_dirs:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001081 lib_opts.append(compiler.library_dir_option(dir))
Greg Wardf7a39ec1999-09-08 02:29:08 +00001082
Greg Wardd03f88a2000-03-18 15:19:51 +00001083 for dir in runtime_library_dirs:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001084 opt = compiler.runtime_library_dir_option(dir)
1085 if isinstance(opt, list):
Tarek Ziadécc9144a2009-06-28 21:29:24 +00001086 lib_opts.extend(opt)
Martin v. Löwis061f1322004-08-29 16:40:55 +00001087 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001088 lib_opts.append(opt)
Greg Wardd03f88a2000-03-18 15:19:51 +00001089
Greg Wardf7a39ec1999-09-08 02:29:08 +00001090 # XXX it's important that we *not* remove redundant library mentions!
1091 # sometimes you really do have to say "-lfoo -lbar -lfoo" in order to
1092 # resolve all symbols. I just hope we never have to say "-lfoo obj.o
1093 # -lbar" to get things to work -- that's certainly a possibility, but a
1094 # pretty nasty way to arrange your C code.
1095
1096 for lib in libraries:
Tarek Ziadécc9144a2009-06-28 21:29:24 +00001097 lib_dir, lib_name = os.path.split(lib)
1098 if lib_dir != '':
Collin Winter5b7e9d72007-08-30 03:52:21 +00001099 lib_file = compiler.find_library_file([lib_dir], lib_name)
Tarek Ziadécc9144a2009-06-28 21:29:24 +00001100 if lib_file is not None:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001101 lib_opts.append(lib_file)
Greg Ward3febd601999-10-03 20:41:02 +00001102 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001103 compiler.warn("no library file corresponding to "
1104 "'%s' found (skipping)" % lib)
Greg Ward3febd601999-10-03 20:41:02 +00001105 else:
Tarek Ziadécc9144a2009-06-28 21:29:24 +00001106 lib_opts.append(compiler.library_option(lib))
Greg Wardf7a39ec1999-09-08 02:29:08 +00001107 return lib_opts