blob: f4edb7c6a6a4ab65dc18dc5fc167c1243b7bcc69 [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
Marc-André Lemburg636b9062001-02-19 09:20:04 +00008import sys, os, re
Greg Ward3f81cf71999-07-10 02:03:53 +00009from copy import copy
10from distutils.errors import *
Greg Warde1aaaa61999-08-14 23:50:50 +000011from distutils.spawn import spawn
Greg Warde5c62bf2000-06-25 02:08:18 +000012from distutils.file_util import move_file
13from distutils.dir_util import mkpath
14from distutils.dep_util import newer_pairwise, newer_group
Greg Ward9dddbb42000-08-02 01:38:20 +000015from distutils.util import split_quoted, execute
Jeremy Hyltoncd8a1142002-06-04 20:14:43 +000016from distutils import log
Greg Ward3f81cf71999-07-10 02:03:53 +000017
18class CCompiler:
19 """Abstract base class to define the interface that must be implemented
Greg Wardc3a43b42000-06-24 18:10:48 +000020 by real compiler classes. Also has some utility methods used by
21 several compiler classes.
Greg Ward3f81cf71999-07-10 02:03:53 +000022
Greg Wardc3a43b42000-06-24 18:10:48 +000023 The basic idea behind a compiler abstraction class is that each
24 instance can be used for all the compile/link steps in building a
25 single project. Thus, attributes common to all of those compile and
26 link steps -- include directories, macros to define, libraries to link
27 against, etc. -- are attributes of the compiler instance. To allow for
28 variability in how individual files are treated, most of those
29 attributes may be varied on a per-compilation or per-link basis.
30 """
Greg Ward3f81cf71999-07-10 02:03:53 +000031
Greg Ward802d6b71999-09-29 12:20:55 +000032 # 'compiler_type' is a class attribute that identifies this class. It
33 # keeps code that wants to know what kind of compiler it's dealing with
34 # from having to import all possible compiler classes just to do an
35 # 'isinstance'. In concrete CCompiler subclasses, 'compiler_type'
36 # should really, really be one of the keys of the 'compiler_class'
37 # dictionary (see below -- used by the 'new_compiler()' factory
38 # function) -- authors of new compiler interface classes are
39 # responsible for updating 'compiler_class'!
40 compiler_type = None
Greg Ward3f81cf71999-07-10 02:03:53 +000041
42 # XXX things not handled by this compiler abstraction model:
43 # * client can't provide additional options for a compiler,
44 # e.g. warning, optimization, debugging flags. Perhaps this
45 # should be the domain of concrete compiler abstraction classes
46 # (UnixCCompiler, MSVCCompiler, etc.) -- or perhaps the base
47 # class should have methods for the common ones.
Greg Ward3f81cf71999-07-10 02:03:53 +000048 # * can't completely override the include or library searchg
49 # path, ie. no "cc -I -Idir1 -Idir2" or "cc -L -Ldir1 -Ldir2".
Greg Warde1aaaa61999-08-14 23:50:50 +000050 # I'm not sure how widely supported this is even by Unix
Greg Ward3f81cf71999-07-10 02:03:53 +000051 # compilers, much less on other platforms. And I'm even less
Greg Warde1aaaa61999-08-14 23:50:50 +000052 # sure how useful it is; maybe for cross-compiling, but
53 # support for that is a ways off. (And anyways, cross
54 # compilers probably have a dedicated binary with the
55 # right paths compiled in. I hope.)
Greg Ward3f81cf71999-07-10 02:03:53 +000056 # * can't do really freaky things with the library list/library
57 # dirs, e.g. "-Ldir1 -lfoo -Ldir2 -lfoo" to link against
58 # different versions of libfoo.a in different locations. I
59 # think this is useless without the ability to null out the
60 # library search path anyways.
Fred Drakeb94b8492001-12-06 20:51:35 +000061
Greg Ward3f81cf71999-07-10 02:03:53 +000062
Greg Ward32c4a8a2000-03-06 03:40:29 +000063 # Subclasses that rely on the standard filename generation methods
64 # implemented below should override these; see the comment near
65 # those methods ('object_filenames()' et. al.) for details:
66 src_extensions = None # list of strings
67 obj_extension = None # string
68 static_lib_extension = None
69 shared_lib_extension = None # string
70 static_lib_format = None # format string
71 shared_lib_format = None # prob. same as static_lib_format
72 exe_extension = None # string
73
Gustavo Niemeyer6b016852002-11-05 16:12:02 +000074 # Default language settings. language_map is used to detect a source
75 # file or Extension target language, checking source filenames.
76 # language_order is used to detect the language precedence, when deciding
77 # what language to use when mixing source types. For example, if some
78 # extension has two files with ".c" extension, and one with ".cpp", it
79 # is still linked as c++.
80 language_map = {".c" : "c",
81 ".cc" : "c++",
82 ".cpp" : "c++",
83 ".cxx" : "c++",
84 ".m" : "objc",
85 }
86 language_order = ["c++", "objc", "c"]
Greg Ward32c4a8a2000-03-06 03:40:29 +000087
Collin Winter5b7e9d72007-08-30 03:52:21 +000088 def __init__(self, verbose=0, dry_run=0, force=0):
Greg Warde1aaaa61999-08-14 23:50:50 +000089 self.dry_run = dry_run
Greg Ward3febd601999-10-03 20:41:02 +000090 self.force = force
Skip Montanaro70e1d9b2002-10-01 17:39:59 +000091 self.verbose = verbose
Greg Ward3f81cf71999-07-10 02:03:53 +000092
Greg Ward9b17cb51999-09-13 03:07:24 +000093 # 'output_dir': a common output directory for object, library,
94 # shared object, and shared library files
95 self.output_dir = None
96
Greg Ward3f81cf71999-07-10 02:03:53 +000097 # 'macros': a list of macro definitions (or undefinitions). A
98 # macro definition is a 2-tuple (name, value), where the value is
99 # either a string or None (no explicit value). A macro
100 # undefinition is a 1-tuple (name,).
101 self.macros = []
102
Greg Ward3f81cf71999-07-10 02:03:53 +0000103 # 'include_dirs': a list of directories to search for include files
104 self.include_dirs = []
105
106 # 'libraries': a list of libraries to include in any link
107 # (library names, not filenames: eg. "foo" not "libfoo.a")
108 self.libraries = []
109
110 # 'library_dirs': a list of directories to search for libraries
111 self.library_dirs = []
112
Greg Warde1aaaa61999-08-14 23:50:50 +0000113 # 'runtime_library_dirs': a list of directories to search for
114 # shared libraries/objects at runtime
115 self.runtime_library_dirs = []
116
Greg Ward3f81cf71999-07-10 02:03:53 +0000117 # 'objects': a list of object files (or similar, such as explicitly
118 # named library files) to include on any link
119 self.objects = []
120
Greg Warde5c62bf2000-06-25 02:08:18 +0000121 for key in self.executables.keys():
122 self.set_executable(key, self.executables[key])
123
Collin Winter5b7e9d72007-08-30 03:52:21 +0000124 def set_executables(self, **kwargs):
Greg Warde5c62bf2000-06-25 02:08:18 +0000125 """Define the executables (and options for them) that will be run
126 to perform the various stages of compilation. The exact set of
127 executables that may be specified here depends on the compiler
128 class (via the 'executables' class attribute), but most will have:
129 compiler the C/C++ compiler
130 linker_so linker used to create shared objects and libraries
131 linker_exe linker used to create binary executables
132 archiver static library creator
133
134 On platforms with a command-line (Unix, DOS/Windows), each of these
135 is a string that will be split into executable name and (optional)
136 list of arguments. (Splitting the string is done similarly to how
137 Unix shells operate: words are delimited by spaces, but quotes and
138 backslashes can override this. See
139 'distutils.util.split_quoted()'.)
140 """
141
142 # Note that some CCompiler implementation classes will define class
143 # attributes 'cpp', 'cc', etc. with hard-coded executable names;
144 # this is appropriate when a compiler class is for exactly one
145 # compiler/OS combination (eg. MSVCCompiler). Other compiler
146 # classes (UnixCCompiler, in particular) are driven by information
147 # discovered at run-time, since there are many different ways to do
148 # basically the same things with Unix C compilers.
149
Collin Winter5b7e9d72007-08-30 03:52:21 +0000150 for key, value in kwargs.items():
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000151 if key not in self.executables:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000152 raise ValueError("unknown executable '%s' for class %s" % \
153 (key, self.__class__.__name__))
154 self.set_executable(key, value)
Greg Warde5c62bf2000-06-25 02:08:18 +0000155
156 def set_executable(self, key, value):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000157 if isinstance(value, str):
Greg Warde5c62bf2000-06-25 02:08:18 +0000158 setattr(self, key, split_quoted(value))
159 else:
160 setattr(self, key, value)
Fred Drakeb94b8492001-12-06 20:51:35 +0000161
Collin Winter5b7e9d72007-08-30 03:52:21 +0000162 def _find_macro(self, name):
Greg Ward3f81cf71999-07-10 02:03:53 +0000163 i = 0
164 for defn in self.macros:
165 if defn[0] == name:
166 return i
Collin Winter5b7e9d72007-08-30 03:52:21 +0000167 i += 1
Greg Ward3f81cf71999-07-10 02:03:53 +0000168 return None
169
Collin Winter5b7e9d72007-08-30 03:52:21 +0000170 def _check_macro_definitions(self, definitions):
Greg Ward3f81cf71999-07-10 02:03:53 +0000171 """Ensures that every element of 'definitions' is a valid macro
Greg Wardc3a43b42000-06-24 18:10:48 +0000172 definition, ie. either (name,value) 2-tuple or a (name,) tuple. Do
173 nothing if all definitions are OK, raise TypeError otherwise.
174 """
Greg Ward3f81cf71999-07-10 02:03:53 +0000175 for defn in definitions:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000176 if not (isinstance(defn, tuple) and
177 (len(defn) in (1, 2) and
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000178 (isinstance (defn[1], str) or defn[1] is None)) and
179 isinstance (defn[0], str)):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000180 raise TypeError(("invalid macro definition '%s': " % defn) + \
Greg Ward3f81cf71999-07-10 02:03:53 +0000181 "must be tuple (string,), (string, string), or " + \
Collin Winter5b7e9d72007-08-30 03:52:21 +0000182 "(string, None)")
Greg Ward3f81cf71999-07-10 02:03:53 +0000183
184
185 # -- Bookkeeping methods -------------------------------------------
186
Collin Winter5b7e9d72007-08-30 03:52:21 +0000187 def define_macro(self, name, value=None):
Greg Wardc3a43b42000-06-24 18:10:48 +0000188 """Define a preprocessor macro for all compilations driven by this
189 compiler object. The optional parameter 'value' should be a
190 string; if it is not supplied, then the macro will be defined
191 without an explicit value and the exact outcome depends on the
192 compiler used (XXX true? does ANSI say anything about this?)
193 """
Greg Ward3f81cf71999-07-10 02:03:53 +0000194 # Delete from the list of macro definitions/undefinitions if
195 # already there (so that this one will take precedence).
196 i = self._find_macro (name)
197 if i is not None:
198 del self.macros[i]
199
Collin Winter5b7e9d72007-08-30 03:52:21 +0000200 self.macros.append((name, value))
Greg Ward3f81cf71999-07-10 02:03:53 +0000201
Collin Winter5b7e9d72007-08-30 03:52:21 +0000202 def undefine_macro(self, name):
Greg Ward3f81cf71999-07-10 02:03:53 +0000203 """Undefine a preprocessor macro for all compilations driven by
Greg Wardc3a43b42000-06-24 18:10:48 +0000204 this compiler object. If the same macro is defined by
205 'define_macro()' and undefined by 'undefine_macro()' the last call
206 takes precedence (including multiple redefinitions or
207 undefinitions). If the macro is redefined/undefined on a
208 per-compilation basis (ie. in the call to 'compile()'), then that
209 takes precedence.
210 """
Greg Ward3f81cf71999-07-10 02:03:53 +0000211 # Delete from the list of macro definitions/undefinitions if
212 # already there (so that this one will take precedence).
213 i = self._find_macro (name)
214 if i is not None:
215 del self.macros[i]
216
217 undefn = (name,)
Collin Winter5b7e9d72007-08-30 03:52:21 +0000218 self.macros.append(undefn)
Greg Ward3f81cf71999-07-10 02:03:53 +0000219
Collin Winter5b7e9d72007-08-30 03:52:21 +0000220 def add_include_dir(self, dir):
Greg Wardc3a43b42000-06-24 18:10:48 +0000221 """Add 'dir' to the list of directories that will be searched for
222 header files. The compiler is instructed to search directories in
223 the order in which they are supplied by successive calls to
224 'add_include_dir()'.
225 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000226 self.include_dirs.append(dir)
Greg Ward3f81cf71999-07-10 02:03:53 +0000227
Collin Winter5b7e9d72007-08-30 03:52:21 +0000228 def set_include_dirs(self, dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +0000229 """Set the list of directories that will be searched to 'dirs' (a
230 list of strings). Overrides any preceding calls to
231 'add_include_dir()'; subsequence calls to 'add_include_dir()' add
232 to the list passed to 'set_include_dirs()'. This does not affect
233 any list of standard include directories that the compiler may
234 search by default.
235 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000236 self.include_dirs = copy(dirs)
Greg Ward3f81cf71999-07-10 02:03:53 +0000237
Collin Winter5b7e9d72007-08-30 03:52:21 +0000238 def add_library(self, libname):
Greg Wardc3a43b42000-06-24 18:10:48 +0000239 """Add 'libname' to the list of libraries that will be included in
240 all links driven by this compiler object. Note that 'libname'
241 should *not* be the name of a file containing a library, but the
242 name of the library itself: the actual filename will be inferred by
243 the linker, the compiler, or the compiler class (depending on the
244 platform).
Greg Ward3f81cf71999-07-10 02:03:53 +0000245
Greg Wardc3a43b42000-06-24 18:10:48 +0000246 The linker will be instructed to link against libraries in the
247 order they were supplied to 'add_library()' and/or
248 'set_libraries()'. It is perfectly valid to duplicate library
249 names; the linker will be instructed to link against libraries as
250 many times as they are mentioned.
251 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000252 self.libraries.append(libname)
Greg Ward3f81cf71999-07-10 02:03:53 +0000253
Collin Winter5b7e9d72007-08-30 03:52:21 +0000254 def set_libraries(self, libnames):
Greg Wardc3a43b42000-06-24 18:10:48 +0000255 """Set the list of libraries to be included in all links driven by
256 this compiler object to 'libnames' (a list of strings). This does
257 not affect any standard system libraries that the linker may
258 include by default.
259 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000260 self.libraries = copy(libnames)
Greg Ward3f81cf71999-07-10 02:03:53 +0000261
Collin Winter5b7e9d72007-08-30 03:52:21 +0000262 def add_library_dir(self, dir):
Greg Ward3f81cf71999-07-10 02:03:53 +0000263 """Add 'dir' to the list of directories that will be searched for
Greg Wardc3a43b42000-06-24 18:10:48 +0000264 libraries specified to 'add_library()' and 'set_libraries()'. The
265 linker will be instructed to search for libraries in the order they
266 are supplied to 'add_library_dir()' and/or 'set_library_dirs()'.
267 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000268 self.library_dirs.append(dir)
Greg Ward3f81cf71999-07-10 02:03:53 +0000269
Collin Winter5b7e9d72007-08-30 03:52:21 +0000270 def set_library_dirs(self, dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +0000271 """Set the list of library search directories to 'dirs' (a list of
272 strings). This does not affect any standard library search path
273 that the linker may search by default.
274 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000275 self.library_dirs = copy(dirs)
Greg Ward3f81cf71999-07-10 02:03:53 +0000276
Collin Winter5b7e9d72007-08-30 03:52:21 +0000277 def add_runtime_library_dir(self, dir):
Greg Warde1aaaa61999-08-14 23:50:50 +0000278 """Add 'dir' to the list of directories that will be searched for
Greg Wardc3a43b42000-06-24 18:10:48 +0000279 shared libraries at runtime.
280 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000281 self.runtime_library_dirs.append(dir)
Greg Warde1aaaa61999-08-14 23:50:50 +0000282
Collin Winter5b7e9d72007-08-30 03:52:21 +0000283 def set_runtime_library_dirs(self, dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +0000284 """Set the list of directories to search for shared libraries at
285 runtime to 'dirs' (a list of strings). This does not affect any
286 standard search path that the runtime linker may search by
287 default.
288 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000289 self.runtime_library_dirs = copy(dirs)
Greg Warde1aaaa61999-08-14 23:50:50 +0000290
Collin Winter5b7e9d72007-08-30 03:52:21 +0000291 def add_link_object(self, object):
Greg Wardc3a43b42000-06-24 18:10:48 +0000292 """Add 'object' to the list of object files (or analogues, such as
Greg Ward612eb9f2000-07-27 02:13:20 +0000293 explicitly named library files or the output of "resource
Greg Wardc3a43b42000-06-24 18:10:48 +0000294 compilers") to be included in every link driven by this compiler
295 object.
296 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000297 self.objects.append(object)
Greg Ward3f81cf71999-07-10 02:03:53 +0000298
Collin Winter5b7e9d72007-08-30 03:52:21 +0000299 def set_link_objects(self, objects):
Greg Wardc3a43b42000-06-24 18:10:48 +0000300 """Set the list of object files (or analogues) to be included in
301 every link to 'objects'. This does not affect any standard object
302 files that the linker may include by default (such as system
303 libraries).
304 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000305 self.objects = copy(objects)
Greg Ward3f81cf71999-07-10 02:03:53 +0000306
307
Thomas Hellere6500802002-04-25 17:03:30 +0000308 # -- Private utility methods --------------------------------------
Greg Ward32c4a8a2000-03-06 03:40:29 +0000309 # (here for the convenience of subclasses)
310
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000311 # Helper method to prep compiler in subclass compile() methods
312
313 def _setup_compile(self, outdir, macros, incdirs, sources, depends,
314 extra):
315 """Process arguments and decide which source files to compile.
316
317 Merges _fix_compile_args() and _prep_compile().
318 """
319 if outdir is None:
320 outdir = self.output_dir
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000321 elif not isinstance(outdir, str):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000322 raise TypeError("'output_dir' must be a string or None")
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000323
324 if macros is None:
325 macros = self.macros
Collin Winter5b7e9d72007-08-30 03:52:21 +0000326 elif isinstance(macros, list):
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000327 macros = macros + (self.macros or [])
328 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000329 raise TypeError("'macros' (if supplied) must be a list of tuples")
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000330
331 if incdirs is None:
332 incdirs = self.include_dirs
Collin Winter5b7e9d72007-08-30 03:52:21 +0000333 elif isinstance(incdirs, (list, tuple)):
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000334 incdirs = list(incdirs) + (self.include_dirs or [])
335 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000336 raise TypeError(
337 "'include_dirs' (if supplied) must be a list of strings")
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000338
339 if extra is None:
340 extra = []
341
342 # Get the list of expected output (object) files
Collin Winter5b7e9d72007-08-30 03:52:21 +0000343 objects = self.object_filenames(sources, strip_dir=0,
Andrew M. Kuchling8c6e0ec2002-12-29 17:00:57 +0000344 output_dir=outdir)
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000345 assert len(objects) == len(sources)
346
347 # XXX should redo this code to eliminate skip_source entirely.
348 # XXX instead create build and issue skip messages inline
349
350 if self.force:
351 skip_source = {} # rebuild everything
352 for source in sources:
353 skip_source[source] = 0
354 elif depends is None:
355 # If depends is None, figure out which source files we
356 # have to recompile according to a simplistic check. We
357 # just compare the source and object file, no deep
358 # dependency checking involving header files.
359 skip_source = {} # rebuild everything
360 for source in sources: # no wait, rebuild nothing
361 skip_source[source] = 1
362
363 n_sources, n_objects = newer_pairwise(sources, objects)
364 for source in n_sources: # no really, only rebuild what's
365 skip_source[source] = 0 # out-of-date
366 else:
367 # If depends is a list of files, then do a different
368 # simplistic check. Assume that each object depends on
369 # its source and all files in the depends list.
370 skip_source = {}
371 # L contains all the depends plus a spot at the end for a
372 # particular source file
373 L = depends[:] + [None]
374 for i in range(len(objects)):
375 source = sources[i]
376 L[-1] = source
377 if newer_group(L, objects[i]):
378 skip_source[source] = 0
379 else:
380 skip_source[source] = 1
381
382 pp_opts = gen_preprocess_options(macros, incdirs)
383
384 build = {}
385 for i in range(len(sources)):
386 src = sources[i]
387 obj = objects[i]
388 ext = os.path.splitext(src)[1]
389 self.mkpath(os.path.dirname(obj))
390 if skip_source[src]:
391 log.debug("skipping %s (%s up-to-date)", src, obj)
392 else:
393 build[obj] = src, ext
394
395 return macros, objects, extra, pp_opts, build
396
397 def _get_cc_args(self, pp_opts, debug, before):
398 # works for unixccompiler, emxccompiler, cygwinccompiler
399 cc_args = pp_opts + ['-c']
400 if debug:
401 cc_args[:0] = ['-g']
402 if before:
403 cc_args[:0] = before
404 return cc_args
405
Collin Winter5b7e9d72007-08-30 03:52:21 +0000406 def _fix_compile_args(self, output_dir, macros, include_dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +0000407 """Typecheck and fix-up some of the arguments to the 'compile()'
408 method, and return fixed-up values. Specifically: if 'output_dir'
409 is None, replaces it with 'self.output_dir'; ensures that 'macros'
410 is a list, and augments it with 'self.macros'; ensures that
411 'include_dirs' is a list, and augments it with 'self.include_dirs'.
412 Guarantees that the returned values are of the correct type,
413 i.e. for 'output_dir' either string or None, and for 'macros' and
414 'include_dirs' either list or None.
415 """
Greg Ward32c4a8a2000-03-06 03:40:29 +0000416 if output_dir is None:
417 output_dir = self.output_dir
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000418 elif not isinstance(output_dir, str):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000419 raise TypeError("'output_dir' must be a string or None")
Greg Ward32c4a8a2000-03-06 03:40:29 +0000420
421 if macros is None:
422 macros = self.macros
Collin Winter5b7e9d72007-08-30 03:52:21 +0000423 elif isinstance(macros, list):
Greg Ward32c4a8a2000-03-06 03:40:29 +0000424 macros = macros + (self.macros or [])
425 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000426 raise TypeError("'macros' (if supplied) must be a list of tuples")
Greg Ward32c4a8a2000-03-06 03:40:29 +0000427
428 if include_dirs is None:
429 include_dirs = self.include_dirs
Collin Winter5b7e9d72007-08-30 03:52:21 +0000430 elif isinstance(include_dirs, (list, tuple)):
431 include_dirs = list(include_dirs) + (self.include_dirs or [])
Greg Ward32c4a8a2000-03-06 03:40:29 +0000432 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000433 raise TypeError(
434 "'include_dirs' (if supplied) must be a list of strings")
Fred Drakeb94b8492001-12-06 20:51:35 +0000435
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000436 return output_dir, macros, include_dirs
Greg Ward32c4a8a2000-03-06 03:40:29 +0000437
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000438 def _prep_compile(self, sources, output_dir, depends=None):
439 """Decide which souce files must be recompiled.
440
441 Determine the list of object files corresponding to 'sources',
442 and figure out which ones really need to be recompiled.
443 Return a list of all object files and a dictionary telling
444 which source files can be skipped.
Greg Wardc3a43b42000-06-24 18:10:48 +0000445 """
Fred Drakeb94b8492001-12-06 20:51:35 +0000446 # Get the list of expected output (object) files
Thomas Wouters477c8d52006-05-27 19:21:47 +0000447 objects = self.object_filenames(sources, output_dir=output_dir)
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000448 assert len(objects) == len(sources)
Greg Ward32c4a8a2000-03-06 03:40:29 +0000449
450 if self.force:
451 skip_source = {} # rebuild everything
452 for source in sources:
453 skip_source[source] = 0
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000454 elif depends is None:
455 # If depends is None, figure out which source files we
456 # have to recompile according to a simplistic check. We
457 # just compare the source and object file, no deep
458 # dependency checking involving header files.
Greg Ward32c4a8a2000-03-06 03:40:29 +0000459 skip_source = {} # rebuild everything
460 for source in sources: # no wait, rebuild nothing
461 skip_source[source] = 1
462
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000463 n_sources, n_objects = newer_pairwise(sources, objects)
Greg Wardc3a43b42000-06-24 18:10:48 +0000464 for source in n_sources: # no really, only rebuild what's
465 skip_source[source] = 0 # out-of-date
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000466 else:
467 # If depends is a list of files, then do a different
468 # simplistic check. Assume that each object depends on
469 # its source and all files in the depends list.
470 skip_source = {}
471 # L contains all the depends plus a spot at the end for a
472 # particular source file
473 L = depends[:] + [None]
474 for i in range(len(objects)):
475 source = sources[i]
476 L[-1] = source
477 if newer_group(L, objects[i]):
478 skip_source[source] = 0
479 else:
480 skip_source[source] = 1
Greg Ward32c4a8a2000-03-06 03:40:29 +0000481
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000482 return objects, skip_source
Greg Ward32c4a8a2000-03-06 03:40:29 +0000483
Greg Ward32c4a8a2000-03-06 03:40:29 +0000484
Collin Winter5b7e9d72007-08-30 03:52:21 +0000485 def _fix_object_args(self, objects, output_dir):
Greg Wardc3a43b42000-06-24 18:10:48 +0000486 """Typecheck and fix up some arguments supplied to various methods.
487 Specifically: ensure that 'objects' is a list; if output_dir is
488 None, replace with self.output_dir. Return fixed versions of
489 'objects' and 'output_dir'.
490 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000491 if not isinstance(objects, (list, tuple)):
492 raise TypeError("'objects' must be a list or tuple of strings")
493 objects = list(objects)
Fred Drakeb94b8492001-12-06 20:51:35 +0000494
Greg Ward32c4a8a2000-03-06 03:40:29 +0000495 if output_dir is None:
496 output_dir = self.output_dir
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000497 elif not isinstance(output_dir, str):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000498 raise TypeError("'output_dir' must be a string or None")
Greg Ward32c4a8a2000-03-06 03:40:29 +0000499
Greg Wardf10f95d2000-03-26 21:37:09 +0000500 return (objects, output_dir)
Greg Ward32c4a8a2000-03-06 03:40:29 +0000501
Collin Winter5b7e9d72007-08-30 03:52:21 +0000502 def _fix_lib_args(self, libraries, library_dirs, runtime_library_dirs):
Greg Wardf10f95d2000-03-26 21:37:09 +0000503 """Typecheck and fix up some of the arguments supplied to the
Greg Wardc3a43b42000-06-24 18:10:48 +0000504 'link_*' methods. Specifically: ensure that all arguments are
505 lists, and augment them with their permanent versions
506 (eg. 'self.libraries' augments 'libraries'). Return a tuple with
507 fixed versions of all arguments.
508 """
Greg Wardf10f95d2000-03-26 21:37:09 +0000509 if libraries is None:
510 libraries = self.libraries
Collin Winter5b7e9d72007-08-30 03:52:21 +0000511 elif isinstance(libraries, (list, tuple)):
Greg Wardf10f95d2000-03-26 21:37:09 +0000512 libraries = list (libraries) + (self.libraries or [])
Greg Ward32c4a8a2000-03-06 03:40:29 +0000513 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000514 raise TypeError(
515 "'libraries' (if supplied) must be a list of strings")
Greg Ward32c4a8a2000-03-06 03:40:29 +0000516
Greg Wardf10f95d2000-03-26 21:37:09 +0000517 if library_dirs is None:
518 library_dirs = self.library_dirs
Collin Winter5b7e9d72007-08-30 03:52:21 +0000519 elif isinstance(library_dirs, (list, tuple)):
Greg Wardf10f95d2000-03-26 21:37:09 +0000520 library_dirs = list (library_dirs) + (self.library_dirs or [])
521 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000522 raise TypeError(
523 "'library_dirs' (if supplied) must be a list of strings")
Greg Wardf10f95d2000-03-26 21:37:09 +0000524
525 if runtime_library_dirs is None:
526 runtime_library_dirs = self.runtime_library_dirs
Collin Winter5b7e9d72007-08-30 03:52:21 +0000527 elif isinstance(runtime_library_dirs, (list, tuple)):
528 runtime_library_dirs = (list(runtime_library_dirs) +
Greg Wardf10f95d2000-03-26 21:37:09 +0000529 (self.runtime_library_dirs or []))
530 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000531 raise TypeError("'runtime_library_dirs' (if supplied) "
532 "must be a list of strings")
Greg Wardf10f95d2000-03-26 21:37:09 +0000533
534 return (libraries, library_dirs, runtime_library_dirs)
535
Collin Winter5b7e9d72007-08-30 03:52:21 +0000536 def _need_link(self, objects, output_file):
Greg Wardc3a43b42000-06-24 18:10:48 +0000537 """Return true if we need to relink the files listed in 'objects'
538 to recreate 'output_file'.
539 """
Greg Ward32c4a8a2000-03-06 03:40:29 +0000540 if self.force:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000541 return True
Greg Ward32c4a8a2000-03-06 03:40:29 +0000542 else:
543 if self.dry_run:
544 newer = newer_group (objects, output_file, missing='newer')
545 else:
546 newer = newer_group (objects, output_file)
547 return newer
548
Collin Winter5b7e9d72007-08-30 03:52:21 +0000549 def detect_language(self, sources):
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000550 """Detect the language of a given file, or list of files. Uses
551 language_map, and language_order to do the job.
552 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000553 if not isinstance(sources, list):
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000554 sources = [sources]
555 lang = None
556 index = len(self.language_order)
557 for source in sources:
558 base, ext = os.path.splitext(source)
559 extlang = self.language_map.get(ext)
560 try:
561 extindex = self.language_order.index(extlang)
562 if extindex < index:
563 lang = extlang
564 index = extindex
565 except ValueError:
566 pass
567 return lang
568
Greg Ward32c4a8a2000-03-06 03:40:29 +0000569
Greg Ward3f81cf71999-07-10 02:03:53 +0000570 # -- Worker methods ------------------------------------------------
571 # (must be implemented by subclasses)
572
Collin Winter5b7e9d72007-08-30 03:52:21 +0000573 def preprocess(self, source, output_file=None, macros=None,
574 include_dirs=None, extra_preargs=None, extra_postargs=None):
Greg Ward3ff3b032000-06-21 02:58:46 +0000575 """Preprocess a single C/C++ source file, named in 'source'.
576 Output will be written to file named 'output_file', or stdout if
577 'output_file' not supplied. 'macros' is a list of macro
578 definitions as for 'compile()', which will augment the macros set
579 with 'define_macro()' and 'undefine_macro()'. 'include_dirs' is a
580 list of directory names that will be added to the default list.
Greg Warde5c62bf2000-06-25 02:08:18 +0000581
582 Raises PreprocessError on failure.
Greg Ward3ff3b032000-06-21 02:58:46 +0000583 """
584 pass
585
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000586 def compile(self, sources, output_dir=None, macros=None,
587 include_dirs=None, debug=0, extra_preargs=None,
588 extra_postargs=None, depends=None):
589 """Compile one or more source files.
590
591 'sources' must be a list of filenames, most likely C/C++
592 files, but in reality anything that can be handled by a
593 particular compiler and compiler class (eg. MSVCCompiler can
594 handle resource files in 'sources'). Return a list of object
595 filenames, one per source filename in 'sources'. Depending on
596 the implementation, not all source files will necessarily be
597 compiled, but all corresponding object filenames will be
598 returned.
Greg Ward32c4a8a2000-03-06 03:40:29 +0000599
Greg Wardc3a43b42000-06-24 18:10:48 +0000600 If 'output_dir' is given, object files will be put under it, while
601 retaining their original path component. That is, "foo/bar.c"
602 normally compiles to "foo/bar.o" (for a Unix implementation); if
603 'output_dir' is "build", then it would compile to
604 "build/foo/bar.o".
Greg Ward3f81cf71999-07-10 02:03:53 +0000605
Greg Wardc3a43b42000-06-24 18:10:48 +0000606 'macros', if given, must be a list of macro definitions. A macro
607 definition is either a (name, value) 2-tuple or a (name,) 1-tuple.
608 The former defines a macro; if the value is None, the macro is
609 defined without an explicit value. The 1-tuple case undefines a
610 macro. Later definitions/redefinitions/ undefinitions take
611 precedence.
Greg Ward3f81cf71999-07-10 02:03:53 +0000612
Greg Wardc3a43b42000-06-24 18:10:48 +0000613 'include_dirs', if given, must be a list of strings, the
614 directories to add to the default include file search path for this
615 compilation only.
Greg Ward3c045a52000-02-09 02:16:14 +0000616
Greg Wardc3a43b42000-06-24 18:10:48 +0000617 'debug' is a boolean; if true, the compiler will be instructed to
618 output debug symbols in (or alongside) the object file(s).
Greg Ward802d6b71999-09-29 12:20:55 +0000619
Greg Wardc3a43b42000-06-24 18:10:48 +0000620 'extra_preargs' and 'extra_postargs' are implementation- dependent.
621 On platforms that have the notion of a command-line (e.g. Unix,
622 DOS/Windows), they are most likely lists of strings: extra
623 command-line arguments to prepand/append to the compiler command
624 line. On other platforms, consult the implementation class
625 documentation. In any event, they are intended as an escape hatch
626 for those occasions when the abstract compiler framework doesn't
627 cut the mustard.
Greg Wardd1517112000-05-30 01:56:44 +0000628
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000629 'depends', if given, is a list of filenames that all targets
630 depend on. If a source file is older than any file in
631 depends, then the source file will be recompiled. This
632 supports dependency tracking, but only at a coarse
633 granularity.
634
Greg Wardc3a43b42000-06-24 18:10:48 +0000635 Raises CompileError on failure.
636 """
Jeremy Hylton6e08d222002-06-18 18:42:41 +0000637 # A concrete compiler class can either override this method
638 # entirely or implement _compile().
Jeremy Hylton6e08d222002-06-18 18:42:41 +0000639 macros, objects, extra_postargs, pp_opts, build = \
640 self._setup_compile(output_dir, macros, include_dirs, sources,
641 depends, extra_postargs)
642 cc_args = self._get_cc_args(pp_opts, debug, extra_preargs)
643
Thomas Heller9436a752003-12-05 20:12:23 +0000644 for obj in objects:
645 try:
646 src, ext = build[obj]
647 except KeyError:
648 continue
Jeremy Hylton6e08d222002-06-18 18:42:41 +0000649 self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
650
651 # Return *all* object filenames, not just the ones we just built.
652 return objects
653
654 def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
655 """Compile 'src' to product 'obj'."""
Jeremy Hylton6e08d222002-06-18 18:42:41 +0000656 # A concrete compiler class that does not override compile()
657 # should implement _compile().
658 pass
Greg Ward3f81cf71999-07-10 02:03:53 +0000659
Collin Winter5b7e9d72007-08-30 03:52:21 +0000660 def create_static_lib(self, objects, output_libname, output_dir=None,
661 debug=0, target_lang=None):
Greg Wardc3a43b42000-06-24 18:10:48 +0000662 """Link a bunch of stuff together to create a static library file.
663 The "bunch of stuff" consists of the list of object files supplied
664 as 'objects', the extra object files supplied to
665 'add_link_object()' and/or 'set_link_objects()', the libraries
666 supplied to 'add_library()' and/or 'set_libraries()', and the
667 libraries supplied as 'libraries' (if any).
Greg Ward3f81cf71999-07-10 02:03:53 +0000668
Greg Wardc3a43b42000-06-24 18:10:48 +0000669 'output_libname' should be a library name, not a filename; the
670 filename will be inferred from the library name. 'output_dir' is
671 the directory where the library file will be put.
Greg Ward3c045a52000-02-09 02:16:14 +0000672
Greg Wardc3a43b42000-06-24 18:10:48 +0000673 'debug' is a boolean; if true, debugging information will be
674 included in the library (note that on most platforms, it is the
675 compile step where this matters: the 'debug' flag is included here
676 just for consistency).
Greg Wardd1517112000-05-30 01:56:44 +0000677
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000678 'target_lang' is the target language for which the given objects
679 are being compiled. This allows specific linkage time treatment of
680 certain languages.
681
Greg Wardc3a43b42000-06-24 18:10:48 +0000682 Raises LibError on failure.
683 """
Greg Ward3c045a52000-02-09 02:16:14 +0000684 pass
Fred Drakeb94b8492001-12-06 20:51:35 +0000685
Greg Ward3c045a52000-02-09 02:16:14 +0000686
Greg Ward42406482000-09-27 02:08:14 +0000687 # values for target_desc parameter in link()
688 SHARED_OBJECT = "shared_object"
689 SHARED_LIBRARY = "shared_library"
690 EXECUTABLE = "executable"
691
Collin Winter5b7e9d72007-08-30 03:52:21 +0000692 def link(self,
693 target_desc,
694 objects,
695 output_filename,
696 output_dir=None,
697 libraries=None,
698 library_dirs=None,
699 runtime_library_dirs=None,
700 export_symbols=None,
701 debug=0,
702 extra_preargs=None,
703 extra_postargs=None,
704 build_temp=None,
705 target_lang=None):
Greg Ward42406482000-09-27 02:08:14 +0000706 """Link a bunch of stuff together to create an executable or
707 shared library file.
708
709 The "bunch of stuff" consists of the list of object files supplied
710 as 'objects'. 'output_filename' should be a filename. If
711 'output_dir' is supplied, 'output_filename' is relative to it
712 (i.e. 'output_filename' can provide directory components if
713 needed).
Greg Ward3febd601999-10-03 20:41:02 +0000714
Greg Wardc3a43b42000-06-24 18:10:48 +0000715 'libraries' is a list of libraries to link against. These are
716 library names, not filenames, since they're translated into
717 filenames in a platform-specific way (eg. "foo" becomes "libfoo.a"
718 on Unix and "foo.lib" on DOS/Windows). However, they can include a
719 directory component, which means the linker will look in that
720 specific directory rather than searching all the normal locations.
Greg Ward5299b6a2000-05-20 13:23:21 +0000721
Greg Wardc3a43b42000-06-24 18:10:48 +0000722 'library_dirs', if supplied, should be a list of directories to
723 search for libraries that were specified as bare library names
724 (ie. no directory component). These are on top of the system
725 default and those supplied to 'add_library_dir()' and/or
726 'set_library_dirs()'. 'runtime_library_dirs' is a list of
727 directories that will be embedded into the shared library and used
728 to search for other shared libraries that *it* depends on at
729 run-time. (This may only be relevant on Unix.)
Greg Ward802d6b71999-09-29 12:20:55 +0000730
Greg Wardc3a43b42000-06-24 18:10:48 +0000731 'export_symbols' is a list of symbols that the shared library will
732 export. (This appears to be relevant only on Windows.)
Greg Ward3c045a52000-02-09 02:16:14 +0000733
Greg Wardc3a43b42000-06-24 18:10:48 +0000734 'debug' is as for 'compile()' and 'create_static_lib()', with the
735 slight distinction that it actually matters on most platforms (as
736 opposed to 'create_static_lib()', which includes a 'debug' flag
737 mostly for form's sake).
Greg Wardd1517112000-05-30 01:56:44 +0000738
Greg Wardc3a43b42000-06-24 18:10:48 +0000739 'extra_preargs' and 'extra_postargs' are as for 'compile()' (except
740 of course that they supply command-line arguments for the
741 particular linker being used).
Greg Ward3f81cf71999-07-10 02:03:53 +0000742
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000743 'target_lang' is the target language for which the given objects
744 are being compiled. This allows specific linkage time treatment of
745 certain languages.
746
Greg Wardc3a43b42000-06-24 18:10:48 +0000747 Raises LinkError on failure.
748 """
Greg Ward42406482000-09-27 02:08:14 +0000749 raise NotImplementedError
750
Fred Drakeb94b8492001-12-06 20:51:35 +0000751
Greg Ward264cf742000-09-27 02:24:21 +0000752 # Old 'link_*()' methods, rewritten to use the new 'link()' method.
Greg Ward42406482000-09-27 02:08:14 +0000753
Collin Winter5b7e9d72007-08-30 03:52:21 +0000754 def link_shared_lib(self,
755 objects,
756 output_libname,
757 output_dir=None,
758 libraries=None,
759 library_dirs=None,
760 runtime_library_dirs=None,
761 export_symbols=None,
762 debug=0,
763 extra_preargs=None,
764 extra_postargs=None,
765 build_temp=None,
766 target_lang=None):
Fred Drakeb94b8492001-12-06 20:51:35 +0000767 self.link(CCompiler.SHARED_LIBRARY, objects,
Greg Ward42406482000-09-27 02:08:14 +0000768 self.library_filename(output_libname, lib_type='shared'),
769 output_dir,
770 libraries, library_dirs, runtime_library_dirs,
771 export_symbols, debug,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000772 extra_preargs, extra_postargs, build_temp, target_lang)
Fred Drakeb94b8492001-12-06 20:51:35 +0000773
Greg Ward3f81cf71999-07-10 02:03:53 +0000774
Collin Winter5b7e9d72007-08-30 03:52:21 +0000775 def link_shared_object(self,
776 objects,
777 output_filename,
778 output_dir=None,
779 libraries=None,
780 library_dirs=None,
781 runtime_library_dirs=None,
782 export_symbols=None,
783 debug=0,
784 extra_preargs=None,
785 extra_postargs=None,
786 build_temp=None,
787 target_lang=None):
Greg Ward42406482000-09-27 02:08:14 +0000788 self.link(CCompiler.SHARED_OBJECT, objects,
789 output_filename, output_dir,
790 libraries, library_dirs, runtime_library_dirs,
791 export_symbols, debug,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000792 extra_preargs, extra_postargs, build_temp, target_lang)
Greg Ward3f81cf71999-07-10 02:03:53 +0000793
Greg Warde1aaaa61999-08-14 23:50:50 +0000794
Collin Winter5b7e9d72007-08-30 03:52:21 +0000795 def link_executable(self,
796 objects,
797 output_progname,
798 output_dir=None,
799 libraries=None,
800 library_dirs=None,
801 runtime_library_dirs=None,
802 debug=0,
803 extra_preargs=None,
804 extra_postargs=None,
805 target_lang=None):
Fred Drakeb94b8492001-12-06 20:51:35 +0000806 self.link(CCompiler.EXECUTABLE, objects,
Greg Ward264cf742000-09-27 02:24:21 +0000807 self.executable_filename(output_progname), output_dir,
Fred Drakeb94b8492001-12-06 20:51:35 +0000808 libraries, library_dirs, runtime_library_dirs, None,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000809 debug, extra_preargs, extra_postargs, None, target_lang)
Greg Ward5baf1c22000-01-09 22:41:02 +0000810
811
Greg Wardf7edea72000-05-20 13:31:32 +0000812 # -- Miscellaneous methods -----------------------------------------
813 # These are all used by the 'gen_lib_options() function; there is
814 # no appropriate default implementation so subclasses should
815 # implement all of these.
816
Collin Winter5b7e9d72007-08-30 03:52:21 +0000817 def library_dir_option(self, dir):
Greg Wardc3a43b42000-06-24 18:10:48 +0000818 """Return the compiler option to add 'dir' to the list of
819 directories searched for libraries.
820 """
Greg Wardf7edea72000-05-20 13:31:32 +0000821 raise NotImplementedError
822
Collin Winter5b7e9d72007-08-30 03:52:21 +0000823 def runtime_library_dir_option(self, dir):
Greg Wardc3a43b42000-06-24 18:10:48 +0000824 """Return the compiler option to add 'dir' to the list of
825 directories searched for runtime libraries.
826 """
Greg Wardf7edea72000-05-20 13:31:32 +0000827 raise NotImplementedError
828
Collin Winter5b7e9d72007-08-30 03:52:21 +0000829 def library_option(self, lib):
Greg Wardf7edea72000-05-20 13:31:32 +0000830 """Return the compiler option to add 'dir' to the list of libraries
Greg Wardc3a43b42000-06-24 18:10:48 +0000831 linked into the shared library or executable.
832 """
Greg Wardf7edea72000-05-20 13:31:32 +0000833 raise NotImplementedError
834
Collin Winter5b7e9d72007-08-30 03:52:21 +0000835 def has_function(self, funcname, includes=None, include_dirs=None,
836 libraries=None, library_dirs=None):
Skip Montanarofa012612003-04-24 19:49:23 +0000837 """Return a boolean indicating whether funcname is supported on
838 the current platform. The optional arguments can be used to
839 augment the compilation environment.
840 """
Skip Montanarofa012612003-04-24 19:49:23 +0000841 # this can't be included at module scope because it tries to
842 # import math which might not be available at that point - maybe
843 # the necessary logic should just be inlined?
844 import tempfile
845 if includes is None:
846 includes = []
847 if include_dirs is None:
848 include_dirs = []
849 if libraries is None:
850 libraries = []
851 if library_dirs is None:
852 library_dirs = []
853 fd, fname = tempfile.mkstemp(".c", funcname, text=True)
854 f = os.fdopen(fd, "w")
855 for incl in includes:
856 f.write("""#include "%s"\n""" % incl)
857 f.write("""\
858main (int argc, char **argv) {
859 %s();
860}
861""" % funcname)
862 f.close()
863 try:
864 objects = self.compile([fname], include_dirs=include_dirs)
865 except CompileError:
866 return False
867
868 try:
869 self.link_executable(objects, "a.out",
870 libraries=libraries,
871 library_dirs=library_dirs)
872 except (LinkError, TypeError):
873 return False
874 return True
875
Greg Warde5e60152000-08-04 01:28:39 +0000876 def find_library_file (self, dirs, lib, debug=0):
Greg Wardf7edea72000-05-20 13:31:32 +0000877 """Search the specified list of directories for a static or shared
Greg Warde5e60152000-08-04 01:28:39 +0000878 library file 'lib' and return the full path to that file. If
879 'debug' true, look for a debugging version (if that makes sense on
880 the current platform). Return None if 'lib' wasn't found in any of
881 the specified directories.
Greg Wardc3a43b42000-06-24 18:10:48 +0000882 """
Greg Wardf7edea72000-05-20 13:31:32 +0000883 raise NotImplementedError
884
Greg Ward32c4a8a2000-03-06 03:40:29 +0000885 # -- Filename generation methods -----------------------------------
Greg Warde1aaaa61999-08-14 23:50:50 +0000886
Greg Ward32c4a8a2000-03-06 03:40:29 +0000887 # The default implementation of the filename generating methods are
888 # prejudiced towards the Unix/DOS/Windows view of the world:
889 # * object files are named by replacing the source file extension
890 # (eg. .c/.cpp -> .o/.obj)
891 # * library files (shared or static) are named by plugging the
892 # library name and extension into a format string, eg.
893 # "lib%s.%s" % (lib_name, ".a") for Unix static libraries
894 # * executables are named by appending an extension (possibly
895 # empty) to the program name: eg. progname + ".exe" for
896 # Windows
897 #
898 # To reduce redundant code, these methods expect to find
899 # several attributes in the current object (presumably defined
900 # as class attributes):
901 # * src_extensions -
902 # list of C/C++ source file extensions, eg. ['.c', '.cpp']
903 # * obj_extension -
904 # object file extension, eg. '.o' or '.obj'
905 # * static_lib_extension -
906 # extension for static library files, eg. '.a' or '.lib'
907 # * shared_lib_extension -
908 # extension for shared library/object files, eg. '.so', '.dll'
909 # * static_lib_format -
910 # format string for generating static library filenames,
911 # eg. 'lib%s.%s' or '%s.%s'
912 # * shared_lib_format
913 # format string for generating shared library filenames
914 # (probably same as static_lib_format, since the extension
915 # is one of the intended parameters to the format string)
916 # * exe_extension -
917 # extension for executable files, eg. '' or '.exe'
Greg Ward9b17cb51999-09-13 03:07:24 +0000918
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000919 def object_filenames(self, source_filenames, strip_dir=0, output_dir=''):
Guido van Rossumcc3a6df2002-10-01 04:14:17 +0000920 if output_dir is None:
921 output_dir = ''
Greg Ward32c4a8a2000-03-06 03:40:29 +0000922 obj_names = []
923 for src_name in source_filenames:
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000924 base, ext = os.path.splitext(src_name)
Andrew M. Kuchling10da45e2003-02-26 18:52:07 +0000925 base = os.path.splitdrive(base)[1] # Chop off the drive
926 base = base[os.path.isabs(base):] # If abs, chop off leading /
Greg Ward32c4a8a2000-03-06 03:40:29 +0000927 if ext not in self.src_extensions:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000928 raise UnknownFileError(
929 "unknown file type '%s' (from '%s')" % (ext, src_name))
Greg Ward32c4a8a2000-03-06 03:40:29 +0000930 if strip_dir:
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000931 base = os.path.basename(base)
932 obj_names.append(os.path.join(output_dir,
933 base + self.obj_extension))
Greg Ward32c4a8a2000-03-06 03:40:29 +0000934 return obj_names
Greg Warde1aaaa61999-08-14 23:50:50 +0000935
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000936 def shared_object_filename(self, basename, strip_dir=0, output_dir=''):
937 assert output_dir is not None
Greg Ward32c4a8a2000-03-06 03:40:29 +0000938 if strip_dir:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000939 basename = os.path.basename(basename)
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000940 return os.path.join(output_dir, basename + self.shared_lib_extension)
Greg Warde1aaaa61999-08-14 23:50:50 +0000941
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000942 def executable_filename(self, basename, strip_dir=0, output_dir=''):
943 assert output_dir is not None
Greg Ward42406482000-09-27 02:08:14 +0000944 if strip_dir:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000945 basename = os.path.basename(basename)
Greg Ward42406482000-09-27 02:08:14 +0000946 return os.path.join(output_dir, basename + (self.exe_extension or ''))
Greg Ward26e48ea1999-08-29 18:17:36 +0000947
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000948 def library_filename(self, libname, lib_type='static', # or 'shared'
949 strip_dir=0, output_dir=''):
950 assert output_dir is not None
951 if lib_type not in ("static", "shared", "dylib"):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000952 raise ValueError(
953 "'lib_type' must be \"static\", \"shared\" or \"dylib\"")
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000954 fmt = getattr(self, lib_type + "_lib_format")
955 ext = getattr(self, lib_type + "_lib_extension")
Greg Ward32c4a8a2000-03-06 03:40:29 +0000956
Collin Winter5b7e9d72007-08-30 03:52:21 +0000957 dir, base = os.path.split(libname)
Greg Ward32c4a8a2000-03-06 03:40:29 +0000958 filename = fmt % (base, ext)
959 if strip_dir:
960 dir = ''
961
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000962 return os.path.join(output_dir, dir, filename)
Greg Ward32c4a8a2000-03-06 03:40:29 +0000963
Greg Warde1aaaa61999-08-14 23:50:50 +0000964
965 # -- Utility methods -----------------------------------------------
966
Collin Winter5b7e9d72007-08-30 03:52:21 +0000967 def announce(self, msg, level=1):
Jeremy Hyltoncd8a1142002-06-04 20:14:43 +0000968 log.debug(msg)
Greg Ward9b17cb51999-09-13 03:07:24 +0000969
Collin Winter5b7e9d72007-08-30 03:52:21 +0000970 def debug_print(self, msg):
Jeremy Hyltonfcd73532002-09-11 16:31:53 +0000971 from distutils.debug import DEBUG
Greg Wardf813e592000-08-04 01:31:13 +0000972 if DEBUG:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000973 print(msg)
Greg Wardf813e592000-08-04 01:31:13 +0000974
Collin Winter5b7e9d72007-08-30 03:52:21 +0000975 def warn(self, msg):
976 sys.stderr.write("warning: %s\n" % msg)
Greg Ward3febd601999-10-03 20:41:02 +0000977
Collin Winter5b7e9d72007-08-30 03:52:21 +0000978 def execute(self, func, args, msg=None, level=1):
Jeremy Hyltoncd8a1142002-06-04 20:14:43 +0000979 execute(func, args, msg, self.dry_run)
Greg Ward9dddbb42000-08-02 01:38:20 +0000980
Collin Winter5b7e9d72007-08-30 03:52:21 +0000981 def spawn(self, cmd):
982 spawn(cmd, dry_run=self.dry_run)
Greg Warde1aaaa61999-08-14 23:50:50 +0000983
Collin Winter5b7e9d72007-08-30 03:52:21 +0000984 def move_file(self, src, dst):
985 return move_file(src, dst, dry_run=self.dry_run)
Greg Ward9b17cb51999-09-13 03:07:24 +0000986
Collin Winter5b7e9d72007-08-30 03:52:21 +0000987 def mkpath(self, name, mode=0o777):
988 mkpath(name, mode, self.dry_run)
Greg Ward3f81cf71999-07-10 02:03:53 +0000989
990
Marc-André Lemburg636b9062001-02-19 09:20:04 +0000991# Map a sys.platform/os.name ('posix', 'nt') to the default compiler
992# type for that platform. Keys are interpreted as re match
993# patterns. Order is important; platform mappings are preferred over
994# OS names.
995_default_compilers = (
996
997 # Platform string mappings
Andrew M. Kuchlinga34dbe02001-02-27 19:13:15 +0000998
999 # on a cygwin built python we can use gcc like an ordinary UNIXish
1000 # compiler
1001 ('cygwin.*', 'unix'),
Marc-André Lemburg2544f512002-01-31 18:56:00 +00001002 ('os2emx', 'emx'),
Fred Drakeb94b8492001-12-06 20:51:35 +00001003
Marc-André Lemburg636b9062001-02-19 09:20:04 +00001004 # OS name mappings
1005 ('posix', 'unix'),
1006 ('nt', 'msvc'),
1007 ('mac', 'mwerks'),
Fred Drakeb94b8492001-12-06 20:51:35 +00001008
Marc-André Lemburg636b9062001-02-19 09:20:04 +00001009 )
1010
1011def get_default_compiler(osname=None, platform=None):
Collin Winter5b7e9d72007-08-30 03:52:21 +00001012 """Determine the default compiler to use for the given platform.
Marc-André Lemburg636b9062001-02-19 09:20:04 +00001013
Collin Winter5b7e9d72007-08-30 03:52:21 +00001014 osname should be one of the standard Python OS names (i.e. the
1015 ones returned by os.name) and platform the common value
1016 returned by sys.platform for the platform in question.
Marc-André Lemburg636b9062001-02-19 09:20:04 +00001017
Collin Winter5b7e9d72007-08-30 03:52:21 +00001018 The default values are os.name and sys.platform in case the
1019 parameters are not given.
Marc-André Lemburg636b9062001-02-19 09:20:04 +00001020 """
1021 if osname is None:
1022 osname = os.name
1023 if platform is None:
1024 platform = sys.platform
1025 for pattern, compiler in _default_compilers:
1026 if re.match(pattern, platform) is not None or \
1027 re.match(pattern, osname) is not None:
1028 return compiler
1029 # Default to Unix compiler
1030 return 'unix'
Greg Ward802d6b71999-09-29 12:20:55 +00001031
1032# Map compiler types to (module_name, class_name) pairs -- ie. where to
1033# find the code that implements an interface to this compiler. (The module
1034# is assumed to be in the 'distutils' package.)
Greg Ward2ff78872000-06-24 00:23:20 +00001035compiler_class = { 'unix': ('unixccompiler', 'UnixCCompiler',
1036 "standard UNIX-style compiler"),
1037 'msvc': ('msvccompiler', 'MSVCCompiler',
1038 "Microsoft Visual C++"),
1039 'cygwin': ('cygwinccompiler', 'CygwinCCompiler',
1040 "Cygwin port of GNU C Compiler for Win32"),
1041 'mingw32': ('cygwinccompiler', 'Mingw32CCompiler',
1042 "Mingw32 port of GNU C Compiler for Win32"),
Greg Wardbfc79d62000-06-28 01:29:09 +00001043 'bcpp': ('bcppcompiler', 'BCPPCompiler',
1044 "Borland C++ Compiler"),
Andrew M. Kuchling3f819ec2001-01-15 16:09:35 +00001045 'mwerks': ('mwerkscompiler', 'MWerksCompiler',
1046 "MetroWerks CodeWarrior"),
Marc-André Lemburg2544f512002-01-31 18:56:00 +00001047 'emx': ('emxccompiler', 'EMXCCompiler',
1048 "EMX port of GNU C Compiler for OS/2"),
Greg Ward802d6b71999-09-29 12:20:55 +00001049 }
1050
Greg Ward9d17a7a2000-06-07 03:00:06 +00001051def show_compilers():
Greg Ward2ff78872000-06-24 00:23:20 +00001052 """Print list of available compilers (used by the "--help-compiler"
1053 options to "build", "build_ext", "build_clib").
1054 """
1055 # XXX this "knows" that the compiler option it's describing is
1056 # "--compiler", which just happens to be the case for the three
1057 # commands that use it.
Fred Drakeb94b8492001-12-06 20:51:35 +00001058 from distutils.fancy_getopt import FancyGetopt
Greg Ward2ff78872000-06-24 00:23:20 +00001059 compilers = []
Greg Ward9d17a7a2000-06-07 03:00:06 +00001060 for compiler in compiler_class.keys():
Jeremy Hylton65d6edb2000-07-07 20:45:21 +00001061 compilers.append(("compiler="+compiler, None,
Greg Ward2ff78872000-06-24 00:23:20 +00001062 compiler_class[compiler][2]))
1063 compilers.sort()
1064 pretty_printer = FancyGetopt(compilers)
Greg Ward9d17a7a2000-06-07 03:00:06 +00001065 pretty_printer.print_help("List of available compilers:")
Fred Drakeb94b8492001-12-06 20:51:35 +00001066
Greg Ward802d6b71999-09-29 12:20:55 +00001067
Collin Winter5b7e9d72007-08-30 03:52:21 +00001068def new_compiler(plat=None, compiler=None, verbose=0, dry_run=0, force=0):
Greg Ward802d6b71999-09-29 12:20:55 +00001069 """Generate an instance of some CCompiler subclass for the supplied
Greg Wardc3a43b42000-06-24 18:10:48 +00001070 platform/compiler combination. 'plat' defaults to 'os.name'
1071 (eg. 'posix', 'nt'), and 'compiler' defaults to the default compiler
1072 for that platform. Currently only 'posix' and 'nt' are supported, and
1073 the default compilers are "traditional Unix interface" (UnixCCompiler
1074 class) and Visual C++ (MSVCCompiler class). Note that it's perfectly
1075 possible to ask for a Unix compiler object under Windows, and a
1076 Microsoft compiler object under Unix -- if you supply a value for
1077 'compiler', 'plat' is ignored.
1078 """
Greg Ward802d6b71999-09-29 12:20:55 +00001079 if plat is None:
1080 plat = os.name
1081
1082 try:
1083 if compiler is None:
Marc-André Lemburg636b9062001-02-19 09:20:04 +00001084 compiler = get_default_compiler(plat)
Fred Drakeb94b8492001-12-06 20:51:35 +00001085
Greg Ward2ff78872000-06-24 00:23:20 +00001086 (module_name, class_name, long_description) = compiler_class[compiler]
Greg Ward802d6b71999-09-29 12:20:55 +00001087 except KeyError:
1088 msg = "don't know how to compile C/C++ code on platform '%s'" % plat
1089 if compiler is not None:
1090 msg = msg + " with '%s' compiler" % compiler
Collin Winter5b7e9d72007-08-30 03:52:21 +00001091 raise DistutilsPlatformError(msg)
Fred Drakeb94b8492001-12-06 20:51:35 +00001092
Greg Ward802d6b71999-09-29 12:20:55 +00001093 try:
1094 module_name = "distutils." + module_name
1095 __import__ (module_name)
1096 module = sys.modules[module_name]
1097 klass = vars(module)[class_name]
1098 except ImportError:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001099 raise DistutilsModuleError(
Greg Ward802d6b71999-09-29 12:20:55 +00001100 "can't compile C/C++ code: unable to load module '%s'" % \
Collin Winter5b7e9d72007-08-30 03:52:21 +00001101 module_name)
Greg Ward802d6b71999-09-29 12:20:55 +00001102 except KeyError:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001103 raise DistutilsModuleError(
1104 "can't compile C/C++ code: unable to find class '%s' "
1105 "in module '%s'" % (class_name, module_name))
Greg Ward802d6b71999-09-29 12:20:55 +00001106
Jeremy Hyltoncd8a1142002-06-04 20:14:43 +00001107 # XXX The None is necessary to preserve backwards compatibility
1108 # with classes that expect verbose to be the first positional
1109 # argument.
Collin Winter5b7e9d72007-08-30 03:52:21 +00001110 return klass(None, dry_run, force)
Greg Wardf7a39ec1999-09-08 02:29:08 +00001111
1112
Collin Winter5b7e9d72007-08-30 03:52:21 +00001113def gen_preprocess_options(macros, include_dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +00001114 """Generate C pre-processor options (-D, -U, -I) as used by at least
1115 two types of compilers: the typical Unix compiler and Visual C++.
1116 'macros' is the usual thing, a list of 1- or 2-tuples, where (name,)
1117 means undefine (-U) macro 'name', and (name,value) means define (-D)
1118 macro 'name' to 'value'. 'include_dirs' is just a list of directory
1119 names to be added to the header file search path (-I). Returns a list
1120 of command-line options suitable for either Unix compilers or Visual
1121 C++.
1122 """
Greg Wardf7a39ec1999-09-08 02:29:08 +00001123 # XXX it would be nice (mainly aesthetic, and so we don't generate
1124 # stupid-looking command lines) to go over 'macros' and eliminate
1125 # redundant definitions/undefinitions (ie. ensure that only the
1126 # latest mention of a particular macro winds up on the command
1127 # line). I don't think it's essential, though, since most (all?)
1128 # Unix C compilers only pay attention to the latest -D or -U
1129 # mention of a macro on their command line. Similar situation for
Greg Ward0bdd90a1999-12-12 17:19:58 +00001130 # 'include_dirs'. I'm punting on both for now. Anyways, weeding out
Greg Wardf7a39ec1999-09-08 02:29:08 +00001131 # redundancies like this should probably be the province of
1132 # CCompiler, since the data structures used are inherited from it
1133 # and therefore common to all CCompiler classes.
Greg Wardf7a39ec1999-09-08 02:29:08 +00001134 pp_opts = []
1135 for macro in macros:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001136 if not (isinstance(macro, tuple) and 1 <= len(macro) <= 2):
1137 raise TypeError(
1138 "bad macro definition '%s': "
1139 "each element of 'macros' list must be a 1- or 2-tuple"
1140 % macro)
Greg Wardfbf8aff1999-09-21 18:35:09 +00001141
Collin Winter5b7e9d72007-08-30 03:52:21 +00001142 if len(macro) == 1: # undefine this macro
1143 pp_opts.append("-U%s" % macro[0])
1144 elif len(macro) == 2:
Greg Wardf7a39ec1999-09-08 02:29:08 +00001145 if macro[1] is None: # define with no explicit value
Collin Winter5b7e9d72007-08-30 03:52:21 +00001146 pp_opts.append("-D%s" % macro[0])
Greg Wardf7a39ec1999-09-08 02:29:08 +00001147 else:
1148 # XXX *don't* need to be clever about quoting the
1149 # macro value here, because we're going to avoid the
1150 # shell at all costs when we spawn the command!
Collin Winter5b7e9d72007-08-30 03:52:21 +00001151 pp_opts.append("-D%s=%s" % macro)
Greg Wardf7a39ec1999-09-08 02:29:08 +00001152
Greg Ward0bdd90a1999-12-12 17:19:58 +00001153 for dir in include_dirs:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001154 pp_opts.append("-I%s" % dir)
Greg Wardf7a39ec1999-09-08 02:29:08 +00001155 return pp_opts
1156
Greg Wardf7a39ec1999-09-08 02:29:08 +00001157
Greg Wardd03f88a2000-03-18 15:19:51 +00001158def gen_lib_options (compiler, library_dirs, runtime_library_dirs, libraries):
Greg Wardf7a39ec1999-09-08 02:29:08 +00001159 """Generate linker options for searching library directories and
Greg Wardc3a43b42000-06-24 18:10:48 +00001160 linking with specific libraries. 'libraries' and 'library_dirs' are,
1161 respectively, lists of library names (not filenames!) and search
1162 directories. Returns a list of command-line options suitable for use
1163 with some compiler (depending on the two format strings passed in).
1164 """
Greg Wardf7a39ec1999-09-08 02:29:08 +00001165 lib_opts = []
1166
1167 for dir in library_dirs:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001168 lib_opts.append(compiler.library_dir_option(dir))
Greg Wardf7a39ec1999-09-08 02:29:08 +00001169
Greg Wardd03f88a2000-03-18 15:19:51 +00001170 for dir in runtime_library_dirs:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001171 opt = compiler.runtime_library_dir_option(dir)
1172 if isinstance(opt, list):
Martin v. Löwis061f1322004-08-29 16:40:55 +00001173 lib_opts = lib_opts + opt
1174 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001175 lib_opts.append(opt)
Greg Wardd03f88a2000-03-18 15:19:51 +00001176
Greg Wardf7a39ec1999-09-08 02:29:08 +00001177 # XXX it's important that we *not* remove redundant library mentions!
1178 # sometimes you really do have to say "-lfoo -lbar -lfoo" in order to
1179 # resolve all symbols. I just hope we never have to say "-lfoo obj.o
1180 # -lbar" to get things to work -- that's certainly a possibility, but a
1181 # pretty nasty way to arrange your C code.
1182
1183 for lib in libraries:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001184 (lib_dir, lib_name) = os.path.split(lib)
Greg Ward3febd601999-10-03 20:41:02 +00001185 if lib_dir:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001186 lib_file = compiler.find_library_file([lib_dir], lib_name)
Greg Ward3febd601999-10-03 20:41:02 +00001187 if lib_file:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001188 lib_opts.append(lib_file)
Greg Ward3febd601999-10-03 20:41:02 +00001189 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001190 compiler.warn("no library file corresponding to "
1191 "'%s' found (skipping)" % lib)
Greg Ward3febd601999-10-03 20:41:02 +00001192 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001193 lib_opts.append(compiler.library_option (lib))
Greg Wardf7a39ec1999-09-08 02:29:08 +00001194 return lib_opts