blob: 34c77a37a3191556cd97ada52520507e77b215d6 [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é36797272010-07-22 12:50:05 +00008import sys, os, re
9from distutils.errors import *
Greg Warde1aaaa61999-08-14 23:50:50 +000010from distutils.spawn import spawn
Greg Warde5c62bf2000-06-25 02:08:18 +000011from distutils.file_util import move_file
12from distutils.dir_util import mkpath
Tarek Ziadé36797272010-07-22 12:50:05 +000013from distutils.dep_util import newer_pairwise, newer_group
Greg Ward9dddbb42000-08-02 01:38:20 +000014from distutils.util import split_quoted, execute
Jeremy Hyltoncd8a1142002-06-04 20:14:43 +000015from distutils import log
Greg Ward3f81cf71999-07-10 02:03:53 +000016
17class CCompiler:
18 """Abstract base class to define the interface that must be implemented
Greg Wardc3a43b42000-06-24 18:10:48 +000019 by real compiler classes. Also has some utility methods used by
20 several compiler classes.
Greg Ward3f81cf71999-07-10 02:03:53 +000021
Greg Wardc3a43b42000-06-24 18:10:48 +000022 The basic idea behind a compiler abstraction class is that each
23 instance can be used for all the compile/link steps in building a
24 single project. Thus, attributes common to all of those compile and
25 link steps -- include directories, macros to define, libraries to link
26 against, etc. -- are attributes of the compiler instance. To allow for
27 variability in how individual files are treated, most of those
28 attributes may be varied on a per-compilation or per-link basis.
29 """
Greg Ward3f81cf71999-07-10 02:03:53 +000030
Greg Ward802d6b71999-09-29 12:20:55 +000031 # 'compiler_type' is a class attribute that identifies this class. It
32 # keeps code that wants to know what kind of compiler it's dealing with
33 # from having to import all possible compiler classes just to do an
34 # 'isinstance'. In concrete CCompiler subclasses, 'compiler_type'
35 # should really, really be one of the keys of the 'compiler_class'
36 # dictionary (see below -- used by the 'new_compiler()' factory
37 # function) -- authors of new compiler interface classes are
38 # responsible for updating 'compiler_class'!
39 compiler_type = None
Greg Ward3f81cf71999-07-10 02:03:53 +000040
41 # XXX things not handled by this compiler abstraction model:
42 # * client can't provide additional options for a compiler,
43 # e.g. warning, optimization, debugging flags. Perhaps this
44 # should be the domain of concrete compiler abstraction classes
45 # (UnixCCompiler, MSVCCompiler, etc.) -- or perhaps the base
46 # class should have methods for the common ones.
Greg Ward3f81cf71999-07-10 02:03:53 +000047 # * can't completely override the include or library searchg
48 # path, ie. no "cc -I -Idir1 -Idir2" or "cc -L -Ldir1 -Ldir2".
Greg Warde1aaaa61999-08-14 23:50:50 +000049 # I'm not sure how widely supported this is even by Unix
Greg Ward3f81cf71999-07-10 02:03:53 +000050 # compilers, much less on other platforms. And I'm even less
Greg Warde1aaaa61999-08-14 23:50:50 +000051 # sure how useful it is; maybe for cross-compiling, but
52 # support for that is a ways off. (And anyways, cross
53 # compilers probably have a dedicated binary with the
54 # right paths compiled in. I hope.)
Greg Ward3f81cf71999-07-10 02:03:53 +000055 # * can't do really freaky things with the library list/library
56 # dirs, e.g. "-Ldir1 -lfoo -Ldir2 -lfoo" to link against
57 # different versions of libfoo.a in different locations. I
58 # think this is useless without the ability to null out the
59 # library search path anyways.
Fred Drakeb94b8492001-12-06 20:51:35 +000060
Greg Ward3f81cf71999-07-10 02:03:53 +000061
Greg Ward32c4a8a2000-03-06 03:40:29 +000062 # Subclasses that rely on the standard filename generation methods
63 # implemented below should override these; see the comment near
64 # those methods ('object_filenames()' et. al.) for details:
65 src_extensions = None # list of strings
66 obj_extension = None # string
67 static_lib_extension = None
68 shared_lib_extension = None # string
69 static_lib_format = None # format string
70 shared_lib_format = None # prob. same as static_lib_format
71 exe_extension = None # string
72
Gustavo Niemeyer6b016852002-11-05 16:12:02 +000073 # Default language settings. language_map is used to detect a source
74 # file or Extension target language, checking source filenames.
75 # language_order is used to detect the language precedence, when deciding
76 # what language to use when mixing source types. For example, if some
77 # extension has two files with ".c" extension, and one with ".cpp", it
78 # is still linked as c++.
79 language_map = {".c" : "c",
80 ".cc" : "c++",
81 ".cpp" : "c++",
82 ".cxx" : "c++",
83 ".m" : "objc",
84 }
85 language_order = ["c++", "objc", "c"]
Greg Ward32c4a8a2000-03-06 03:40:29 +000086
Collin Winter5b7e9d72007-08-30 03:52:21 +000087 def __init__(self, verbose=0, dry_run=0, force=0):
Greg Warde1aaaa61999-08-14 23:50:50 +000088 self.dry_run = dry_run
Greg Ward3febd601999-10-03 20:41:02 +000089 self.force = force
Skip Montanaro70e1d9b2002-10-01 17:39:59 +000090 self.verbose = verbose
Greg Ward3f81cf71999-07-10 02:03:53 +000091
Greg Ward9b17cb51999-09-13 03:07:24 +000092 # 'output_dir': a common output directory for object, library,
93 # shared object, and shared library files
94 self.output_dir = None
95
Greg Ward3f81cf71999-07-10 02:03:53 +000096 # 'macros': a list of macro definitions (or undefinitions). A
97 # macro definition is a 2-tuple (name, value), where the value is
98 # either a string or None (no explicit value). A macro
99 # undefinition is a 1-tuple (name,).
100 self.macros = []
101
Greg Ward3f81cf71999-07-10 02:03:53 +0000102 # 'include_dirs': a list of directories to search for include files
103 self.include_dirs = []
104
105 # 'libraries': a list of libraries to include in any link
106 # (library names, not filenames: eg. "foo" not "libfoo.a")
107 self.libraries = []
108
109 # 'library_dirs': a list of directories to search for libraries
110 self.library_dirs = []
111
Greg Warde1aaaa61999-08-14 23:50:50 +0000112 # 'runtime_library_dirs': a list of directories to search for
113 # shared libraries/objects at runtime
114 self.runtime_library_dirs = []
115
Greg Ward3f81cf71999-07-10 02:03:53 +0000116 # 'objects': a list of object files (or similar, such as explicitly
117 # named library files) to include on any link
118 self.objects = []
119
Greg Warde5c62bf2000-06-25 02:08:18 +0000120 for key in self.executables.keys():
121 self.set_executable(key, self.executables[key])
122
Collin Winter5b7e9d72007-08-30 03:52:21 +0000123 def set_executables(self, **kwargs):
Greg Warde5c62bf2000-06-25 02:08:18 +0000124 """Define the executables (and options for them) that will be run
125 to perform the various stages of compilation. The exact set of
126 executables that may be specified here depends on the compiler
127 class (via the 'executables' class attribute), but most will have:
128 compiler the C/C++ compiler
129 linker_so linker used to create shared objects and libraries
130 linker_exe linker used to create binary executables
131 archiver static library creator
132
133 On platforms with a command-line (Unix, DOS/Windows), each of these
134 is a string that will be split into executable name and (optional)
135 list of arguments. (Splitting the string is done similarly to how
136 Unix shells operate: words are delimited by spaces, but quotes and
137 backslashes can override this. See
138 'distutils.util.split_quoted()'.)
139 """
140
141 # Note that some CCompiler implementation classes will define class
142 # attributes 'cpp', 'cc', etc. with hard-coded executable names;
143 # this is appropriate when a compiler class is for exactly one
144 # compiler/OS combination (eg. MSVCCompiler). Other compiler
145 # classes (UnixCCompiler, in particular) are driven by information
146 # discovered at run-time, since there are many different ways to do
147 # basically the same things with Unix C compilers.
148
Christian Heimesc3f30c42008-02-22 16:37:40 +0000149 for key in kwargs:
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000150 if key not in self.executables:
Christian Heimesc3f30c42008-02-22 16:37:40 +0000151 raise ValueError("unknown executable '%s' for class %s" %
Collin Winter5b7e9d72007-08-30 03:52:21 +0000152 (key, self.__class__.__name__))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000153 self.set_executable(key, kwargs[key])
Greg Warde5c62bf2000-06-25 02:08:18 +0000154
155 def set_executable(self, key, value):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000156 if isinstance(value, str):
Greg Warde5c62bf2000-06-25 02:08:18 +0000157 setattr(self, key, split_quoted(value))
158 else:
159 setattr(self, key, value)
Fred Drakeb94b8492001-12-06 20:51:35 +0000160
Collin Winter5b7e9d72007-08-30 03:52:21 +0000161 def _find_macro(self, name):
Greg Ward3f81cf71999-07-10 02:03:53 +0000162 i = 0
163 for defn in self.macros:
164 if defn[0] == name:
165 return i
Collin Winter5b7e9d72007-08-30 03:52:21 +0000166 i += 1
Greg Ward3f81cf71999-07-10 02:03:53 +0000167 return None
168
Collin Winter5b7e9d72007-08-30 03:52:21 +0000169 def _check_macro_definitions(self, definitions):
Greg Ward3f81cf71999-07-10 02:03:53 +0000170 """Ensures that every element of 'definitions' is a valid macro
Greg Wardc3a43b42000-06-24 18:10:48 +0000171 definition, ie. either (name,value) 2-tuple or a (name,) tuple. Do
172 nothing if all definitions are OK, raise TypeError otherwise.
173 """
Greg Ward3f81cf71999-07-10 02:03:53 +0000174 for defn in definitions:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000175 if not (isinstance(defn, tuple) and
176 (len(defn) in (1, 2) and
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000177 (isinstance (defn[1], str) or defn[1] is None)) and
178 isinstance (defn[0], str)):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000179 raise TypeError(("invalid macro definition '%s': " % defn) + \
Greg Ward3f81cf71999-07-10 02:03:53 +0000180 "must be tuple (string,), (string, string), or " + \
Collin Winter5b7e9d72007-08-30 03:52:21 +0000181 "(string, None)")
Greg Ward3f81cf71999-07-10 02:03:53 +0000182
183
184 # -- Bookkeeping methods -------------------------------------------
185
Collin Winter5b7e9d72007-08-30 03:52:21 +0000186 def define_macro(self, name, value=None):
Greg Wardc3a43b42000-06-24 18:10:48 +0000187 """Define a preprocessor macro for all compilations driven by this
188 compiler object. The optional parameter 'value' should be a
189 string; if it is not supplied, then the macro will be defined
190 without an explicit value and the exact outcome depends on the
191 compiler used (XXX true? does ANSI say anything about this?)
192 """
Greg Ward3f81cf71999-07-10 02:03:53 +0000193 # Delete from the list of macro definitions/undefinitions if
194 # already there (so that this one will take precedence).
195 i = self._find_macro (name)
196 if i is not None:
197 del self.macros[i]
198
Collin Winter5b7e9d72007-08-30 03:52:21 +0000199 self.macros.append((name, value))
Greg Ward3f81cf71999-07-10 02:03:53 +0000200
Collin Winter5b7e9d72007-08-30 03:52:21 +0000201 def undefine_macro(self, name):
Greg Ward3f81cf71999-07-10 02:03:53 +0000202 """Undefine a preprocessor macro for all compilations driven by
Greg Wardc3a43b42000-06-24 18:10:48 +0000203 this compiler object. If the same macro is defined by
204 'define_macro()' and undefined by 'undefine_macro()' the last call
205 takes precedence (including multiple redefinitions or
206 undefinitions). If the macro is redefined/undefined on a
207 per-compilation basis (ie. in the call to 'compile()'), then that
208 takes precedence.
209 """
Greg Ward3f81cf71999-07-10 02:03:53 +0000210 # Delete from the list of macro definitions/undefinitions if
211 # already there (so that this one will take precedence).
212 i = self._find_macro (name)
213 if i is not None:
214 del self.macros[i]
215
216 undefn = (name,)
Collin Winter5b7e9d72007-08-30 03:52:21 +0000217 self.macros.append(undefn)
Greg Ward3f81cf71999-07-10 02:03:53 +0000218
Collin Winter5b7e9d72007-08-30 03:52:21 +0000219 def add_include_dir(self, dir):
Greg Wardc3a43b42000-06-24 18:10:48 +0000220 """Add 'dir' to the list of directories that will be searched for
221 header files. The compiler is instructed to search directories in
222 the order in which they are supplied by successive calls to
223 'add_include_dir()'.
224 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000225 self.include_dirs.append(dir)
Greg Ward3f81cf71999-07-10 02:03:53 +0000226
Collin Winter5b7e9d72007-08-30 03:52:21 +0000227 def set_include_dirs(self, dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +0000228 """Set the list of directories that will be searched to 'dirs' (a
229 list of strings). Overrides any preceding calls to
230 'add_include_dir()'; subsequence calls to 'add_include_dir()' add
231 to the list passed to 'set_include_dirs()'. This does not affect
232 any list of standard include directories that the compiler may
233 search by default.
234 """
Antoine Pitrou56a00de2009-05-15 17:34:21 +0000235 self.include_dirs = dirs[:]
Greg Ward3f81cf71999-07-10 02:03:53 +0000236
Collin Winter5b7e9d72007-08-30 03:52:21 +0000237 def add_library(self, libname):
Greg Wardc3a43b42000-06-24 18:10:48 +0000238 """Add 'libname' to the list of libraries that will be included in
239 all links driven by this compiler object. Note that 'libname'
240 should *not* be the name of a file containing a library, but the
241 name of the library itself: the actual filename will be inferred by
242 the linker, the compiler, or the compiler class (depending on the
243 platform).
Greg Ward3f81cf71999-07-10 02:03:53 +0000244
Greg Wardc3a43b42000-06-24 18:10:48 +0000245 The linker will be instructed to link against libraries in the
246 order they were supplied to 'add_library()' and/or
247 'set_libraries()'. It is perfectly valid to duplicate library
248 names; the linker will be instructed to link against libraries as
249 many times as they are mentioned.
250 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000251 self.libraries.append(libname)
Greg Ward3f81cf71999-07-10 02:03:53 +0000252
Collin Winter5b7e9d72007-08-30 03:52:21 +0000253 def set_libraries(self, libnames):
Greg Wardc3a43b42000-06-24 18:10:48 +0000254 """Set the list of libraries to be included in all links driven by
255 this compiler object to 'libnames' (a list of strings). This does
256 not affect any standard system libraries that the linker may
257 include by default.
258 """
Antoine Pitrou56a00de2009-05-15 17:34:21 +0000259 self.libraries = libnames[:]
Greg Ward3f81cf71999-07-10 02:03:53 +0000260
Collin Winter5b7e9d72007-08-30 03:52:21 +0000261 def add_library_dir(self, dir):
Greg Ward3f81cf71999-07-10 02:03:53 +0000262 """Add 'dir' to the list of directories that will be searched for
Greg Wardc3a43b42000-06-24 18:10:48 +0000263 libraries specified to 'add_library()' and 'set_libraries()'. The
264 linker will be instructed to search for libraries in the order they
265 are supplied to 'add_library_dir()' and/or 'set_library_dirs()'.
266 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000267 self.library_dirs.append(dir)
Greg Ward3f81cf71999-07-10 02:03:53 +0000268
Collin Winter5b7e9d72007-08-30 03:52:21 +0000269 def set_library_dirs(self, dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +0000270 """Set the list of library search directories to 'dirs' (a list of
271 strings). This does not affect any standard library search path
272 that the linker may search by default.
273 """
Antoine Pitrou56a00de2009-05-15 17:34:21 +0000274 self.library_dirs = dirs[:]
Greg Ward3f81cf71999-07-10 02:03:53 +0000275
Collin Winter5b7e9d72007-08-30 03:52:21 +0000276 def add_runtime_library_dir(self, dir):
Greg Warde1aaaa61999-08-14 23:50:50 +0000277 """Add 'dir' to the list of directories that will be searched for
Greg Wardc3a43b42000-06-24 18:10:48 +0000278 shared libraries at runtime.
279 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000280 self.runtime_library_dirs.append(dir)
Greg Warde1aaaa61999-08-14 23:50:50 +0000281
Collin Winter5b7e9d72007-08-30 03:52:21 +0000282 def set_runtime_library_dirs(self, dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +0000283 """Set the list of directories to search for shared libraries at
284 runtime to 'dirs' (a list of strings). This does not affect any
285 standard search path that the runtime linker may search by
286 default.
287 """
Antoine Pitrou56a00de2009-05-15 17:34:21 +0000288 self.runtime_library_dirs = dirs[:]
Greg Warde1aaaa61999-08-14 23:50:50 +0000289
Collin Winter5b7e9d72007-08-30 03:52:21 +0000290 def add_link_object(self, object):
Greg Wardc3a43b42000-06-24 18:10:48 +0000291 """Add 'object' to the list of object files (or analogues, such as
Greg Ward612eb9f2000-07-27 02:13:20 +0000292 explicitly named library files or the output of "resource
Greg Wardc3a43b42000-06-24 18:10:48 +0000293 compilers") to be included in every link driven by this compiler
294 object.
295 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000296 self.objects.append(object)
Greg Ward3f81cf71999-07-10 02:03:53 +0000297
Collin Winter5b7e9d72007-08-30 03:52:21 +0000298 def set_link_objects(self, objects):
Greg Wardc3a43b42000-06-24 18:10:48 +0000299 """Set the list of object files (or analogues) to be included in
300 every link to 'objects'. This does not affect any standard object
301 files that the linker may include by default (such as system
302 libraries).
303 """
Antoine Pitrou56a00de2009-05-15 17:34:21 +0000304 self.objects = objects[:]
Greg Ward3f81cf71999-07-10 02:03:53 +0000305
306
Thomas Hellere6500802002-04-25 17:03:30 +0000307 # -- Private utility methods --------------------------------------
Greg Ward32c4a8a2000-03-06 03:40:29 +0000308 # (here for the convenience of subclasses)
309
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000310 # Helper method to prep compiler in subclass compile() methods
311
312 def _setup_compile(self, outdir, macros, incdirs, sources, depends,
313 extra):
Tarek Ziadéac4e6ea2010-01-11 23:15:52 +0000314 """Process arguments and decide which source files to compile."""
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000315 if outdir is None:
316 outdir = self.output_dir
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000317 elif not isinstance(outdir, str):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000318 raise TypeError("'output_dir' must be a string or None")
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000319
320 if macros is None:
321 macros = self.macros
Collin Winter5b7e9d72007-08-30 03:52:21 +0000322 elif isinstance(macros, list):
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000323 macros = macros + (self.macros or [])
324 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000325 raise TypeError("'macros' (if supplied) must be a list of tuples")
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000326
327 if incdirs is None:
328 incdirs = self.include_dirs
Collin Winter5b7e9d72007-08-30 03:52:21 +0000329 elif isinstance(incdirs, (list, tuple)):
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000330 incdirs = list(incdirs) + (self.include_dirs or [])
331 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000332 raise TypeError(
333 "'include_dirs' (if supplied) must be a list of strings")
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000334
335 if extra is None:
336 extra = []
337
338 # Get the list of expected output (object) files
Collin Winter5b7e9d72007-08-30 03:52:21 +0000339 objects = self.object_filenames(sources, strip_dir=0,
Andrew M. Kuchling8c6e0ec2002-12-29 17:00:57 +0000340 output_dir=outdir)
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000341 assert len(objects) == len(sources)
342
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000343 pp_opts = gen_preprocess_options(macros, incdirs)
344
345 build = {}
346 for i in range(len(sources)):
347 src = sources[i]
348 obj = objects[i]
349 ext = os.path.splitext(src)[1]
350 self.mkpath(os.path.dirname(obj))
Tarek Ziadéac4e6ea2010-01-11 23:15:52 +0000351 build[obj] = (src, ext)
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000352
353 return macros, objects, extra, pp_opts, build
354
355 def _get_cc_args(self, pp_opts, debug, before):
356 # works for unixccompiler, emxccompiler, cygwinccompiler
357 cc_args = pp_opts + ['-c']
358 if debug:
359 cc_args[:0] = ['-g']
360 if before:
361 cc_args[:0] = before
362 return cc_args
363
Collin Winter5b7e9d72007-08-30 03:52:21 +0000364 def _fix_compile_args(self, output_dir, macros, include_dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +0000365 """Typecheck and fix-up some of the arguments to the 'compile()'
366 method, and return fixed-up values. Specifically: if 'output_dir'
367 is None, replaces it with 'self.output_dir'; ensures that 'macros'
368 is a list, and augments it with 'self.macros'; ensures that
369 'include_dirs' is a list, and augments it with 'self.include_dirs'.
370 Guarantees that the returned values are of the correct type,
371 i.e. for 'output_dir' either string or None, and for 'macros' and
372 'include_dirs' either list or None.
373 """
Greg Ward32c4a8a2000-03-06 03:40:29 +0000374 if output_dir is None:
375 output_dir = self.output_dir
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000376 elif not isinstance(output_dir, str):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000377 raise TypeError("'output_dir' must be a string or None")
Greg Ward32c4a8a2000-03-06 03:40:29 +0000378
379 if macros is None:
380 macros = self.macros
Collin Winter5b7e9d72007-08-30 03:52:21 +0000381 elif isinstance(macros, list):
Greg Ward32c4a8a2000-03-06 03:40:29 +0000382 macros = macros + (self.macros or [])
383 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000384 raise TypeError("'macros' (if supplied) must be a list of tuples")
Greg Ward32c4a8a2000-03-06 03:40:29 +0000385
386 if include_dirs is None:
387 include_dirs = self.include_dirs
Collin Winter5b7e9d72007-08-30 03:52:21 +0000388 elif isinstance(include_dirs, (list, tuple)):
389 include_dirs = list(include_dirs) + (self.include_dirs or [])
Greg Ward32c4a8a2000-03-06 03:40:29 +0000390 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000391 raise TypeError(
392 "'include_dirs' (if supplied) must be a list of strings")
Fred Drakeb94b8492001-12-06 20:51:35 +0000393
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000394 return output_dir, macros, include_dirs
Greg Ward32c4a8a2000-03-06 03:40:29 +0000395
Tarek Ziadé36797272010-07-22 12:50:05 +0000396 def _prep_compile(self, sources, output_dir, depends=None):
397 """Decide which souce files must be recompiled.
398
399 Determine the list of object files corresponding to 'sources',
400 and figure out which ones really need to be recompiled.
401 Return a list of all object files and a dictionary telling
402 which source files can be skipped.
403 """
404 # Get the list of expected output (object) files
405 objects = self.object_filenames(sources, output_dir=output_dir)
406 assert len(objects) == len(sources)
407
408 # Return an empty dict for the "which source files can be skipped"
409 # return value to preserve API compatibility.
410 return objects, {}
411
Collin Winter5b7e9d72007-08-30 03:52:21 +0000412 def _fix_object_args(self, objects, output_dir):
Greg Wardc3a43b42000-06-24 18:10:48 +0000413 """Typecheck and fix up some arguments supplied to various methods.
414 Specifically: ensure that 'objects' is a list; if output_dir is
415 None, replace with self.output_dir. Return fixed versions of
416 'objects' and 'output_dir'.
417 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000418 if not isinstance(objects, (list, tuple)):
419 raise TypeError("'objects' must be a list or tuple of strings")
420 objects = list(objects)
Fred Drakeb94b8492001-12-06 20:51:35 +0000421
Greg Ward32c4a8a2000-03-06 03:40:29 +0000422 if output_dir is None:
423 output_dir = self.output_dir
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000424 elif not isinstance(output_dir, str):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000425 raise TypeError("'output_dir' must be a string or None")
Greg Ward32c4a8a2000-03-06 03:40:29 +0000426
Greg Wardf10f95d2000-03-26 21:37:09 +0000427 return (objects, output_dir)
Greg Ward32c4a8a2000-03-06 03:40:29 +0000428
Collin Winter5b7e9d72007-08-30 03:52:21 +0000429 def _fix_lib_args(self, libraries, library_dirs, runtime_library_dirs):
Greg Wardf10f95d2000-03-26 21:37:09 +0000430 """Typecheck and fix up some of the arguments supplied to the
Greg Wardc3a43b42000-06-24 18:10:48 +0000431 'link_*' methods. Specifically: ensure that all arguments are
432 lists, and augment them with their permanent versions
433 (eg. 'self.libraries' augments 'libraries'). Return a tuple with
434 fixed versions of all arguments.
435 """
Greg Wardf10f95d2000-03-26 21:37:09 +0000436 if libraries is None:
437 libraries = self.libraries
Collin Winter5b7e9d72007-08-30 03:52:21 +0000438 elif isinstance(libraries, (list, tuple)):
Greg Wardf10f95d2000-03-26 21:37:09 +0000439 libraries = list (libraries) + (self.libraries or [])
Greg Ward32c4a8a2000-03-06 03:40:29 +0000440 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000441 raise TypeError(
442 "'libraries' (if supplied) must be a list of strings")
Greg Ward32c4a8a2000-03-06 03:40:29 +0000443
Greg Wardf10f95d2000-03-26 21:37:09 +0000444 if library_dirs is None:
445 library_dirs = self.library_dirs
Collin Winter5b7e9d72007-08-30 03:52:21 +0000446 elif isinstance(library_dirs, (list, tuple)):
Greg Wardf10f95d2000-03-26 21:37:09 +0000447 library_dirs = list (library_dirs) + (self.library_dirs or [])
448 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000449 raise TypeError(
450 "'library_dirs' (if supplied) must be a list of strings")
Greg Wardf10f95d2000-03-26 21:37:09 +0000451
452 if runtime_library_dirs is None:
453 runtime_library_dirs = self.runtime_library_dirs
Collin Winter5b7e9d72007-08-30 03:52:21 +0000454 elif isinstance(runtime_library_dirs, (list, tuple)):
455 runtime_library_dirs = (list(runtime_library_dirs) +
Greg Wardf10f95d2000-03-26 21:37:09 +0000456 (self.runtime_library_dirs or []))
457 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000458 raise TypeError("'runtime_library_dirs' (if supplied) "
459 "must be a list of strings")
Greg Wardf10f95d2000-03-26 21:37:09 +0000460
461 return (libraries, library_dirs, runtime_library_dirs)
462
Collin Winter5b7e9d72007-08-30 03:52:21 +0000463 def _need_link(self, objects, output_file):
Greg Wardc3a43b42000-06-24 18:10:48 +0000464 """Return true if we need to relink the files listed in 'objects'
465 to recreate 'output_file'.
466 """
Greg Ward32c4a8a2000-03-06 03:40:29 +0000467 if self.force:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000468 return True
Greg Ward32c4a8a2000-03-06 03:40:29 +0000469 else:
470 if self.dry_run:
471 newer = newer_group (objects, output_file, missing='newer')
472 else:
473 newer = newer_group (objects, output_file)
474 return newer
475
Collin Winter5b7e9d72007-08-30 03:52:21 +0000476 def detect_language(self, sources):
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000477 """Detect the language of a given file, or list of files. Uses
478 language_map, and language_order to do the job.
479 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000480 if not isinstance(sources, list):
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000481 sources = [sources]
482 lang = None
483 index = len(self.language_order)
484 for source in sources:
485 base, ext = os.path.splitext(source)
486 extlang = self.language_map.get(ext)
487 try:
488 extindex = self.language_order.index(extlang)
489 if extindex < index:
490 lang = extlang
491 index = extindex
492 except ValueError:
493 pass
494 return lang
495
Greg Ward32c4a8a2000-03-06 03:40:29 +0000496
Greg Ward3f81cf71999-07-10 02:03:53 +0000497 # -- Worker methods ------------------------------------------------
498 # (must be implemented by subclasses)
499
Collin Winter5b7e9d72007-08-30 03:52:21 +0000500 def preprocess(self, source, output_file=None, macros=None,
501 include_dirs=None, extra_preargs=None, extra_postargs=None):
Greg Ward3ff3b032000-06-21 02:58:46 +0000502 """Preprocess a single C/C++ source file, named in 'source'.
503 Output will be written to file named 'output_file', or stdout if
504 'output_file' not supplied. 'macros' is a list of macro
505 definitions as for 'compile()', which will augment the macros set
506 with 'define_macro()' and 'undefine_macro()'. 'include_dirs' is a
507 list of directory names that will be added to the default list.
Greg Warde5c62bf2000-06-25 02:08:18 +0000508
509 Raises PreprocessError on failure.
Greg Ward3ff3b032000-06-21 02:58:46 +0000510 """
511 pass
512
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000513 def compile(self, sources, output_dir=None, macros=None,
514 include_dirs=None, debug=0, extra_preargs=None,
515 extra_postargs=None, depends=None):
516 """Compile one or more source files.
517
518 'sources' must be a list of filenames, most likely C/C++
519 files, but in reality anything that can be handled by a
520 particular compiler and compiler class (eg. MSVCCompiler can
521 handle resource files in 'sources'). Return a list of object
522 filenames, one per source filename in 'sources'. Depending on
523 the implementation, not all source files will necessarily be
524 compiled, but all corresponding object filenames will be
525 returned.
Greg Ward32c4a8a2000-03-06 03:40:29 +0000526
Greg Wardc3a43b42000-06-24 18:10:48 +0000527 If 'output_dir' is given, object files will be put under it, while
528 retaining their original path component. That is, "foo/bar.c"
529 normally compiles to "foo/bar.o" (for a Unix implementation); if
530 'output_dir' is "build", then it would compile to
531 "build/foo/bar.o".
Greg Ward3f81cf71999-07-10 02:03:53 +0000532
Greg Wardc3a43b42000-06-24 18:10:48 +0000533 'macros', if given, must be a list of macro definitions. A macro
534 definition is either a (name, value) 2-tuple or a (name,) 1-tuple.
535 The former defines a macro; if the value is None, the macro is
536 defined without an explicit value. The 1-tuple case undefines a
537 macro. Later definitions/redefinitions/ undefinitions take
538 precedence.
Greg Ward3f81cf71999-07-10 02:03:53 +0000539
Greg Wardc3a43b42000-06-24 18:10:48 +0000540 'include_dirs', if given, must be a list of strings, the
541 directories to add to the default include file search path for this
542 compilation only.
Greg Ward3c045a52000-02-09 02:16:14 +0000543
Greg Wardc3a43b42000-06-24 18:10:48 +0000544 'debug' is a boolean; if true, the compiler will be instructed to
545 output debug symbols in (or alongside) the object file(s).
Greg Ward802d6b71999-09-29 12:20:55 +0000546
Greg Wardc3a43b42000-06-24 18:10:48 +0000547 'extra_preargs' and 'extra_postargs' are implementation- dependent.
548 On platforms that have the notion of a command-line (e.g. Unix,
549 DOS/Windows), they are most likely lists of strings: extra
550 command-line arguments to prepand/append to the compiler command
551 line. On other platforms, consult the implementation class
552 documentation. In any event, they are intended as an escape hatch
553 for those occasions when the abstract compiler framework doesn't
554 cut the mustard.
Greg Wardd1517112000-05-30 01:56:44 +0000555
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000556 'depends', if given, is a list of filenames that all targets
557 depend on. If a source file is older than any file in
558 depends, then the source file will be recompiled. This
559 supports dependency tracking, but only at a coarse
560 granularity.
561
Greg Wardc3a43b42000-06-24 18:10:48 +0000562 Raises CompileError on failure.
563 """
Jeremy Hylton6e08d222002-06-18 18:42:41 +0000564 # A concrete compiler class can either override this method
565 # entirely or implement _compile().
Jeremy Hylton6e08d222002-06-18 18:42:41 +0000566 macros, objects, extra_postargs, pp_opts, build = \
567 self._setup_compile(output_dir, macros, include_dirs, sources,
568 depends, extra_postargs)
569 cc_args = self._get_cc_args(pp_opts, debug, extra_preargs)
570
Thomas Heller9436a752003-12-05 20:12:23 +0000571 for obj in objects:
572 try:
573 src, ext = build[obj]
574 except KeyError:
575 continue
Jeremy Hylton6e08d222002-06-18 18:42:41 +0000576 self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
577
578 # Return *all* object filenames, not just the ones we just built.
579 return objects
580
581 def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
582 """Compile 'src' to product 'obj'."""
Jeremy Hylton6e08d222002-06-18 18:42:41 +0000583 # A concrete compiler class that does not override compile()
584 # should implement _compile().
585 pass
Greg Ward3f81cf71999-07-10 02:03:53 +0000586
Collin Winter5b7e9d72007-08-30 03:52:21 +0000587 def create_static_lib(self, objects, output_libname, output_dir=None,
588 debug=0, target_lang=None):
Greg Wardc3a43b42000-06-24 18:10:48 +0000589 """Link a bunch of stuff together to create a static library file.
590 The "bunch of stuff" consists of the list of object files supplied
591 as 'objects', the extra object files supplied to
592 'add_link_object()' and/or 'set_link_objects()', the libraries
593 supplied to 'add_library()' and/or 'set_libraries()', and the
594 libraries supplied as 'libraries' (if any).
Greg Ward3f81cf71999-07-10 02:03:53 +0000595
Greg Wardc3a43b42000-06-24 18:10:48 +0000596 'output_libname' should be a library name, not a filename; the
597 filename will be inferred from the library name. 'output_dir' is
598 the directory where the library file will be put.
Greg Ward3c045a52000-02-09 02:16:14 +0000599
Greg Wardc3a43b42000-06-24 18:10:48 +0000600 'debug' is a boolean; if true, debugging information will be
601 included in the library (note that on most platforms, it is the
602 compile step where this matters: the 'debug' flag is included here
603 just for consistency).
Greg Wardd1517112000-05-30 01:56:44 +0000604
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000605 'target_lang' is the target language for which the given objects
606 are being compiled. This allows specific linkage time treatment of
607 certain languages.
608
Greg Wardc3a43b42000-06-24 18:10:48 +0000609 Raises LibError on failure.
610 """
Greg Ward3c045a52000-02-09 02:16:14 +0000611 pass
Fred Drakeb94b8492001-12-06 20:51:35 +0000612
Tarek Ziadé36797272010-07-22 12:50:05 +0000613
Greg Ward42406482000-09-27 02:08:14 +0000614 # values for target_desc parameter in link()
615 SHARED_OBJECT = "shared_object"
616 SHARED_LIBRARY = "shared_library"
617 EXECUTABLE = "executable"
618
Tarek Ziadé36797272010-07-22 12:50:05 +0000619 def link(self,
620 target_desc,
621 objects,
622 output_filename,
623 output_dir=None,
624 libraries=None,
625 library_dirs=None,
626 runtime_library_dirs=None,
627 export_symbols=None,
628 debug=0,
629 extra_preargs=None,
630 extra_postargs=None,
631 build_temp=None,
632 target_lang=None):
Greg Ward42406482000-09-27 02:08:14 +0000633 """Link a bunch of stuff together to create an executable or
634 shared library file.
635
636 The "bunch of stuff" consists of the list of object files supplied
637 as 'objects'. 'output_filename' should be a filename. If
638 'output_dir' is supplied, 'output_filename' is relative to it
639 (i.e. 'output_filename' can provide directory components if
640 needed).
Greg Ward3febd601999-10-03 20:41:02 +0000641
Greg Wardc3a43b42000-06-24 18:10:48 +0000642 'libraries' is a list of libraries to link against. These are
643 library names, not filenames, since they're translated into
644 filenames in a platform-specific way (eg. "foo" becomes "libfoo.a"
645 on Unix and "foo.lib" on DOS/Windows). However, they can include a
646 directory component, which means the linker will look in that
647 specific directory rather than searching all the normal locations.
Greg Ward5299b6a2000-05-20 13:23:21 +0000648
Greg Wardc3a43b42000-06-24 18:10:48 +0000649 'library_dirs', if supplied, should be a list of directories to
650 search for libraries that were specified as bare library names
651 (ie. no directory component). These are on top of the system
652 default and those supplied to 'add_library_dir()' and/or
653 'set_library_dirs()'. 'runtime_library_dirs' is a list of
654 directories that will be embedded into the shared library and used
655 to search for other shared libraries that *it* depends on at
656 run-time. (This may only be relevant on Unix.)
Greg Ward802d6b71999-09-29 12:20:55 +0000657
Greg Wardc3a43b42000-06-24 18:10:48 +0000658 'export_symbols' is a list of symbols that the shared library will
659 export. (This appears to be relevant only on Windows.)
Greg Ward3c045a52000-02-09 02:16:14 +0000660
Greg Wardc3a43b42000-06-24 18:10:48 +0000661 'debug' is as for 'compile()' and 'create_static_lib()', with the
662 slight distinction that it actually matters on most platforms (as
663 opposed to 'create_static_lib()', which includes a 'debug' flag
664 mostly for form's sake).
Greg Wardd1517112000-05-30 01:56:44 +0000665
Greg Wardc3a43b42000-06-24 18:10:48 +0000666 'extra_preargs' and 'extra_postargs' are as for 'compile()' (except
667 of course that they supply command-line arguments for the
668 particular linker being used).
Greg Ward3f81cf71999-07-10 02:03:53 +0000669
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000670 'target_lang' is the target language for which the given objects
671 are being compiled. This allows specific linkage time treatment of
672 certain languages.
673
Greg Wardc3a43b42000-06-24 18:10:48 +0000674 Raises LinkError on failure.
675 """
Greg Ward42406482000-09-27 02:08:14 +0000676 raise NotImplementedError
677
Fred Drakeb94b8492001-12-06 20:51:35 +0000678
Greg Ward264cf742000-09-27 02:24:21 +0000679 # Old 'link_*()' methods, rewritten to use the new 'link()' method.
Greg Ward42406482000-09-27 02:08:14 +0000680
Tarek Ziadé36797272010-07-22 12:50:05 +0000681 def link_shared_lib(self,
682 objects,
683 output_libname,
684 output_dir=None,
685 libraries=None,
686 library_dirs=None,
687 runtime_library_dirs=None,
688 export_symbols=None,
689 debug=0,
690 extra_preargs=None,
691 extra_postargs=None,
692 build_temp=None,
693 target_lang=None):
Fred Drakeb94b8492001-12-06 20:51:35 +0000694 self.link(CCompiler.SHARED_LIBRARY, objects,
Greg Ward42406482000-09-27 02:08:14 +0000695 self.library_filename(output_libname, lib_type='shared'),
696 output_dir,
697 libraries, library_dirs, runtime_library_dirs,
698 export_symbols, debug,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000699 extra_preargs, extra_postargs, build_temp, target_lang)
Fred Drakeb94b8492001-12-06 20:51:35 +0000700
Greg Ward3f81cf71999-07-10 02:03:53 +0000701
Tarek Ziadé36797272010-07-22 12:50:05 +0000702 def link_shared_object(self,
703 objects,
704 output_filename,
705 output_dir=None,
706 libraries=None,
707 library_dirs=None,
708 runtime_library_dirs=None,
709 export_symbols=None,
710 debug=0,
711 extra_preargs=None,
712 extra_postargs=None,
713 build_temp=None,
714 target_lang=None):
Greg Ward42406482000-09-27 02:08:14 +0000715 self.link(CCompiler.SHARED_OBJECT, objects,
716 output_filename, output_dir,
717 libraries, library_dirs, runtime_library_dirs,
718 export_symbols, debug,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000719 extra_preargs, extra_postargs, build_temp, target_lang)
Greg Ward3f81cf71999-07-10 02:03:53 +0000720
Greg Warde1aaaa61999-08-14 23:50:50 +0000721
Tarek Ziadé36797272010-07-22 12:50:05 +0000722 def link_executable(self,
723 objects,
724 output_progname,
725 output_dir=None,
726 libraries=None,
727 library_dirs=None,
728 runtime_library_dirs=None,
729 debug=0,
730 extra_preargs=None,
731 extra_postargs=None,
732 target_lang=None):
Fred Drakeb94b8492001-12-06 20:51:35 +0000733 self.link(CCompiler.EXECUTABLE, objects,
Greg Ward264cf742000-09-27 02:24:21 +0000734 self.executable_filename(output_progname), output_dir,
Fred Drakeb94b8492001-12-06 20:51:35 +0000735 libraries, library_dirs, runtime_library_dirs, None,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000736 debug, extra_preargs, extra_postargs, None, target_lang)
Greg Ward5baf1c22000-01-09 22:41:02 +0000737
738
Greg Wardf7edea72000-05-20 13:31:32 +0000739 # -- Miscellaneous methods -----------------------------------------
740 # These are all used by the 'gen_lib_options() function; there is
741 # no appropriate default implementation so subclasses should
742 # implement all of these.
743
Collin Winter5b7e9d72007-08-30 03:52:21 +0000744 def library_dir_option(self, dir):
Greg Wardc3a43b42000-06-24 18:10:48 +0000745 """Return the compiler option to add 'dir' to the list of
746 directories searched for libraries.
747 """
Greg Wardf7edea72000-05-20 13:31:32 +0000748 raise NotImplementedError
749
Collin Winter5b7e9d72007-08-30 03:52:21 +0000750 def runtime_library_dir_option(self, dir):
Greg Wardc3a43b42000-06-24 18:10:48 +0000751 """Return the compiler option to add 'dir' to the list of
752 directories searched for runtime libraries.
753 """
Greg Wardf7edea72000-05-20 13:31:32 +0000754 raise NotImplementedError
755
Collin Winter5b7e9d72007-08-30 03:52:21 +0000756 def library_option(self, lib):
Greg Wardf7edea72000-05-20 13:31:32 +0000757 """Return the compiler option to add 'dir' to the list of libraries
Greg Wardc3a43b42000-06-24 18:10:48 +0000758 linked into the shared library or executable.
759 """
Greg Wardf7edea72000-05-20 13:31:32 +0000760 raise NotImplementedError
761
Collin Winter5b7e9d72007-08-30 03:52:21 +0000762 def has_function(self, funcname, includes=None, include_dirs=None,
763 libraries=None, library_dirs=None):
Skip Montanarofa012612003-04-24 19:49:23 +0000764 """Return a boolean indicating whether funcname is supported on
765 the current platform. The optional arguments can be used to
766 augment the compilation environment.
767 """
Skip Montanarofa012612003-04-24 19:49:23 +0000768 # this can't be included at module scope because it tries to
769 # import math which might not be available at that point - maybe
770 # the necessary logic should just be inlined?
771 import tempfile
772 if includes is None:
773 includes = []
774 if include_dirs is None:
775 include_dirs = []
776 if libraries is None:
777 libraries = []
778 if library_dirs is None:
779 library_dirs = []
780 fd, fname = tempfile.mkstemp(".c", funcname, text=True)
781 f = os.fdopen(fd, "w")
782 for incl in includes:
783 f.write("""#include "%s"\n""" % incl)
784 f.write("""\
785main (int argc, char **argv) {
786 %s();
787}
788""" % funcname)
789 f.close()
790 try:
791 objects = self.compile([fname], include_dirs=include_dirs)
792 except CompileError:
793 return False
794
795 try:
796 self.link_executable(objects, "a.out",
797 libraries=libraries,
798 library_dirs=library_dirs)
799 except (LinkError, TypeError):
800 return False
801 return True
802
Greg Warde5e60152000-08-04 01:28:39 +0000803 def find_library_file (self, dirs, lib, debug=0):
Greg Wardf7edea72000-05-20 13:31:32 +0000804 """Search the specified list of directories for a static or shared
Greg Warde5e60152000-08-04 01:28:39 +0000805 library file 'lib' and return the full path to that file. If
806 'debug' true, look for a debugging version (if that makes sense on
807 the current platform). Return None if 'lib' wasn't found in any of
808 the specified directories.
Greg Wardc3a43b42000-06-24 18:10:48 +0000809 """
Greg Wardf7edea72000-05-20 13:31:32 +0000810 raise NotImplementedError
811
Greg Ward32c4a8a2000-03-06 03:40:29 +0000812 # -- Filename generation methods -----------------------------------
Greg Warde1aaaa61999-08-14 23:50:50 +0000813
Greg Ward32c4a8a2000-03-06 03:40:29 +0000814 # The default implementation of the filename generating methods are
815 # prejudiced towards the Unix/DOS/Windows view of the world:
816 # * object files are named by replacing the source file extension
817 # (eg. .c/.cpp -> .o/.obj)
818 # * library files (shared or static) are named by plugging the
819 # library name and extension into a format string, eg.
820 # "lib%s.%s" % (lib_name, ".a") for Unix static libraries
821 # * executables are named by appending an extension (possibly
822 # empty) to the program name: eg. progname + ".exe" for
823 # Windows
824 #
825 # To reduce redundant code, these methods expect to find
826 # several attributes in the current object (presumably defined
827 # as class attributes):
828 # * src_extensions -
829 # list of C/C++ source file extensions, eg. ['.c', '.cpp']
830 # * obj_extension -
831 # object file extension, eg. '.o' or '.obj'
832 # * static_lib_extension -
833 # extension for static library files, eg. '.a' or '.lib'
834 # * shared_lib_extension -
835 # extension for shared library/object files, eg. '.so', '.dll'
836 # * static_lib_format -
837 # format string for generating static library filenames,
838 # eg. 'lib%s.%s' or '%s.%s'
839 # * shared_lib_format
840 # format string for generating shared library filenames
841 # (probably same as static_lib_format, since the extension
842 # is one of the intended parameters to the format string)
843 # * exe_extension -
844 # extension for executable files, eg. '' or '.exe'
Greg Ward9b17cb51999-09-13 03:07:24 +0000845
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000846 def object_filenames(self, source_filenames, strip_dir=0, output_dir=''):
Guido van Rossumcc3a6df2002-10-01 04:14:17 +0000847 if output_dir is None:
848 output_dir = ''
Greg Ward32c4a8a2000-03-06 03:40:29 +0000849 obj_names = []
850 for src_name in source_filenames:
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000851 base, ext = os.path.splitext(src_name)
Andrew M. Kuchling10da45e2003-02-26 18:52:07 +0000852 base = os.path.splitdrive(base)[1] # Chop off the drive
853 base = base[os.path.isabs(base):] # If abs, chop off leading /
Greg Ward32c4a8a2000-03-06 03:40:29 +0000854 if ext not in self.src_extensions:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000855 raise UnknownFileError(
856 "unknown file type '%s' (from '%s')" % (ext, src_name))
Greg Ward32c4a8a2000-03-06 03:40:29 +0000857 if strip_dir:
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000858 base = os.path.basename(base)
859 obj_names.append(os.path.join(output_dir,
860 base + self.obj_extension))
Greg Ward32c4a8a2000-03-06 03:40:29 +0000861 return obj_names
Greg Warde1aaaa61999-08-14 23:50:50 +0000862
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000863 def shared_object_filename(self, basename, strip_dir=0, output_dir=''):
864 assert output_dir is not None
Greg Ward32c4a8a2000-03-06 03:40:29 +0000865 if strip_dir:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000866 basename = os.path.basename(basename)
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000867 return os.path.join(output_dir, basename + self.shared_lib_extension)
Greg Warde1aaaa61999-08-14 23:50:50 +0000868
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000869 def executable_filename(self, basename, strip_dir=0, output_dir=''):
870 assert output_dir is not None
Greg Ward42406482000-09-27 02:08:14 +0000871 if strip_dir:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000872 basename = os.path.basename(basename)
Greg Ward42406482000-09-27 02:08:14 +0000873 return os.path.join(output_dir, basename + (self.exe_extension or ''))
Greg Ward26e48ea1999-08-29 18:17:36 +0000874
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000875 def library_filename(self, libname, lib_type='static', # or 'shared'
876 strip_dir=0, output_dir=''):
877 assert output_dir is not None
878 if lib_type not in ("static", "shared", "dylib"):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000879 raise ValueError(
880 "'lib_type' must be \"static\", \"shared\" or \"dylib\"")
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000881 fmt = getattr(self, lib_type + "_lib_format")
882 ext = getattr(self, lib_type + "_lib_extension")
Greg Ward32c4a8a2000-03-06 03:40:29 +0000883
Collin Winter5b7e9d72007-08-30 03:52:21 +0000884 dir, base = os.path.split(libname)
Greg Ward32c4a8a2000-03-06 03:40:29 +0000885 filename = fmt % (base, ext)
886 if strip_dir:
887 dir = ''
888
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000889 return os.path.join(output_dir, dir, filename)
Greg Ward32c4a8a2000-03-06 03:40:29 +0000890
Greg Warde1aaaa61999-08-14 23:50:50 +0000891
892 # -- Utility methods -----------------------------------------------
893
Collin Winter5b7e9d72007-08-30 03:52:21 +0000894 def announce(self, msg, level=1):
Jeremy Hyltoncd8a1142002-06-04 20:14:43 +0000895 log.debug(msg)
Greg Ward9b17cb51999-09-13 03:07:24 +0000896
Collin Winter5b7e9d72007-08-30 03:52:21 +0000897 def debug_print(self, msg):
Jeremy Hyltonfcd73532002-09-11 16:31:53 +0000898 from distutils.debug import DEBUG
Greg Wardf813e592000-08-04 01:31:13 +0000899 if DEBUG:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000900 print(msg)
Greg Wardf813e592000-08-04 01:31:13 +0000901
Collin Winter5b7e9d72007-08-30 03:52:21 +0000902 def warn(self, msg):
903 sys.stderr.write("warning: %s\n" % msg)
Greg Ward3febd601999-10-03 20:41:02 +0000904
Collin Winter5b7e9d72007-08-30 03:52:21 +0000905 def execute(self, func, args, msg=None, level=1):
Jeremy Hyltoncd8a1142002-06-04 20:14:43 +0000906 execute(func, args, msg, self.dry_run)
Greg Ward9dddbb42000-08-02 01:38:20 +0000907
Collin Winter5b7e9d72007-08-30 03:52:21 +0000908 def spawn(self, cmd):
909 spawn(cmd, dry_run=self.dry_run)
Greg Warde1aaaa61999-08-14 23:50:50 +0000910
Collin Winter5b7e9d72007-08-30 03:52:21 +0000911 def move_file(self, src, dst):
912 return move_file(src, dst, dry_run=self.dry_run)
Greg Ward9b17cb51999-09-13 03:07:24 +0000913
Tarek Ziadé36797272010-07-22 12:50:05 +0000914 def mkpath (self, name, mode=0o777):
Benjamin Peterson6ebe78f2008-12-21 00:06:59 +0000915 mkpath(name, mode, dry_run=self.dry_run)
Greg Ward3f81cf71999-07-10 02:03:53 +0000916
917
Marc-André Lemburg636b9062001-02-19 09:20:04 +0000918# Map a sys.platform/os.name ('posix', 'nt') to the default compiler
919# type for that platform. Keys are interpreted as re match
920# patterns. Order is important; platform mappings are preferred over
921# OS names.
922_default_compilers = (
923
924 # Platform string mappings
Andrew M. Kuchlinga34dbe02001-02-27 19:13:15 +0000925
926 # on a cygwin built python we can use gcc like an ordinary UNIXish
927 # compiler
928 ('cygwin.*', 'unix'),
Marc-André Lemburg2544f512002-01-31 18:56:00 +0000929 ('os2emx', 'emx'),
Fred Drakeb94b8492001-12-06 20:51:35 +0000930
Marc-André Lemburg636b9062001-02-19 09:20:04 +0000931 # OS name mappings
932 ('posix', 'unix'),
933 ('nt', 'msvc'),
Fred Drakeb94b8492001-12-06 20:51:35 +0000934
Marc-André Lemburg636b9062001-02-19 09:20:04 +0000935 )
936
937def get_default_compiler(osname=None, platform=None):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000938 """Determine the default compiler to use for the given platform.
Marc-André Lemburg636b9062001-02-19 09:20:04 +0000939
Collin Winter5b7e9d72007-08-30 03:52:21 +0000940 osname should be one of the standard Python OS names (i.e. the
941 ones returned by os.name) and platform the common value
942 returned by sys.platform for the platform in question.
Marc-André Lemburg636b9062001-02-19 09:20:04 +0000943
Collin Winter5b7e9d72007-08-30 03:52:21 +0000944 The default values are os.name and sys.platform in case the
945 parameters are not given.
Marc-André Lemburg636b9062001-02-19 09:20:04 +0000946 """
947 if osname is None:
948 osname = os.name
949 if platform is None:
950 platform = sys.platform
951 for pattern, compiler in _default_compilers:
952 if re.match(pattern, platform) is not None or \
953 re.match(pattern, osname) is not None:
954 return compiler
955 # Default to Unix compiler
956 return 'unix'
Greg Ward802d6b71999-09-29 12:20:55 +0000957
958# Map compiler types to (module_name, class_name) pairs -- ie. where to
959# find the code that implements an interface to this compiler. (The module
960# is assumed to be in the 'distutils' package.)
Greg Ward2ff78872000-06-24 00:23:20 +0000961compiler_class = { 'unix': ('unixccompiler', 'UnixCCompiler',
962 "standard UNIX-style compiler"),
963 'msvc': ('msvccompiler', 'MSVCCompiler',
964 "Microsoft Visual C++"),
965 'cygwin': ('cygwinccompiler', 'CygwinCCompiler',
966 "Cygwin port of GNU C Compiler for Win32"),
967 'mingw32': ('cygwinccompiler', 'Mingw32CCompiler',
968 "Mingw32 port of GNU C Compiler for Win32"),
Greg Wardbfc79d62000-06-28 01:29:09 +0000969 'bcpp': ('bcppcompiler', 'BCPPCompiler',
970 "Borland C++ Compiler"),
Marc-André Lemburg2544f512002-01-31 18:56:00 +0000971 'emx': ('emxccompiler', 'EMXCCompiler',
972 "EMX port of GNU C Compiler for OS/2"),
Greg Ward802d6b71999-09-29 12:20:55 +0000973 }
974
Greg Ward9d17a7a2000-06-07 03:00:06 +0000975def show_compilers():
Greg Ward2ff78872000-06-24 00:23:20 +0000976 """Print list of available compilers (used by the "--help-compiler"
977 options to "build", "build_ext", "build_clib").
978 """
979 # XXX this "knows" that the compiler option it's describing is
980 # "--compiler", which just happens to be the case for the three
981 # commands that use it.
Fred Drakeb94b8492001-12-06 20:51:35 +0000982 from distutils.fancy_getopt import FancyGetopt
Greg Ward2ff78872000-06-24 00:23:20 +0000983 compilers = []
Greg Ward9d17a7a2000-06-07 03:00:06 +0000984 for compiler in compiler_class.keys():
Jeremy Hylton65d6edb2000-07-07 20:45:21 +0000985 compilers.append(("compiler="+compiler, None,
Greg Ward2ff78872000-06-24 00:23:20 +0000986 compiler_class[compiler][2]))
987 compilers.sort()
988 pretty_printer = FancyGetopt(compilers)
Greg Ward9d17a7a2000-06-07 03:00:06 +0000989 pretty_printer.print_help("List of available compilers:")
Fred Drakeb94b8492001-12-06 20:51:35 +0000990
Greg Ward802d6b71999-09-29 12:20:55 +0000991
Collin Winter5b7e9d72007-08-30 03:52:21 +0000992def new_compiler(plat=None, compiler=None, verbose=0, dry_run=0, force=0):
Greg Ward802d6b71999-09-29 12:20:55 +0000993 """Generate an instance of some CCompiler subclass for the supplied
Greg Wardc3a43b42000-06-24 18:10:48 +0000994 platform/compiler combination. 'plat' defaults to 'os.name'
995 (eg. 'posix', 'nt'), and 'compiler' defaults to the default compiler
996 for that platform. Currently only 'posix' and 'nt' are supported, and
997 the default compilers are "traditional Unix interface" (UnixCCompiler
998 class) and Visual C++ (MSVCCompiler class). Note that it's perfectly
999 possible to ask for a Unix compiler object under Windows, and a
1000 Microsoft compiler object under Unix -- if you supply a value for
1001 'compiler', 'plat' is ignored.
1002 """
Greg Ward802d6b71999-09-29 12:20:55 +00001003 if plat is None:
1004 plat = os.name
1005
1006 try:
1007 if compiler is None:
Marc-André Lemburg636b9062001-02-19 09:20:04 +00001008 compiler = get_default_compiler(plat)
Fred Drakeb94b8492001-12-06 20:51:35 +00001009
Greg Ward2ff78872000-06-24 00:23:20 +00001010 (module_name, class_name, long_description) = compiler_class[compiler]
Greg Ward802d6b71999-09-29 12:20:55 +00001011 except KeyError:
1012 msg = "don't know how to compile C/C++ code on platform '%s'" % plat
1013 if compiler is not None:
1014 msg = msg + " with '%s' compiler" % compiler
Collin Winter5b7e9d72007-08-30 03:52:21 +00001015 raise DistutilsPlatformError(msg)
Fred Drakeb94b8492001-12-06 20:51:35 +00001016
Greg Ward802d6b71999-09-29 12:20:55 +00001017 try:
1018 module_name = "distutils." + module_name
1019 __import__ (module_name)
1020 module = sys.modules[module_name]
1021 klass = vars(module)[class_name]
1022 except ImportError:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001023 raise DistutilsModuleError(
Greg Ward802d6b71999-09-29 12:20:55 +00001024 "can't compile C/C++ code: unable to load module '%s'" % \
Collin Winter5b7e9d72007-08-30 03:52:21 +00001025 module_name)
Greg Ward802d6b71999-09-29 12:20:55 +00001026 except KeyError:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001027 raise DistutilsModuleError(
1028 "can't compile C/C++ code: unable to find class '%s' "
1029 "in module '%s'" % (class_name, module_name))
Greg Ward802d6b71999-09-29 12:20:55 +00001030
Jeremy Hyltoncd8a1142002-06-04 20:14:43 +00001031 # XXX The None is necessary to preserve backwards compatibility
1032 # with classes that expect verbose to be the first positional
1033 # argument.
Collin Winter5b7e9d72007-08-30 03:52:21 +00001034 return klass(None, dry_run, force)
Greg Wardf7a39ec1999-09-08 02:29:08 +00001035
1036
Collin Winter5b7e9d72007-08-30 03:52:21 +00001037def gen_preprocess_options(macros, include_dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +00001038 """Generate C pre-processor options (-D, -U, -I) as used by at least
1039 two types of compilers: the typical Unix compiler and Visual C++.
1040 'macros' is the usual thing, a list of 1- or 2-tuples, where (name,)
1041 means undefine (-U) macro 'name', and (name,value) means define (-D)
1042 macro 'name' to 'value'. 'include_dirs' is just a list of directory
1043 names to be added to the header file search path (-I). Returns a list
1044 of command-line options suitable for either Unix compilers or Visual
1045 C++.
1046 """
Greg Wardf7a39ec1999-09-08 02:29:08 +00001047 # XXX it would be nice (mainly aesthetic, and so we don't generate
1048 # stupid-looking command lines) to go over 'macros' and eliminate
1049 # redundant definitions/undefinitions (ie. ensure that only the
1050 # latest mention of a particular macro winds up on the command
1051 # line). I don't think it's essential, though, since most (all?)
1052 # Unix C compilers only pay attention to the latest -D or -U
1053 # mention of a macro on their command line. Similar situation for
Greg Ward0bdd90a1999-12-12 17:19:58 +00001054 # 'include_dirs'. I'm punting on both for now. Anyways, weeding out
Greg Wardf7a39ec1999-09-08 02:29:08 +00001055 # redundancies like this should probably be the province of
1056 # CCompiler, since the data structures used are inherited from it
1057 # and therefore common to all CCompiler classes.
Greg Wardf7a39ec1999-09-08 02:29:08 +00001058 pp_opts = []
1059 for macro in macros:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001060 if not (isinstance(macro, tuple) and 1 <= len(macro) <= 2):
1061 raise TypeError(
1062 "bad macro definition '%s': "
1063 "each element of 'macros' list must be a 1- or 2-tuple"
1064 % macro)
Greg Wardfbf8aff1999-09-21 18:35:09 +00001065
Collin Winter5b7e9d72007-08-30 03:52:21 +00001066 if len(macro) == 1: # undefine this macro
1067 pp_opts.append("-U%s" % macro[0])
1068 elif len(macro) == 2:
Greg Wardf7a39ec1999-09-08 02:29:08 +00001069 if macro[1] is None: # define with no explicit value
Collin Winter5b7e9d72007-08-30 03:52:21 +00001070 pp_opts.append("-D%s" % macro[0])
Greg Wardf7a39ec1999-09-08 02:29:08 +00001071 else:
1072 # XXX *don't* need to be clever about quoting the
1073 # macro value here, because we're going to avoid the
1074 # shell at all costs when we spawn the command!
Collin Winter5b7e9d72007-08-30 03:52:21 +00001075 pp_opts.append("-D%s=%s" % macro)
Greg Wardf7a39ec1999-09-08 02:29:08 +00001076
Greg Ward0bdd90a1999-12-12 17:19:58 +00001077 for dir in include_dirs:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001078 pp_opts.append("-I%s" % dir)
Greg Wardf7a39ec1999-09-08 02:29:08 +00001079 return pp_opts
1080
Greg Wardf7a39ec1999-09-08 02:29:08 +00001081
Tarek Ziadé36797272010-07-22 12:50:05 +00001082def gen_lib_options (compiler, library_dirs, runtime_library_dirs, libraries):
Greg Wardf7a39ec1999-09-08 02:29:08 +00001083 """Generate linker options for searching library directories and
Tarek Ziadé36797272010-07-22 12:50:05 +00001084 linking with specific libraries. 'libraries' and 'library_dirs' are,
1085 respectively, lists of library names (not filenames!) and search
1086 directories. Returns a list of command-line options suitable for use
1087 with some compiler (depending on the two format strings passed in).
Greg Wardc3a43b42000-06-24 18:10:48 +00001088 """
Greg Wardf7a39ec1999-09-08 02:29:08 +00001089 lib_opts = []
1090
1091 for dir in library_dirs:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001092 lib_opts.append(compiler.library_dir_option(dir))
Greg Wardf7a39ec1999-09-08 02:29:08 +00001093
Greg Wardd03f88a2000-03-18 15:19:51 +00001094 for dir in runtime_library_dirs:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001095 opt = compiler.runtime_library_dir_option(dir)
1096 if isinstance(opt, list):
Tarek Ziadé36797272010-07-22 12:50:05 +00001097 lib_opts = lib_opts + opt
Martin v. Löwis061f1322004-08-29 16:40:55 +00001098 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001099 lib_opts.append(opt)
Greg Wardd03f88a2000-03-18 15:19:51 +00001100
Greg Wardf7a39ec1999-09-08 02:29:08 +00001101 # XXX it's important that we *not* remove redundant library mentions!
1102 # sometimes you really do have to say "-lfoo -lbar -lfoo" in order to
1103 # resolve all symbols. I just hope we never have to say "-lfoo obj.o
1104 # -lbar" to get things to work -- that's certainly a possibility, but a
1105 # pretty nasty way to arrange your C code.
1106
1107 for lib in libraries:
Tarek Ziadé36797272010-07-22 12:50:05 +00001108 (lib_dir, lib_name) = os.path.split(lib)
1109 if lib_dir:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001110 lib_file = compiler.find_library_file([lib_dir], lib_name)
Tarek Ziadé36797272010-07-22 12:50:05 +00001111 if lib_file:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001112 lib_opts.append(lib_file)
Greg Ward3febd601999-10-03 20:41:02 +00001113 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001114 compiler.warn("no library file corresponding to "
1115 "'%s' found (skipping)" % lib)
Greg Ward3febd601999-10-03 20:41:02 +00001116 else:
Tarek Ziadé36797272010-07-22 12:50:05 +00001117 lib_opts.append(compiler.library_option (lib))
Greg Wardf7a39ec1999-09-08 02:29:08 +00001118 return lib_opts