blob: c046915153a288f22c17a4353a06ddb934c32fdd [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é2b66da72009-12-21 01:22:46 +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
Greg Warde1aaaa61999-08-14 23:50:50 +000090 def __init__ (self,
91 verbose=0,
Greg Ward3febd601999-10-03 20:41:02 +000092 dry_run=0,
93 force=0):
Greg Warde1aaaa61999-08-14 23:50:50 +000094
Greg Warde1aaaa61999-08-14 23:50:50 +000095 self.dry_run = dry_run
Greg Ward3febd601999-10-03 20:41:02 +000096 self.force = force
Skip Montanaro70e1d9b2002-10-01 17:39:59 +000097 self.verbose = verbose
Greg Ward3f81cf71999-07-10 02:03:53 +000098
Greg Ward9b17cb51999-09-13 03:07:24 +000099 # 'output_dir': a common output directory for object, library,
100 # shared object, and shared library files
101 self.output_dir = None
102
Greg Ward3f81cf71999-07-10 02:03:53 +0000103 # 'macros': a list of macro definitions (or undefinitions). A
104 # macro definition is a 2-tuple (name, value), where the value is
105 # either a string or None (no explicit value). A macro
106 # undefinition is a 1-tuple (name,).
107 self.macros = []
108
Greg Ward3f81cf71999-07-10 02:03:53 +0000109 # 'include_dirs': a list of directories to search for include files
110 self.include_dirs = []
111
112 # 'libraries': a list of libraries to include in any link
113 # (library names, not filenames: eg. "foo" not "libfoo.a")
114 self.libraries = []
115
116 # 'library_dirs': a list of directories to search for libraries
117 self.library_dirs = []
118
Greg Warde1aaaa61999-08-14 23:50:50 +0000119 # 'runtime_library_dirs': a list of directories to search for
120 # shared libraries/objects at runtime
121 self.runtime_library_dirs = []
122
Greg Ward3f81cf71999-07-10 02:03:53 +0000123 # 'objects': a list of object files (or similar, such as explicitly
124 # named library files) to include on any link
125 self.objects = []
126
Greg Warde5c62bf2000-06-25 02:08:18 +0000127 for key in self.executables.keys():
128 self.set_executable(key, self.executables[key])
129
Greg Ward3f81cf71999-07-10 02:03:53 +0000130 # __init__ ()
131
132
Greg Warde5c62bf2000-06-25 02:08:18 +0000133 def set_executables (self, **args):
134
135 """Define the executables (and options for them) that will be run
136 to perform the various stages of compilation. The exact set of
137 executables that may be specified here depends on the compiler
138 class (via the 'executables' class attribute), but most will have:
139 compiler the C/C++ compiler
140 linker_so linker used to create shared objects and libraries
141 linker_exe linker used to create binary executables
142 archiver static library creator
143
144 On platforms with a command-line (Unix, DOS/Windows), each of these
145 is a string that will be split into executable name and (optional)
146 list of arguments. (Splitting the string is done similarly to how
147 Unix shells operate: words are delimited by spaces, but quotes and
148 backslashes can override this. See
149 'distutils.util.split_quoted()'.)
150 """
151
152 # Note that some CCompiler implementation classes will define class
153 # attributes 'cpp', 'cc', etc. with hard-coded executable names;
154 # this is appropriate when a compiler class is for exactly one
155 # compiler/OS combination (eg. MSVCCompiler). Other compiler
156 # classes (UnixCCompiler, in particular) are driven by information
157 # discovered at run-time, since there are many different ways to do
158 # basically the same things with Unix C compilers.
159
160 for key in args.keys():
Guido van Rossum8bc09652008-02-21 18:18:37 +0000161 if key not in self.executables:
Greg Warde5c62bf2000-06-25 02:08:18 +0000162 raise ValueError, \
163 "unknown executable '%s' for class %s" % \
164 (key, self.__class__.__name__)
165 self.set_executable(key, args[key])
166
167 # set_executables ()
168
169 def set_executable(self, key, value):
Tarek Ziadé2b66da72009-12-21 01:22:46 +0000170 if isinstance(value, str):
Greg Warde5c62bf2000-06-25 02:08:18 +0000171 setattr(self, key, split_quoted(value))
172 else:
173 setattr(self, key, value)
Fred Drakeb94b8492001-12-06 20:51:35 +0000174
Greg Warde5c62bf2000-06-25 02:08:18 +0000175
Greg Ward3f81cf71999-07-10 02:03:53 +0000176 def _find_macro (self, name):
177 i = 0
178 for defn in self.macros:
179 if defn[0] == name:
180 return i
181 i = i + 1
182
183 return None
184
185
186 def _check_macro_definitions (self, definitions):
187 """Ensures that every element of 'definitions' is a valid macro
Greg Wardc3a43b42000-06-24 18:10:48 +0000188 definition, ie. either (name,value) 2-tuple or a (name,) tuple. Do
189 nothing if all definitions are OK, raise TypeError otherwise.
190 """
Greg Ward3f81cf71999-07-10 02:03:53 +0000191 for defn in definitions:
Tarek Ziadé2b66da72009-12-21 01:22:46 +0000192 if not (isinstance(defn, tuple) and
Greg Ward3f81cf71999-07-10 02:03:53 +0000193 (len (defn) == 1 or
194 (len (defn) == 2 and
Tarek Ziadé2b66da72009-12-21 01:22:46 +0000195 (isinstance(defn[1], str) or defn[1] is None))) and
196 isinstance(defn[0], str)):
Greg Ward3f81cf71999-07-10 02:03:53 +0000197 raise TypeError, \
198 ("invalid macro definition '%s': " % defn) + \
199 "must be tuple (string,), (string, string), or " + \
200 "(string, None)"
201
202
203 # -- Bookkeeping methods -------------------------------------------
204
205 def define_macro (self, name, value=None):
Greg Wardc3a43b42000-06-24 18:10:48 +0000206 """Define a preprocessor macro for all compilations driven by this
207 compiler object. The optional parameter 'value' should be a
208 string; if it is not supplied, then the macro will be defined
209 without an explicit value and the exact outcome depends on the
210 compiler used (XXX true? does ANSI say anything about this?)
211 """
Greg Ward3f81cf71999-07-10 02:03:53 +0000212 # Delete from the list of macro definitions/undefinitions if
213 # already there (so that this one will take precedence).
214 i = self._find_macro (name)
215 if i is not None:
216 del self.macros[i]
217
218 defn = (name, value)
219 self.macros.append (defn)
220
221
222 def undefine_macro (self, name):
223 """Undefine a preprocessor macro for all compilations driven by
Greg Wardc3a43b42000-06-24 18:10:48 +0000224 this compiler object. If the same macro is defined by
225 'define_macro()' and undefined by 'undefine_macro()' the last call
226 takes precedence (including multiple redefinitions or
227 undefinitions). If the macro is redefined/undefined on a
228 per-compilation basis (ie. in the call to 'compile()'), then that
229 takes precedence.
230 """
Greg Ward3f81cf71999-07-10 02:03:53 +0000231 # Delete from the list of macro definitions/undefinitions if
232 # already there (so that this one will take precedence).
233 i = self._find_macro (name)
234 if i is not None:
235 del self.macros[i]
236
237 undefn = (name,)
238 self.macros.append (undefn)
239
240
241 def add_include_dir (self, dir):
Greg Wardc3a43b42000-06-24 18:10:48 +0000242 """Add 'dir' to the list of directories that will be searched for
243 header files. The compiler is instructed to search directories in
244 the order in which they are supplied by successive calls to
245 'add_include_dir()'.
246 """
Greg Ward3f81cf71999-07-10 02:03:53 +0000247 self.include_dirs.append (dir)
248
249 def set_include_dirs (self, dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +0000250 """Set the list of directories that will be searched to 'dirs' (a
251 list of strings). Overrides any preceding calls to
252 'add_include_dir()'; subsequence calls to 'add_include_dir()' add
253 to the list passed to 'set_include_dirs()'. This does not affect
254 any list of standard include directories that the compiler may
255 search by default.
256 """
Antoine Pitrouf5413782009-05-15 17:27:30 +0000257 self.include_dirs = dirs[:]
Greg Ward3f81cf71999-07-10 02:03:53 +0000258
259
260 def add_library (self, libname):
Greg Wardc3a43b42000-06-24 18:10:48 +0000261 """Add 'libname' to the list of libraries that will be included in
262 all links driven by this compiler object. Note that 'libname'
263 should *not* be the name of a file containing a library, but the
264 name of the library itself: the actual filename will be inferred by
265 the linker, the compiler, or the compiler class (depending on the
266 platform).
Greg Ward3f81cf71999-07-10 02:03:53 +0000267
Greg Wardc3a43b42000-06-24 18:10:48 +0000268 The linker will be instructed to link against libraries in the
269 order they were supplied to 'add_library()' and/or
270 'set_libraries()'. It is perfectly valid to duplicate library
271 names; the linker will be instructed to link against libraries as
272 many times as they are mentioned.
273 """
Greg Ward3f81cf71999-07-10 02:03:53 +0000274 self.libraries.append (libname)
275
276 def set_libraries (self, libnames):
Greg Wardc3a43b42000-06-24 18:10:48 +0000277 """Set the list of libraries to be included in all links driven by
278 this compiler object to 'libnames' (a list of strings). This does
279 not affect any standard system libraries that the linker may
280 include by default.
281 """
Antoine Pitrouf5413782009-05-15 17:27:30 +0000282 self.libraries = libnames[:]
Greg Ward3f81cf71999-07-10 02:03:53 +0000283
284
285 def add_library_dir (self, dir):
286 """Add 'dir' to the list of directories that will be searched for
Greg Wardc3a43b42000-06-24 18:10:48 +0000287 libraries specified to 'add_library()' and 'set_libraries()'. The
288 linker will be instructed to search for libraries in the order they
289 are supplied to 'add_library_dir()' and/or 'set_library_dirs()'.
290 """
Greg Ward3f81cf71999-07-10 02:03:53 +0000291 self.library_dirs.append (dir)
292
293 def set_library_dirs (self, dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +0000294 """Set the list of library search directories to 'dirs' (a list of
295 strings). This does not affect any standard library search path
296 that the linker may search by default.
297 """
Antoine Pitrouf5413782009-05-15 17:27:30 +0000298 self.library_dirs = dirs[:]
Greg Ward3f81cf71999-07-10 02:03:53 +0000299
300
Greg Warde1aaaa61999-08-14 23:50:50 +0000301 def add_runtime_library_dir (self, dir):
302 """Add 'dir' to the list of directories that will be searched for
Greg Wardc3a43b42000-06-24 18:10:48 +0000303 shared libraries at runtime.
304 """
Greg Warde1aaaa61999-08-14 23:50:50 +0000305 self.runtime_library_dirs.append (dir)
306
307 def set_runtime_library_dirs (self, dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +0000308 """Set the list of directories to search for shared libraries at
309 runtime to 'dirs' (a list of strings). This does not affect any
310 standard search path that the runtime linker may search by
311 default.
312 """
Antoine Pitrouf5413782009-05-15 17:27:30 +0000313 self.runtime_library_dirs = dirs[:]
Greg Warde1aaaa61999-08-14 23:50:50 +0000314
315
Greg Ward3f81cf71999-07-10 02:03:53 +0000316 def add_link_object (self, object):
Greg Wardc3a43b42000-06-24 18:10:48 +0000317 """Add 'object' to the list of object files (or analogues, such as
Greg Ward612eb9f2000-07-27 02:13:20 +0000318 explicitly named library files or the output of "resource
Greg Wardc3a43b42000-06-24 18:10:48 +0000319 compilers") to be included in every link driven by this compiler
320 object.
321 """
Greg Ward3f81cf71999-07-10 02:03:53 +0000322 self.objects.append (object)
323
324 def set_link_objects (self, objects):
Greg Wardc3a43b42000-06-24 18:10:48 +0000325 """Set the list of object files (or analogues) to be included in
326 every link to 'objects'. This does not affect any standard object
327 files that the linker may include by default (such as system
328 libraries).
329 """
Antoine Pitrouf5413782009-05-15 17:27:30 +0000330 self.objects = objects[:]
Greg Ward3f81cf71999-07-10 02:03:53 +0000331
332
Thomas Hellere6500802002-04-25 17:03:30 +0000333 # -- Private utility methods --------------------------------------
Greg Ward32c4a8a2000-03-06 03:40:29 +0000334 # (here for the convenience of subclasses)
335
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000336 # Helper method to prep compiler in subclass compile() methods
337
338 def _setup_compile(self, outdir, macros, incdirs, sources, depends,
339 extra):
340 """Process arguments and decide which source files to compile.
341
342 Merges _fix_compile_args() and _prep_compile().
343 """
344 if outdir is None:
345 outdir = self.output_dir
Tarek Ziadé2b66da72009-12-21 01:22:46 +0000346 elif not isinstance(outdir, str):
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000347 raise TypeError, "'output_dir' must be a string or None"
348
349 if macros is None:
350 macros = self.macros
Tarek Ziadé2b66da72009-12-21 01:22:46 +0000351 elif isinstance(macros, list):
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000352 macros = macros + (self.macros or [])
353 else:
354 raise TypeError, "'macros' (if supplied) must be a list of tuples"
355
356 if incdirs is None:
357 incdirs = self.include_dirs
Tarek Ziadé2b66da72009-12-21 01:22:46 +0000358 elif isinstance(incdirs, (list, tuple)):
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000359 incdirs = list(incdirs) + (self.include_dirs or [])
360 else:
361 raise TypeError, \
362 "'include_dirs' (if supplied) must be a list of strings"
363
364 if extra is None:
365 extra = []
366
367 # Get the list of expected output (object) files
Andrew M. Kuchling8c6e0ec2002-12-29 17:00:57 +0000368 objects = self.object_filenames(sources,
Bob Ippolitoad647852006-05-26 14:07:23 +0000369 strip_dir=0,
Andrew M. Kuchling8c6e0ec2002-12-29 17:00:57 +0000370 output_dir=outdir)
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000371 assert len(objects) == len(sources)
372
373 # XXX should redo this code to eliminate skip_source entirely.
374 # XXX instead create build and issue skip messages inline
375
376 if self.force:
377 skip_source = {} # rebuild everything
378 for source in sources:
379 skip_source[source] = 0
380 elif depends is None:
381 # If depends is None, figure out which source files we
382 # have to recompile according to a simplistic check. We
383 # just compare the source and object file, no deep
384 # dependency checking involving header files.
385 skip_source = {} # rebuild everything
386 for source in sources: # no wait, rebuild nothing
387 skip_source[source] = 1
388
389 n_sources, n_objects = newer_pairwise(sources, objects)
390 for source in n_sources: # no really, only rebuild what's
391 skip_source[source] = 0 # out-of-date
392 else:
393 # If depends is a list of files, then do a different
394 # simplistic check. Assume that each object depends on
395 # its source and all files in the depends list.
396 skip_source = {}
397 # L contains all the depends plus a spot at the end for a
398 # particular source file
399 L = depends[:] + [None]
400 for i in range(len(objects)):
401 source = sources[i]
402 L[-1] = source
403 if newer_group(L, objects[i]):
404 skip_source[source] = 0
405 else:
406 skip_source[source] = 1
407
408 pp_opts = gen_preprocess_options(macros, incdirs)
409
410 build = {}
411 for i in range(len(sources)):
412 src = sources[i]
413 obj = objects[i]
414 ext = os.path.splitext(src)[1]
415 self.mkpath(os.path.dirname(obj))
416 if skip_source[src]:
417 log.debug("skipping %s (%s up-to-date)", src, obj)
418 else:
419 build[obj] = src, ext
420
421 return macros, objects, extra, pp_opts, build
422
423 def _get_cc_args(self, pp_opts, debug, before):
424 # works for unixccompiler, emxccompiler, cygwinccompiler
425 cc_args = pp_opts + ['-c']
426 if debug:
427 cc_args[:0] = ['-g']
428 if before:
429 cc_args[:0] = before
430 return cc_args
431
Greg Ward32c4a8a2000-03-06 03:40:29 +0000432 def _fix_compile_args (self, output_dir, macros, include_dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +0000433 """Typecheck and fix-up some of the arguments to the 'compile()'
434 method, and return fixed-up values. Specifically: if 'output_dir'
435 is None, replaces it with 'self.output_dir'; ensures that 'macros'
436 is a list, and augments it with 'self.macros'; ensures that
437 'include_dirs' is a list, and augments it with 'self.include_dirs'.
438 Guarantees that the returned values are of the correct type,
439 i.e. for 'output_dir' either string or None, and for 'macros' and
440 'include_dirs' either list or None.
441 """
Greg Ward32c4a8a2000-03-06 03:40:29 +0000442 if output_dir is None:
443 output_dir = self.output_dir
444 elif type (output_dir) is not StringType:
445 raise TypeError, "'output_dir' must be a string or None"
446
447 if macros is None:
448 macros = self.macros
Tarek Ziadé2b66da72009-12-21 01:22:46 +0000449 elif isinstance(macros, list):
Greg Ward32c4a8a2000-03-06 03:40:29 +0000450 macros = macros + (self.macros or [])
451 else:
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000452 raise TypeError, "'macros' (if supplied) must be a list of tuples"
Greg Ward32c4a8a2000-03-06 03:40:29 +0000453
454 if include_dirs is None:
455 include_dirs = self.include_dirs
Tarek Ziadé2b66da72009-12-21 01:22:46 +0000456 elif isinstance(include_dirs, (list, tuple)):
Greg Ward32c4a8a2000-03-06 03:40:29 +0000457 include_dirs = list (include_dirs) + (self.include_dirs or [])
458 else:
459 raise TypeError, \
460 "'include_dirs' (if supplied) must be a list of strings"
Fred Drakeb94b8492001-12-06 20:51:35 +0000461
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000462 return output_dir, macros, include_dirs
Greg Ward32c4a8a2000-03-06 03:40:29 +0000463
464 # _fix_compile_args ()
465
466
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000467 def _prep_compile(self, sources, output_dir, depends=None):
468 """Decide which souce files must be recompiled.
469
470 Determine the list of object files corresponding to 'sources',
471 and figure out which ones really need to be recompiled.
472 Return a list of all object files and a dictionary telling
473 which source files can be skipped.
Greg Wardc3a43b42000-06-24 18:10:48 +0000474 """
Fred Drakeb94b8492001-12-06 20:51:35 +0000475 # Get the list of expected output (object) files
Bob Ippolitoad647852006-05-26 14:07:23 +0000476 objects = self.object_filenames(sources, output_dir=output_dir)
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000477 assert len(objects) == len(sources)
Greg Ward32c4a8a2000-03-06 03:40:29 +0000478
479 if self.force:
480 skip_source = {} # rebuild everything
481 for source in sources:
482 skip_source[source] = 0
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000483 elif depends is None:
484 # If depends is None, figure out which source files we
485 # have to recompile according to a simplistic check. We
486 # just compare the source and object file, no deep
487 # dependency checking involving header files.
Greg Ward32c4a8a2000-03-06 03:40:29 +0000488 skip_source = {} # rebuild everything
489 for source in sources: # no wait, rebuild nothing
490 skip_source[source] = 1
491
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000492 n_sources, n_objects = newer_pairwise(sources, objects)
Greg Wardc3a43b42000-06-24 18:10:48 +0000493 for source in n_sources: # no really, only rebuild what's
494 skip_source[source] = 0 # out-of-date
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000495 else:
496 # If depends is a list of files, then do a different
497 # simplistic check. Assume that each object depends on
498 # its source and all files in the depends list.
499 skip_source = {}
500 # L contains all the depends plus a spot at the end for a
501 # particular source file
502 L = depends[:] + [None]
503 for i in range(len(objects)):
504 source = sources[i]
505 L[-1] = source
506 if newer_group(L, objects[i]):
507 skip_source[source] = 0
508 else:
509 skip_source[source] = 1
Greg Ward32c4a8a2000-03-06 03:40:29 +0000510
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000511 return objects, skip_source
Greg Ward32c4a8a2000-03-06 03:40:29 +0000512
513 # _prep_compile ()
514
515
Greg Wardf10f95d2000-03-26 21:37:09 +0000516 def _fix_object_args (self, objects, output_dir):
Greg Wardc3a43b42000-06-24 18:10:48 +0000517 """Typecheck and fix up some arguments supplied to various methods.
518 Specifically: ensure that 'objects' is a list; if output_dir is
519 None, replace with self.output_dir. Return fixed versions of
520 'objects' and 'output_dir'.
521 """
Tarek Ziadé2b66da72009-12-21 01:22:46 +0000522 if not isinstance(objects, (list, tuple)):
Greg Ward32c4a8a2000-03-06 03:40:29 +0000523 raise TypeError, \
524 "'objects' must be a list or tuple of strings"
525 objects = list (objects)
Fred Drakeb94b8492001-12-06 20:51:35 +0000526
Greg Ward32c4a8a2000-03-06 03:40:29 +0000527 if output_dir is None:
528 output_dir = self.output_dir
Tarek Ziadé2b66da72009-12-21 01:22:46 +0000529 elif not isinstance(output_dir, str):
Greg Ward32c4a8a2000-03-06 03:40:29 +0000530 raise TypeError, "'output_dir' must be a string or None"
531
Greg Wardf10f95d2000-03-26 21:37:09 +0000532 return (objects, output_dir)
Greg Ward32c4a8a2000-03-06 03:40:29 +0000533
Greg Ward32c4a8a2000-03-06 03:40:29 +0000534
Greg Wardf10f95d2000-03-26 21:37:09 +0000535 def _fix_lib_args (self, libraries, library_dirs, runtime_library_dirs):
536 """Typecheck and fix up some of the arguments supplied to the
Greg Wardc3a43b42000-06-24 18:10:48 +0000537 'link_*' methods. Specifically: ensure that all arguments are
538 lists, and augment them with their permanent versions
539 (eg. 'self.libraries' augments 'libraries'). Return a tuple with
540 fixed versions of all arguments.
541 """
Greg Wardf10f95d2000-03-26 21:37:09 +0000542 if libraries is None:
543 libraries = self.libraries
Tarek Ziadé2b66da72009-12-21 01:22:46 +0000544 elif isinstance(libraries, (list, tuple)):
Greg Wardf10f95d2000-03-26 21:37:09 +0000545 libraries = list (libraries) + (self.libraries or [])
Greg Ward32c4a8a2000-03-06 03:40:29 +0000546 else:
Greg Wardf10f95d2000-03-26 21:37:09 +0000547 raise TypeError, \
548 "'libraries' (if supplied) must be a list of strings"
Greg Ward32c4a8a2000-03-06 03:40:29 +0000549
Greg Wardf10f95d2000-03-26 21:37:09 +0000550 if library_dirs is None:
551 library_dirs = self.library_dirs
Tarek Ziadé2b66da72009-12-21 01:22:46 +0000552 elif isinstance(library_dirs, (list, tuple)):
Greg Wardf10f95d2000-03-26 21:37:09 +0000553 library_dirs = list (library_dirs) + (self.library_dirs or [])
554 else:
555 raise TypeError, \
556 "'library_dirs' (if supplied) must be a list of strings"
557
558 if runtime_library_dirs is None:
559 runtime_library_dirs = self.runtime_library_dirs
Tarek Ziadé2b66da72009-12-21 01:22:46 +0000560 elif isinstance(runtime_library_dirs, (list, tuple)):
Greg Wardf10f95d2000-03-26 21:37:09 +0000561 runtime_library_dirs = (list (runtime_library_dirs) +
562 (self.runtime_library_dirs or []))
563 else:
564 raise TypeError, \
565 "'runtime_library_dirs' (if supplied) " + \
566 "must be a list of strings"
567
568 return (libraries, library_dirs, runtime_library_dirs)
569
570 # _fix_lib_args ()
Greg Ward32c4a8a2000-03-06 03:40:29 +0000571
572
573 def _need_link (self, objects, output_file):
Greg Wardc3a43b42000-06-24 18:10:48 +0000574 """Return true if we need to relink the files listed in 'objects'
575 to recreate 'output_file'.
576 """
Greg Ward32c4a8a2000-03-06 03:40:29 +0000577 if self.force:
578 return 1
579 else:
580 if self.dry_run:
581 newer = newer_group (objects, output_file, missing='newer')
582 else:
583 newer = newer_group (objects, output_file)
584 return newer
585
586 # _need_link ()
587
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000588 def detect_language (self, sources):
589 """Detect the language of a given file, or list of files. Uses
590 language_map, and language_order to do the job.
591 """
Tarek Ziadé2b66da72009-12-21 01:22:46 +0000592 if not isinstance(sources, list):
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000593 sources = [sources]
594 lang = None
595 index = len(self.language_order)
596 for source in sources:
597 base, ext = os.path.splitext(source)
598 extlang = self.language_map.get(ext)
599 try:
600 extindex = self.language_order.index(extlang)
601 if extindex < index:
602 lang = extlang
603 index = extindex
604 except ValueError:
605 pass
606 return lang
607
608 # detect_language ()
Greg Ward32c4a8a2000-03-06 03:40:29 +0000609
Greg Ward3f81cf71999-07-10 02:03:53 +0000610 # -- Worker methods ------------------------------------------------
611 # (must be implemented by subclasses)
612
Greg Ward3ff3b032000-06-21 02:58:46 +0000613 def preprocess (self,
614 source,
615 output_file=None,
616 macros=None,
617 include_dirs=None,
618 extra_preargs=None,
619 extra_postargs=None):
620 """Preprocess a single C/C++ source file, named in 'source'.
621 Output will be written to file named 'output_file', or stdout if
622 'output_file' not supplied. 'macros' is a list of macro
623 definitions as for 'compile()', which will augment the macros set
624 with 'define_macro()' and 'undefine_macro()'. 'include_dirs' is a
625 list of directory names that will be added to the default list.
Greg Warde5c62bf2000-06-25 02:08:18 +0000626
627 Raises PreprocessError on failure.
Greg Ward3ff3b032000-06-21 02:58:46 +0000628 """
629 pass
630
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000631 def compile(self, sources, output_dir=None, macros=None,
632 include_dirs=None, debug=0, extra_preargs=None,
633 extra_postargs=None, depends=None):
634 """Compile one or more source files.
635
636 'sources' must be a list of filenames, most likely C/C++
637 files, but in reality anything that can be handled by a
638 particular compiler and compiler class (eg. MSVCCompiler can
639 handle resource files in 'sources'). Return a list of object
640 filenames, one per source filename in 'sources'. Depending on
641 the implementation, not all source files will necessarily be
642 compiled, but all corresponding object filenames will be
643 returned.
Greg Ward32c4a8a2000-03-06 03:40:29 +0000644
Greg Wardc3a43b42000-06-24 18:10:48 +0000645 If 'output_dir' is given, object files will be put under it, while
646 retaining their original path component. That is, "foo/bar.c"
647 normally compiles to "foo/bar.o" (for a Unix implementation); if
648 'output_dir' is "build", then it would compile to
649 "build/foo/bar.o".
Greg Ward3f81cf71999-07-10 02:03:53 +0000650
Greg Wardc3a43b42000-06-24 18:10:48 +0000651 'macros', if given, must be a list of macro definitions. A macro
652 definition is either a (name, value) 2-tuple or a (name,) 1-tuple.
653 The former defines a macro; if the value is None, the macro is
654 defined without an explicit value. The 1-tuple case undefines a
655 macro. Later definitions/redefinitions/ undefinitions take
656 precedence.
Greg Ward3f81cf71999-07-10 02:03:53 +0000657
Greg Wardc3a43b42000-06-24 18:10:48 +0000658 'include_dirs', if given, must be a list of strings, the
659 directories to add to the default include file search path for this
660 compilation only.
Greg Ward3c045a52000-02-09 02:16:14 +0000661
Greg Wardc3a43b42000-06-24 18:10:48 +0000662 'debug' is a boolean; if true, the compiler will be instructed to
663 output debug symbols in (or alongside) the object file(s).
Greg Ward802d6b71999-09-29 12:20:55 +0000664
Greg Wardc3a43b42000-06-24 18:10:48 +0000665 'extra_preargs' and 'extra_postargs' are implementation- dependent.
666 On platforms that have the notion of a command-line (e.g. Unix,
667 DOS/Windows), they are most likely lists of strings: extra
668 command-line arguments to prepand/append to the compiler command
669 line. On other platforms, consult the implementation class
670 documentation. In any event, they are intended as an escape hatch
671 for those occasions when the abstract compiler framework doesn't
672 cut the mustard.
Greg Wardd1517112000-05-30 01:56:44 +0000673
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000674 'depends', if given, is a list of filenames that all targets
675 depend on. If a source file is older than any file in
676 depends, then the source file will be recompiled. This
677 supports dependency tracking, but only at a coarse
678 granularity.
679
Greg Wardc3a43b42000-06-24 18:10:48 +0000680 Raises CompileError on failure.
681 """
Greg Ward3f81cf71999-07-10 02:03:53 +0000682
Jeremy Hylton6e08d222002-06-18 18:42:41 +0000683 # A concrete compiler class can either override this method
684 # entirely or implement _compile().
Tim Peters182b5ac2004-07-18 06:16:08 +0000685
Jeremy Hylton6e08d222002-06-18 18:42:41 +0000686 macros, objects, extra_postargs, pp_opts, build = \
687 self._setup_compile(output_dir, macros, include_dirs, sources,
688 depends, extra_postargs)
689 cc_args = self._get_cc_args(pp_opts, debug, extra_preargs)
690
Thomas Heller9436a752003-12-05 20:12:23 +0000691 for obj in objects:
692 try:
693 src, ext = build[obj]
694 except KeyError:
695 continue
Jeremy Hylton6e08d222002-06-18 18:42:41 +0000696 self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
697
698 # Return *all* object filenames, not just the ones we just built.
699 return objects
700
701 def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
702 """Compile 'src' to product 'obj'."""
Tim Peters182b5ac2004-07-18 06:16:08 +0000703
Jeremy Hylton6e08d222002-06-18 18:42:41 +0000704 # A concrete compiler class that does not override compile()
705 # should implement _compile().
706 pass
Greg Ward3f81cf71999-07-10 02:03:53 +0000707
Greg Ward036c8052000-03-10 01:48:32 +0000708 def create_static_lib (self,
709 objects,
710 output_libname,
711 output_dir=None,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000712 debug=0,
713 target_lang=None):
Greg Wardc3a43b42000-06-24 18:10:48 +0000714 """Link a bunch of stuff together to create a static library file.
715 The "bunch of stuff" consists of the list of object files supplied
716 as 'objects', the extra object files supplied to
717 'add_link_object()' and/or 'set_link_objects()', the libraries
718 supplied to 'add_library()' and/or 'set_libraries()', and the
719 libraries supplied as 'libraries' (if any).
Greg Ward3f81cf71999-07-10 02:03:53 +0000720
Greg Wardc3a43b42000-06-24 18:10:48 +0000721 'output_libname' should be a library name, not a filename; the
722 filename will be inferred from the library name. 'output_dir' is
723 the directory where the library file will be put.
Greg Ward3c045a52000-02-09 02:16:14 +0000724
Greg Wardc3a43b42000-06-24 18:10:48 +0000725 'debug' is a boolean; if true, debugging information will be
726 included in the library (note that on most platforms, it is the
727 compile step where this matters: the 'debug' flag is included here
728 just for consistency).
Greg Wardd1517112000-05-30 01:56:44 +0000729
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000730 'target_lang' is the target language for which the given objects
731 are being compiled. This allows specific linkage time treatment of
732 certain languages.
733
Greg Wardc3a43b42000-06-24 18:10:48 +0000734 Raises LibError on failure.
735 """
Greg Ward3c045a52000-02-09 02:16:14 +0000736 pass
Fred Drakeb94b8492001-12-06 20:51:35 +0000737
Greg Ward3c045a52000-02-09 02:16:14 +0000738
Greg Ward42406482000-09-27 02:08:14 +0000739 # values for target_desc parameter in link()
740 SHARED_OBJECT = "shared_object"
741 SHARED_LIBRARY = "shared_library"
742 EXECUTABLE = "executable"
743
744 def link (self,
745 target_desc,
746 objects,
747 output_filename,
748 output_dir=None,
749 libraries=None,
750 library_dirs=None,
751 runtime_library_dirs=None,
752 export_symbols=None,
753 debug=0,
754 extra_preargs=None,
755 extra_postargs=None,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000756 build_temp=None,
757 target_lang=None):
Greg Ward42406482000-09-27 02:08:14 +0000758 """Link a bunch of stuff together to create an executable or
759 shared library file.
760
761 The "bunch of stuff" consists of the list of object files supplied
762 as 'objects'. 'output_filename' should be a filename. If
763 'output_dir' is supplied, 'output_filename' is relative to it
764 (i.e. 'output_filename' can provide directory components if
765 needed).
Greg Ward3febd601999-10-03 20:41:02 +0000766
Greg Wardc3a43b42000-06-24 18:10:48 +0000767 'libraries' is a list of libraries to link against. These are
768 library names, not filenames, since they're translated into
769 filenames in a platform-specific way (eg. "foo" becomes "libfoo.a"
770 on Unix and "foo.lib" on DOS/Windows). However, they can include a
771 directory component, which means the linker will look in that
772 specific directory rather than searching all the normal locations.
Greg Ward5299b6a2000-05-20 13:23:21 +0000773
Greg Wardc3a43b42000-06-24 18:10:48 +0000774 'library_dirs', if supplied, should be a list of directories to
775 search for libraries that were specified as bare library names
776 (ie. no directory component). These are on top of the system
777 default and those supplied to 'add_library_dir()' and/or
778 'set_library_dirs()'. 'runtime_library_dirs' is a list of
779 directories that will be embedded into the shared library and used
780 to search for other shared libraries that *it* depends on at
781 run-time. (This may only be relevant on Unix.)
Greg Ward802d6b71999-09-29 12:20:55 +0000782
Greg Wardc3a43b42000-06-24 18:10:48 +0000783 'export_symbols' is a list of symbols that the shared library will
784 export. (This appears to be relevant only on Windows.)
Greg Ward3c045a52000-02-09 02:16:14 +0000785
Greg Wardc3a43b42000-06-24 18:10:48 +0000786 'debug' is as for 'compile()' and 'create_static_lib()', with the
787 slight distinction that it actually matters on most platforms (as
788 opposed to 'create_static_lib()', which includes a 'debug' flag
789 mostly for form's sake).
Greg Wardd1517112000-05-30 01:56:44 +0000790
Greg Wardc3a43b42000-06-24 18:10:48 +0000791 'extra_preargs' and 'extra_postargs' are as for 'compile()' (except
792 of course that they supply command-line arguments for the
793 particular linker being used).
Greg Ward3f81cf71999-07-10 02:03:53 +0000794
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000795 'target_lang' is the target language for which the given objects
796 are being compiled. This allows specific linkage time treatment of
797 certain languages.
798
Greg Wardc3a43b42000-06-24 18:10:48 +0000799 Raises LinkError on failure.
800 """
Greg Ward42406482000-09-27 02:08:14 +0000801 raise NotImplementedError
802
Fred Drakeb94b8492001-12-06 20:51:35 +0000803
Greg Ward264cf742000-09-27 02:24:21 +0000804 # Old 'link_*()' methods, rewritten to use the new 'link()' method.
Greg Ward42406482000-09-27 02:08:14 +0000805
806 def link_shared_lib (self,
807 objects,
808 output_libname,
809 output_dir=None,
810 libraries=None,
811 library_dirs=None,
812 runtime_library_dirs=None,
813 export_symbols=None,
814 debug=0,
815 extra_preargs=None,
816 extra_postargs=None,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000817 build_temp=None,
818 target_lang=None):
Fred Drakeb94b8492001-12-06 20:51:35 +0000819 self.link(CCompiler.SHARED_LIBRARY, objects,
Greg Ward42406482000-09-27 02:08:14 +0000820 self.library_filename(output_libname, lib_type='shared'),
821 output_dir,
822 libraries, library_dirs, runtime_library_dirs,
823 export_symbols, debug,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000824 extra_preargs, extra_postargs, build_temp, target_lang)
Fred Drakeb94b8492001-12-06 20:51:35 +0000825
Greg Ward3f81cf71999-07-10 02:03:53 +0000826
Greg Ward3f81cf71999-07-10 02:03:53 +0000827 def link_shared_object (self,
828 objects,
829 output_filename,
Greg Ward9b17cb51999-09-13 03:07:24 +0000830 output_dir=None,
Greg Ward3f81cf71999-07-10 02:03:53 +0000831 libraries=None,
Greg Ward26e48ea1999-08-29 18:17:36 +0000832 library_dirs=None,
Greg Wardf10f95d2000-03-26 21:37:09 +0000833 runtime_library_dirs=None,
Greg Ward5299b6a2000-05-20 13:23:21 +0000834 export_symbols=None,
Greg Ward3c045a52000-02-09 02:16:14 +0000835 debug=0,
Greg Ward802d6b71999-09-29 12:20:55 +0000836 extra_preargs=None,
Greg Wardbfc79d62000-06-28 01:29:09 +0000837 extra_postargs=None,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000838 build_temp=None,
839 target_lang=None):
Greg Ward42406482000-09-27 02:08:14 +0000840 self.link(CCompiler.SHARED_OBJECT, objects,
841 output_filename, output_dir,
842 libraries, library_dirs, runtime_library_dirs,
843 export_symbols, debug,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000844 extra_preargs, extra_postargs, build_temp, target_lang)
Greg Ward3f81cf71999-07-10 02:03:53 +0000845
Greg Warde1aaaa61999-08-14 23:50:50 +0000846
Greg Ward5baf1c22000-01-09 22:41:02 +0000847 def link_executable (self,
848 objects,
849 output_progname,
850 output_dir=None,
851 libraries=None,
852 library_dirs=None,
Greg Wardf10f95d2000-03-26 21:37:09 +0000853 runtime_library_dirs=None,
Greg Ward3c045a52000-02-09 02:16:14 +0000854 debug=0,
Greg Ward5baf1c22000-01-09 22:41:02 +0000855 extra_preargs=None,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000856 extra_postargs=None,
857 target_lang=None):
Fred Drakeb94b8492001-12-06 20:51:35 +0000858 self.link(CCompiler.EXECUTABLE, objects,
Greg Ward264cf742000-09-27 02:24:21 +0000859 self.executable_filename(output_progname), output_dir,
Fred Drakeb94b8492001-12-06 20:51:35 +0000860 libraries, library_dirs, runtime_library_dirs, None,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000861 debug, extra_preargs, extra_postargs, None, target_lang)
Greg Ward5baf1c22000-01-09 22:41:02 +0000862
863
Greg Wardf7edea72000-05-20 13:31:32 +0000864 # -- Miscellaneous methods -----------------------------------------
865 # These are all used by the 'gen_lib_options() function; there is
866 # no appropriate default implementation so subclasses should
867 # implement all of these.
868
869 def library_dir_option (self, dir):
Greg Wardc3a43b42000-06-24 18:10:48 +0000870 """Return the compiler option to add 'dir' to the list of
871 directories searched for libraries.
872 """
Greg Wardf7edea72000-05-20 13:31:32 +0000873 raise NotImplementedError
874
875 def runtime_library_dir_option (self, dir):
Greg Wardc3a43b42000-06-24 18:10:48 +0000876 """Return the compiler option to add 'dir' to the list of
877 directories searched for runtime libraries.
878 """
Greg Wardf7edea72000-05-20 13:31:32 +0000879 raise NotImplementedError
880
881 def library_option (self, lib):
882 """Return the compiler option to add 'dir' to the list of libraries
Greg Wardc3a43b42000-06-24 18:10:48 +0000883 linked into the shared library or executable.
884 """
Greg Wardf7edea72000-05-20 13:31:32 +0000885 raise NotImplementedError
886
Skip Montanarofa012612003-04-24 19:49:23 +0000887 def has_function(self, funcname,
888 includes=None,
889 include_dirs=None,
890 libraries=None,
891 library_dirs=None):
892 """Return a boolean indicating whether funcname is supported on
893 the current platform. The optional arguments can be used to
894 augment the compilation environment.
895 """
896
897 # this can't be included at module scope because it tries to
898 # import math which might not be available at that point - maybe
899 # the necessary logic should just be inlined?
900 import tempfile
901 if includes is None:
902 includes = []
903 if include_dirs is None:
904 include_dirs = []
905 if libraries is None:
906 libraries = []
907 if library_dirs is None:
908 library_dirs = []
909 fd, fname = tempfile.mkstemp(".c", funcname, text=True)
910 f = os.fdopen(fd, "w")
911 for incl in includes:
912 f.write("""#include "%s"\n""" % incl)
913 f.write("""\
914main (int argc, char **argv) {
915 %s();
916}
917""" % funcname)
918 f.close()
919 try:
920 objects = self.compile([fname], include_dirs=include_dirs)
921 except CompileError:
922 return False
923
924 try:
925 self.link_executable(objects, "a.out",
926 libraries=libraries,
927 library_dirs=library_dirs)
928 except (LinkError, TypeError):
929 return False
930 return True
931
Greg Warde5e60152000-08-04 01:28:39 +0000932 def find_library_file (self, dirs, lib, debug=0):
Greg Wardf7edea72000-05-20 13:31:32 +0000933 """Search the specified list of directories for a static or shared
Greg Warde5e60152000-08-04 01:28:39 +0000934 library file 'lib' and return the full path to that file. If
935 'debug' true, look for a debugging version (if that makes sense on
936 the current platform). Return None if 'lib' wasn't found in any of
937 the specified directories.
Greg Wardc3a43b42000-06-24 18:10:48 +0000938 """
Greg Wardf7edea72000-05-20 13:31:32 +0000939 raise NotImplementedError
940
Greg Ward32c4a8a2000-03-06 03:40:29 +0000941 # -- Filename generation methods -----------------------------------
Greg Warde1aaaa61999-08-14 23:50:50 +0000942
Greg Ward32c4a8a2000-03-06 03:40:29 +0000943 # The default implementation of the filename generating methods are
944 # prejudiced towards the Unix/DOS/Windows view of the world:
945 # * object files are named by replacing the source file extension
946 # (eg. .c/.cpp -> .o/.obj)
947 # * library files (shared or static) are named by plugging the
948 # library name and extension into a format string, eg.
949 # "lib%s.%s" % (lib_name, ".a") for Unix static libraries
950 # * executables are named by appending an extension (possibly
951 # empty) to the program name: eg. progname + ".exe" for
952 # Windows
953 #
954 # To reduce redundant code, these methods expect to find
955 # several attributes in the current object (presumably defined
956 # as class attributes):
957 # * src_extensions -
958 # list of C/C++ source file extensions, eg. ['.c', '.cpp']
959 # * obj_extension -
960 # object file extension, eg. '.o' or '.obj'
961 # * static_lib_extension -
962 # extension for static library files, eg. '.a' or '.lib'
963 # * shared_lib_extension -
964 # extension for shared library/object files, eg. '.so', '.dll'
965 # * static_lib_format -
966 # format string for generating static library filenames,
967 # eg. 'lib%s.%s' or '%s.%s'
968 # * shared_lib_format
969 # format string for generating shared library filenames
970 # (probably same as static_lib_format, since the extension
971 # is one of the intended parameters to the format string)
972 # * exe_extension -
973 # extension for executable files, eg. '' or '.exe'
Greg Ward9b17cb51999-09-13 03:07:24 +0000974
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000975 def object_filenames(self, source_filenames, strip_dir=0, output_dir=''):
Guido van Rossumcc3a6df2002-10-01 04:14:17 +0000976 if output_dir is None:
977 output_dir = ''
Greg Ward32c4a8a2000-03-06 03:40:29 +0000978 obj_names = []
979 for src_name in source_filenames:
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000980 base, ext = os.path.splitext(src_name)
Andrew M. Kuchling10da45e2003-02-26 18:52:07 +0000981 base = os.path.splitdrive(base)[1] # Chop off the drive
982 base = base[os.path.isabs(base):] # If abs, chop off leading /
Greg Ward32c4a8a2000-03-06 03:40:29 +0000983 if ext not in self.src_extensions:
Greg Ward9aa668b2000-06-24 02:22:49 +0000984 raise UnknownFileError, \
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000985 "unknown file type '%s' (from '%s')" % (ext, src_name)
Greg Ward32c4a8a2000-03-06 03:40:29 +0000986 if strip_dir:
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000987 base = os.path.basename(base)
988 obj_names.append(os.path.join(output_dir,
989 base + self.obj_extension))
Greg Ward32c4a8a2000-03-06 03:40:29 +0000990 return obj_names
Greg Warde1aaaa61999-08-14 23:50:50 +0000991
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000992 def shared_object_filename(self, basename, strip_dir=0, output_dir=''):
993 assert output_dir is not None
Greg Ward32c4a8a2000-03-06 03:40:29 +0000994 if strip_dir:
995 basename = os.path.basename (basename)
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000996 return os.path.join(output_dir, basename + self.shared_lib_extension)
Greg Warde1aaaa61999-08-14 23:50:50 +0000997
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000998 def executable_filename(self, basename, strip_dir=0, output_dir=''):
999 assert output_dir is not None
Greg Ward42406482000-09-27 02:08:14 +00001000 if strip_dir:
1001 basename = os.path.basename (basename)
1002 return os.path.join(output_dir, basename + (self.exe_extension or ''))
Greg Ward26e48ea1999-08-29 18:17:36 +00001003
Jeremy Hylton59b103c2002-06-13 17:26:30 +00001004 def library_filename(self, libname, lib_type='static', # or 'shared'
1005 strip_dir=0, output_dir=''):
1006 assert output_dir is not None
1007 if lib_type not in ("static", "shared", "dylib"):
Jack Jansene259e592001-08-27 15:08:16 +00001008 raise ValueError, "'lib_type' must be \"static\", \"shared\" or \"dylib\""
Jeremy Hylton59b103c2002-06-13 17:26:30 +00001009 fmt = getattr(self, lib_type + "_lib_format")
1010 ext = getattr(self, lib_type + "_lib_extension")
Greg Ward32c4a8a2000-03-06 03:40:29 +00001011
Jeremy Hylton59b103c2002-06-13 17:26:30 +00001012 dir, base = os.path.split (libname)
Greg Ward32c4a8a2000-03-06 03:40:29 +00001013 filename = fmt % (base, ext)
1014 if strip_dir:
1015 dir = ''
1016
Jeremy Hylton59b103c2002-06-13 17:26:30 +00001017 return os.path.join(output_dir, dir, filename)
Greg Ward32c4a8a2000-03-06 03:40:29 +00001018
Greg Warde1aaaa61999-08-14 23:50:50 +00001019
1020 # -- Utility methods -----------------------------------------------
1021
Greg Ward9b17cb51999-09-13 03:07:24 +00001022 def announce (self, msg, level=1):
Jeremy Hyltoncd8a1142002-06-04 20:14:43 +00001023 log.debug(msg)
Greg Ward9b17cb51999-09-13 03:07:24 +00001024
Greg Wardf813e592000-08-04 01:31:13 +00001025 def debug_print (self, msg):
Jeremy Hyltonfcd73532002-09-11 16:31:53 +00001026 from distutils.debug import DEBUG
Greg Wardf813e592000-08-04 01:31:13 +00001027 if DEBUG:
1028 print msg
1029
Greg Ward3febd601999-10-03 20:41:02 +00001030 def warn (self, msg):
1031 sys.stderr.write ("warning: %s\n" % msg)
1032
Greg Ward9dddbb42000-08-02 01:38:20 +00001033 def execute (self, func, args, msg=None, level=1):
Jeremy Hyltoncd8a1142002-06-04 20:14:43 +00001034 execute(func, args, msg, self.dry_run)
Greg Ward9dddbb42000-08-02 01:38:20 +00001035
Greg Warde1aaaa61999-08-14 23:50:50 +00001036 def spawn (self, cmd):
Jeremy Hyltoncd8a1142002-06-04 20:14:43 +00001037 spawn (cmd, dry_run=self.dry_run)
Greg Warde1aaaa61999-08-14 23:50:50 +00001038
Greg Ward9b17cb51999-09-13 03:07:24 +00001039 def move_file (self, src, dst):
Jeremy Hyltoncd8a1142002-06-04 20:14:43 +00001040 return move_file (src, dst, dry_run=self.dry_run)
Greg Ward9b17cb51999-09-13 03:07:24 +00001041
Greg Ward013f0c82000-03-01 14:43:12 +00001042 def mkpath (self, name, mode=0777):
Amaury Forgeot d'Arc240028c2008-12-11 00:03:42 +00001043 mkpath (name, mode, dry_run=self.dry_run)
Greg Ward013f0c82000-03-01 14:43:12 +00001044
Greg Warde1aaaa61999-08-14 23:50:50 +00001045
Greg Ward3f81cf71999-07-10 02:03:53 +00001046# class CCompiler
1047
1048
Marc-André Lemburg636b9062001-02-19 09:20:04 +00001049# Map a sys.platform/os.name ('posix', 'nt') to the default compiler
1050# type for that platform. Keys are interpreted as re match
1051# patterns. Order is important; platform mappings are preferred over
1052# OS names.
1053_default_compilers = (
1054
1055 # Platform string mappings
Andrew M. Kuchlinga34dbe02001-02-27 19:13:15 +00001056
1057 # on a cygwin built python we can use gcc like an ordinary UNIXish
1058 # compiler
1059 ('cygwin.*', 'unix'),
Marc-André Lemburg2544f512002-01-31 18:56:00 +00001060 ('os2emx', 'emx'),
Fred Drakeb94b8492001-12-06 20:51:35 +00001061
Marc-André Lemburg636b9062001-02-19 09:20:04 +00001062 # OS name mappings
1063 ('posix', 'unix'),
1064 ('nt', 'msvc'),
Fred Drakeb94b8492001-12-06 20:51:35 +00001065
Marc-André Lemburg636b9062001-02-19 09:20:04 +00001066 )
1067
1068def get_default_compiler(osname=None, platform=None):
1069
1070 """ Determine the default compiler to use for the given platform.
1071
1072 osname should be one of the standard Python OS names (i.e. the
1073 ones returned by os.name) and platform the common value
1074 returned by sys.platform for the platform in question.
1075
1076 The default values are os.name and sys.platform in case the
1077 parameters are not given.
1078
1079 """
1080 if osname is None:
1081 osname = os.name
1082 if platform is None:
1083 platform = sys.platform
1084 for pattern, compiler in _default_compilers:
1085 if re.match(pattern, platform) is not None or \
1086 re.match(pattern, osname) is not None:
1087 return compiler
1088 # Default to Unix compiler
1089 return 'unix'
Greg Ward802d6b71999-09-29 12:20:55 +00001090
1091# Map compiler types to (module_name, class_name) pairs -- ie. where to
1092# find the code that implements an interface to this compiler. (The module
1093# is assumed to be in the 'distutils' package.)
Greg Ward2ff78872000-06-24 00:23:20 +00001094compiler_class = { 'unix': ('unixccompiler', 'UnixCCompiler',
1095 "standard UNIX-style compiler"),
1096 'msvc': ('msvccompiler', 'MSVCCompiler',
1097 "Microsoft Visual C++"),
1098 'cygwin': ('cygwinccompiler', 'CygwinCCompiler',
1099 "Cygwin port of GNU C Compiler for Win32"),
1100 'mingw32': ('cygwinccompiler', 'Mingw32CCompiler',
1101 "Mingw32 port of GNU C Compiler for Win32"),
Greg Wardbfc79d62000-06-28 01:29:09 +00001102 'bcpp': ('bcppcompiler', 'BCPPCompiler',
1103 "Borland C++ Compiler"),
Marc-André Lemburg2544f512002-01-31 18:56:00 +00001104 'emx': ('emxccompiler', 'EMXCCompiler',
1105 "EMX port of GNU C Compiler for OS/2"),
Greg Ward802d6b71999-09-29 12:20:55 +00001106 }
1107
Greg Ward9d17a7a2000-06-07 03:00:06 +00001108def show_compilers():
Greg Ward2ff78872000-06-24 00:23:20 +00001109 """Print list of available compilers (used by the "--help-compiler"
1110 options to "build", "build_ext", "build_clib").
1111 """
1112 # XXX this "knows" that the compiler option it's describing is
1113 # "--compiler", which just happens to be the case for the three
1114 # commands that use it.
Fred Drakeb94b8492001-12-06 20:51:35 +00001115 from distutils.fancy_getopt import FancyGetopt
Greg Ward2ff78872000-06-24 00:23:20 +00001116 compilers = []
Greg Ward9d17a7a2000-06-07 03:00:06 +00001117 for compiler in compiler_class.keys():
Jeremy Hylton65d6edb2000-07-07 20:45:21 +00001118 compilers.append(("compiler="+compiler, None,
Greg Ward2ff78872000-06-24 00:23:20 +00001119 compiler_class[compiler][2]))
1120 compilers.sort()
1121 pretty_printer = FancyGetopt(compilers)
Greg Ward9d17a7a2000-06-07 03:00:06 +00001122 pretty_printer.print_help("List of available compilers:")
Fred Drakeb94b8492001-12-06 20:51:35 +00001123
Greg Ward802d6b71999-09-29 12:20:55 +00001124
Greg Warde1aaaa61999-08-14 23:50:50 +00001125def new_compiler (plat=None,
Greg Ward802d6b71999-09-29 12:20:55 +00001126 compiler=None,
Greg Warde1aaaa61999-08-14 23:50:50 +00001127 verbose=0,
Greg Ward3febd601999-10-03 20:41:02 +00001128 dry_run=0,
1129 force=0):
Greg Ward802d6b71999-09-29 12:20:55 +00001130 """Generate an instance of some CCompiler subclass for the supplied
Greg Wardc3a43b42000-06-24 18:10:48 +00001131 platform/compiler combination. 'plat' defaults to 'os.name'
1132 (eg. 'posix', 'nt'), and 'compiler' defaults to the default compiler
1133 for that platform. Currently only 'posix' and 'nt' are supported, and
1134 the default compilers are "traditional Unix interface" (UnixCCompiler
1135 class) and Visual C++ (MSVCCompiler class). Note that it's perfectly
1136 possible to ask for a Unix compiler object under Windows, and a
1137 Microsoft compiler object under Unix -- if you supply a value for
1138 'compiler', 'plat' is ignored.
1139 """
Greg Ward802d6b71999-09-29 12:20:55 +00001140 if plat is None:
1141 plat = os.name
1142
1143 try:
1144 if compiler is None:
Marc-André Lemburg636b9062001-02-19 09:20:04 +00001145 compiler = get_default_compiler(plat)
Fred Drakeb94b8492001-12-06 20:51:35 +00001146
Greg Ward2ff78872000-06-24 00:23:20 +00001147 (module_name, class_name, long_description) = compiler_class[compiler]
Greg Ward802d6b71999-09-29 12:20:55 +00001148 except KeyError:
1149 msg = "don't know how to compile C/C++ code on platform '%s'" % plat
1150 if compiler is not None:
1151 msg = msg + " with '%s' compiler" % compiler
1152 raise DistutilsPlatformError, msg
Fred Drakeb94b8492001-12-06 20:51:35 +00001153
Greg Ward802d6b71999-09-29 12:20:55 +00001154 try:
1155 module_name = "distutils." + module_name
1156 __import__ (module_name)
1157 module = sys.modules[module_name]
1158 klass = vars(module)[class_name]
1159 except ImportError:
1160 raise DistutilsModuleError, \
1161 "can't compile C/C++ code: unable to load module '%s'" % \
1162 module_name
1163 except KeyError:
1164 raise DistutilsModuleError, \
1165 ("can't compile C/C++ code: unable to find class '%s' " +
1166 "in module '%s'") % (class_name, module_name)
1167
Jeremy Hyltoncd8a1142002-06-04 20:14:43 +00001168 # XXX The None is necessary to preserve backwards compatibility
1169 # with classes that expect verbose to be the first positional
1170 # argument.
1171 return klass (None, dry_run, force)
Greg Wardf7a39ec1999-09-08 02:29:08 +00001172
1173
Greg Ward0bdd90a1999-12-12 17:19:58 +00001174def gen_preprocess_options (macros, include_dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +00001175 """Generate C pre-processor options (-D, -U, -I) as used by at least
1176 two types of compilers: the typical Unix compiler and Visual C++.
1177 'macros' is the usual thing, a list of 1- or 2-tuples, where (name,)
1178 means undefine (-U) macro 'name', and (name,value) means define (-D)
1179 macro 'name' to 'value'. 'include_dirs' is just a list of directory
1180 names to be added to the header file search path (-I). Returns a list
1181 of command-line options suitable for either Unix compilers or Visual
1182 C++.
1183 """
Greg Wardf7a39ec1999-09-08 02:29:08 +00001184 # XXX it would be nice (mainly aesthetic, and so we don't generate
1185 # stupid-looking command lines) to go over 'macros' and eliminate
1186 # redundant definitions/undefinitions (ie. ensure that only the
1187 # latest mention of a particular macro winds up on the command
1188 # line). I don't think it's essential, though, since most (all?)
1189 # Unix C compilers only pay attention to the latest -D or -U
1190 # mention of a macro on their command line. Similar situation for
Greg Ward0bdd90a1999-12-12 17:19:58 +00001191 # 'include_dirs'. I'm punting on both for now. Anyways, weeding out
Greg Wardf7a39ec1999-09-08 02:29:08 +00001192 # redundancies like this should probably be the province of
1193 # CCompiler, since the data structures used are inherited from it
1194 # and therefore common to all CCompiler classes.
1195
1196 pp_opts = []
1197 for macro in macros:
Greg Wardfbf8aff1999-09-21 18:35:09 +00001198
Tarek Ziadé2b66da72009-12-21 01:22:46 +00001199 if not (isinstance(macro, tuple) and
Greg Wardfbf8aff1999-09-21 18:35:09 +00001200 1 <= len (macro) <= 2):
1201 raise TypeError, \
1202 ("bad macro definition '%s': " +
1203 "each element of 'macros' list must be a 1- or 2-tuple") % \
1204 macro
1205
Greg Wardf7a39ec1999-09-08 02:29:08 +00001206 if len (macro) == 1: # undefine this macro
1207 pp_opts.append ("-U%s" % macro[0])
1208 elif len (macro) == 2:
1209 if macro[1] is None: # define with no explicit value
1210 pp_opts.append ("-D%s" % macro[0])
1211 else:
1212 # XXX *don't* need to be clever about quoting the
1213 # macro value here, because we're going to avoid the
1214 # shell at all costs when we spawn the command!
1215 pp_opts.append ("-D%s=%s" % macro)
1216
Greg Ward0bdd90a1999-12-12 17:19:58 +00001217 for dir in include_dirs:
Greg Wardf7a39ec1999-09-08 02:29:08 +00001218 pp_opts.append ("-I%s" % dir)
1219
1220 return pp_opts
1221
Greg Wardf7a39ec1999-09-08 02:29:08 +00001222
Tarek Ziadéc1df95e2009-06-16 08:31:01 +00001223def gen_lib_options(compiler, library_dirs, runtime_library_dirs, libraries):
Greg Wardf7a39ec1999-09-08 02:29:08 +00001224 """Generate linker options for searching library directories and
Tarek Ziadéc1df95e2009-06-16 08:31:01 +00001225 linking with specific libraries.
1226
1227 'libraries' and 'library_dirs' are, respectively, lists of library names
1228 (not filenames!) and search directories. Returns a list of command-line
1229 options suitable for use with some compiler (depending on the two format
1230 strings passed in).
Greg Wardc3a43b42000-06-24 18:10:48 +00001231 """
Greg Wardf7a39ec1999-09-08 02:29:08 +00001232 lib_opts = []
1233
1234 for dir in library_dirs:
Tarek Ziadéc1df95e2009-06-16 08:31:01 +00001235 lib_opts.append(compiler.library_dir_option(dir))
Greg Wardf7a39ec1999-09-08 02:29:08 +00001236
Greg Wardd03f88a2000-03-18 15:19:51 +00001237 for dir in runtime_library_dirs:
Tarek Ziadéc1df95e2009-06-16 08:31:01 +00001238 opt = compiler.runtime_library_dir_option(dir)
1239 if isinstance(opt, list):
1240 lib_opts.extend(opt)
Martin v. Löwis061f1322004-08-29 16:40:55 +00001241 else:
Tarek Ziadéc1df95e2009-06-16 08:31:01 +00001242 lib_opts.append(opt)
Greg Wardd03f88a2000-03-18 15:19:51 +00001243
Greg Wardf7a39ec1999-09-08 02:29:08 +00001244 # XXX it's important that we *not* remove redundant library mentions!
1245 # sometimes you really do have to say "-lfoo -lbar -lfoo" in order to
1246 # resolve all symbols. I just hope we never have to say "-lfoo obj.o
1247 # -lbar" to get things to work -- that's certainly a possibility, but a
1248 # pretty nasty way to arrange your C code.
1249
1250 for lib in libraries:
Tarek Ziadéc1df95e2009-06-16 08:31:01 +00001251 lib_dir, lib_name = os.path.split(lib)
1252 if lib_dir != '':
1253 lib_file = compiler.find_library_file([lib_dir], lib_name)
1254 if lib_file is not None:
1255 lib_opts.append(lib_file)
Greg Ward3febd601999-10-03 20:41:02 +00001256 else:
Tarek Ziadéc1df95e2009-06-16 08:31:01 +00001257 compiler.warn("no library file corresponding to "
1258 "'%s' found (skipping)" % lib)
Greg Ward3febd601999-10-03 20:41:02 +00001259 else:
Tarek Ziadéc1df95e2009-06-16 08:31:01 +00001260 lib_opts.append(compiler.library_option(lib))
Greg Wardf7a39ec1999-09-08 02:29:08 +00001261
1262 return lib_opts