blob: 1a4e8fb2af4953ac9171fa76b37a71629d079b5b [file] [log] [blame]
Greg Ward3f81cf71999-07-10 02:03:53 +00001"""distutils.ccompiler
2
3Contains CCompiler, an abstract base class that defines the interface
4for the Distutils compiler abstraction model."""
5
Greg Ward3ce77fd2000-03-02 01:49:45 +00006__revision__ = "$Id$"
Greg Ward3f81cf71999-07-10 02:03:53 +00007
Tarek Ziadé88e2c5d2009-12-21 01:49:00 +00008import sys
9import os
10import re
11
Tarek Ziadéa278be32010-01-11 23:47:51 +000012from distutils.errors import (CompileError, LinkError, UnknownFileError,
13 DistutilsPlatformError, DistutilsModuleError)
Greg Warde1aaaa61999-08-14 23:50:50 +000014from distutils.spawn import spawn
Greg Warde5c62bf2000-06-25 02:08:18 +000015from distutils.file_util import move_file
16from distutils.dir_util import mkpath
Tarek Ziadéa278be32010-01-11 23:47:51 +000017from distutils.dep_util import newer_group
Greg Ward9dddbb42000-08-02 01:38:20 +000018from distutils.util import split_quoted, execute
Jeremy Hyltoncd8a1142002-06-04 20:14:43 +000019from distutils import log
Greg Ward3f81cf71999-07-10 02:03:53 +000020
Tarek Ziadéedacea32010-01-29 11:41:03 +000021_sysconfig = __import__('sysconfig')
22
23def customize_compiler(compiler):
24 """Do any platform-specific customization of a CCompiler instance.
25
26 Mainly needed on Unix, so we can plug in the information that
27 varies across Unices and is stored in Python's Makefile.
28 """
29 if compiler.compiler_type == "unix":
30 (cc, cxx, opt, cflags, ccshared, ldshared, so_ext, ar, ar_flags) = \
31 _sysconfig.get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS',
32 'CCSHARED', 'LDSHARED', 'SO', 'AR',
33 'ARFLAGS')
34
35 if 'CC' in os.environ:
36 cc = os.environ['CC']
37 if 'CXX' in os.environ:
38 cxx = os.environ['CXX']
39 if 'LDSHARED' in os.environ:
40 ldshared = os.environ['LDSHARED']
41 if 'CPP' in os.environ:
42 cpp = os.environ['CPP']
43 else:
44 cpp = cc + " -E" # not always
45 if 'LDFLAGS' in os.environ:
46 ldshared = ldshared + ' ' + os.environ['LDFLAGS']
47 if 'CFLAGS' in os.environ:
48 cflags = opt + ' ' + os.environ['CFLAGS']
49 ldshared = ldshared + ' ' + os.environ['CFLAGS']
50 if 'CPPFLAGS' in os.environ:
51 cpp = cpp + ' ' + os.environ['CPPFLAGS']
52 cflags = cflags + ' ' + os.environ['CPPFLAGS']
53 ldshared = ldshared + ' ' + os.environ['CPPFLAGS']
54 if 'AR' in os.environ:
55 ar = os.environ['AR']
56 if 'ARFLAGS' in os.environ:
57 archiver = ar + ' ' + os.environ['ARFLAGS']
58 else:
59 archiver = ar + ' ' + ar_flags
60
61 cc_cmd = cc + ' ' + cflags
62 compiler.set_executables(
63 preprocessor=cpp,
64 compiler=cc_cmd,
65 compiler_so=cc_cmd + ' ' + ccshared,
66 compiler_cxx=cxx,
67 linker_so=ldshared,
68 linker_exe=cc,
69 archiver=archiver)
70
71 compiler.shared_lib_extension = so_ext
72
Greg Ward3f81cf71999-07-10 02:03:53 +000073class CCompiler:
74 """Abstract base class to define the interface that must be implemented
Greg Wardc3a43b42000-06-24 18:10:48 +000075 by real compiler classes. Also has some utility methods used by
76 several compiler classes.
Greg Ward3f81cf71999-07-10 02:03:53 +000077
Greg Wardc3a43b42000-06-24 18:10:48 +000078 The basic idea behind a compiler abstraction class is that each
79 instance can be used for all the compile/link steps in building a
80 single project. Thus, attributes common to all of those compile and
81 link steps -- include directories, macros to define, libraries to link
82 against, etc. -- are attributes of the compiler instance. To allow for
83 variability in how individual files are treated, most of those
84 attributes may be varied on a per-compilation or per-link basis.
85 """
Greg Ward3f81cf71999-07-10 02:03:53 +000086
Greg Ward802d6b71999-09-29 12:20:55 +000087 # 'compiler_type' is a class attribute that identifies this class. It
88 # keeps code that wants to know what kind of compiler it's dealing with
89 # from having to import all possible compiler classes just to do an
90 # 'isinstance'. In concrete CCompiler subclasses, 'compiler_type'
91 # should really, really be one of the keys of the 'compiler_class'
92 # dictionary (see below -- used by the 'new_compiler()' factory
93 # function) -- authors of new compiler interface classes are
94 # responsible for updating 'compiler_class'!
95 compiler_type = None
Greg Ward3f81cf71999-07-10 02:03:53 +000096
97 # XXX things not handled by this compiler abstraction model:
98 # * client can't provide additional options for a compiler,
99 # e.g. warning, optimization, debugging flags. Perhaps this
100 # should be the domain of concrete compiler abstraction classes
101 # (UnixCCompiler, MSVCCompiler, etc.) -- or perhaps the base
102 # class should have methods for the common ones.
Greg Ward3f81cf71999-07-10 02:03:53 +0000103 # * can't completely override the include or library searchg
104 # path, ie. no "cc -I -Idir1 -Idir2" or "cc -L -Ldir1 -Ldir2".
Greg Warde1aaaa61999-08-14 23:50:50 +0000105 # I'm not sure how widely supported this is even by Unix
Greg Ward3f81cf71999-07-10 02:03:53 +0000106 # compilers, much less on other platforms. And I'm even less
Greg Warde1aaaa61999-08-14 23:50:50 +0000107 # sure how useful it is; maybe for cross-compiling, but
108 # support for that is a ways off. (And anyways, cross
109 # compilers probably have a dedicated binary with the
110 # right paths compiled in. I hope.)
Greg Ward3f81cf71999-07-10 02:03:53 +0000111 # * can't do really freaky things with the library list/library
112 # dirs, e.g. "-Ldir1 -lfoo -Ldir2 -lfoo" to link against
113 # different versions of libfoo.a in different locations. I
114 # think this is useless without the ability to null out the
115 # library search path anyways.
Fred Drakeb94b8492001-12-06 20:51:35 +0000116
Greg Ward3f81cf71999-07-10 02:03:53 +0000117
Greg Ward32c4a8a2000-03-06 03:40:29 +0000118 # Subclasses that rely on the standard filename generation methods
119 # implemented below should override these; see the comment near
120 # those methods ('object_filenames()' et. al.) for details:
121 src_extensions = None # list of strings
122 obj_extension = None # string
123 static_lib_extension = None
124 shared_lib_extension = None # string
125 static_lib_format = None # format string
126 shared_lib_format = None # prob. same as static_lib_format
127 exe_extension = None # string
128
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000129 # Default language settings. language_map is used to detect a source
130 # file or Extension target language, checking source filenames.
131 # language_order is used to detect the language precedence, when deciding
132 # what language to use when mixing source types. For example, if some
133 # extension has two files with ".c" extension, and one with ".cpp", it
134 # is still linked as c++.
135 language_map = {".c" : "c",
136 ".cc" : "c++",
137 ".cpp" : "c++",
138 ".cxx" : "c++",
139 ".m" : "objc",
140 }
141 language_order = ["c++", "objc", "c"]
Greg Ward32c4a8a2000-03-06 03:40:29 +0000142
Collin Winter5b7e9d72007-08-30 03:52:21 +0000143 def __init__(self, verbose=0, dry_run=0, force=0):
Greg Warde1aaaa61999-08-14 23:50:50 +0000144 self.dry_run = dry_run
Greg Ward3febd601999-10-03 20:41:02 +0000145 self.force = force
Skip Montanaro70e1d9b2002-10-01 17:39:59 +0000146 self.verbose = verbose
Greg Ward3f81cf71999-07-10 02:03:53 +0000147
Greg Ward9b17cb51999-09-13 03:07:24 +0000148 # 'output_dir': a common output directory for object, library,
149 # shared object, and shared library files
150 self.output_dir = None
151
Greg Ward3f81cf71999-07-10 02:03:53 +0000152 # 'macros': a list of macro definitions (or undefinitions). A
153 # macro definition is a 2-tuple (name, value), where the value is
154 # either a string or None (no explicit value). A macro
155 # undefinition is a 1-tuple (name,).
156 self.macros = []
157
Greg Ward3f81cf71999-07-10 02:03:53 +0000158 # 'include_dirs': a list of directories to search for include files
159 self.include_dirs = []
160
161 # 'libraries': a list of libraries to include in any link
162 # (library names, not filenames: eg. "foo" not "libfoo.a")
163 self.libraries = []
164
165 # 'library_dirs': a list of directories to search for libraries
166 self.library_dirs = []
167
Greg Warde1aaaa61999-08-14 23:50:50 +0000168 # 'runtime_library_dirs': a list of directories to search for
169 # shared libraries/objects at runtime
170 self.runtime_library_dirs = []
171
Greg Ward3f81cf71999-07-10 02:03:53 +0000172 # 'objects': a list of object files (or similar, such as explicitly
173 # named library files) to include on any link
174 self.objects = []
175
Greg Warde5c62bf2000-06-25 02:08:18 +0000176 for key in self.executables.keys():
177 self.set_executable(key, self.executables[key])
178
Collin Winter5b7e9d72007-08-30 03:52:21 +0000179 def set_executables(self, **kwargs):
Greg Warde5c62bf2000-06-25 02:08:18 +0000180 """Define the executables (and options for them) that will be run
181 to perform the various stages of compilation. The exact set of
182 executables that may be specified here depends on the compiler
183 class (via the 'executables' class attribute), but most will have:
184 compiler the C/C++ compiler
185 linker_so linker used to create shared objects and libraries
186 linker_exe linker used to create binary executables
187 archiver static library creator
188
189 On platforms with a command-line (Unix, DOS/Windows), each of these
190 is a string that will be split into executable name and (optional)
191 list of arguments. (Splitting the string is done similarly to how
192 Unix shells operate: words are delimited by spaces, but quotes and
193 backslashes can override this. See
194 'distutils.util.split_quoted()'.)
195 """
196
197 # Note that some CCompiler implementation classes will define class
198 # attributes 'cpp', 'cc', etc. with hard-coded executable names;
199 # this is appropriate when a compiler class is for exactly one
200 # compiler/OS combination (eg. MSVCCompiler). Other compiler
201 # classes (UnixCCompiler, in particular) are driven by information
202 # discovered at run-time, since there are many different ways to do
203 # basically the same things with Unix C compilers.
204
Christian Heimesc3f30c42008-02-22 16:37:40 +0000205 for key in kwargs:
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000206 if key not in self.executables:
Christian Heimesc3f30c42008-02-22 16:37:40 +0000207 raise ValueError("unknown executable '%s' for class %s" %
Collin Winter5b7e9d72007-08-30 03:52:21 +0000208 (key, self.__class__.__name__))
Christian Heimesc3f30c42008-02-22 16:37:40 +0000209 self.set_executable(key, kwargs[key])
Greg Warde5c62bf2000-06-25 02:08:18 +0000210
211 def set_executable(self, key, value):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000212 if isinstance(value, str):
Greg Warde5c62bf2000-06-25 02:08:18 +0000213 setattr(self, key, split_quoted(value))
214 else:
215 setattr(self, key, value)
Fred Drakeb94b8492001-12-06 20:51:35 +0000216
Collin Winter5b7e9d72007-08-30 03:52:21 +0000217 def _find_macro(self, name):
Greg Ward3f81cf71999-07-10 02:03:53 +0000218 i = 0
219 for defn in self.macros:
220 if defn[0] == name:
221 return i
Collin Winter5b7e9d72007-08-30 03:52:21 +0000222 i += 1
Greg Ward3f81cf71999-07-10 02:03:53 +0000223 return None
224
Collin Winter5b7e9d72007-08-30 03:52:21 +0000225 def _check_macro_definitions(self, definitions):
Greg Ward3f81cf71999-07-10 02:03:53 +0000226 """Ensures that every element of 'definitions' is a valid macro
Greg Wardc3a43b42000-06-24 18:10:48 +0000227 definition, ie. either (name,value) 2-tuple or a (name,) tuple. Do
228 nothing if all definitions are OK, raise TypeError otherwise.
229 """
Greg Ward3f81cf71999-07-10 02:03:53 +0000230 for defn in definitions:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000231 if not (isinstance(defn, tuple) and
232 (len(defn) in (1, 2) and
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000233 (isinstance (defn[1], str) or defn[1] is None)) and
234 isinstance (defn[0], str)):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000235 raise TypeError(("invalid macro definition '%s': " % defn) + \
Greg Ward3f81cf71999-07-10 02:03:53 +0000236 "must be tuple (string,), (string, string), or " + \
Collin Winter5b7e9d72007-08-30 03:52:21 +0000237 "(string, None)")
Greg Ward3f81cf71999-07-10 02:03:53 +0000238
239
240 # -- Bookkeeping methods -------------------------------------------
241
Collin Winter5b7e9d72007-08-30 03:52:21 +0000242 def define_macro(self, name, value=None):
Greg Wardc3a43b42000-06-24 18:10:48 +0000243 """Define a preprocessor macro for all compilations driven by this
244 compiler object. The optional parameter 'value' should be a
245 string; if it is not supplied, then the macro will be defined
246 without an explicit value and the exact outcome depends on the
247 compiler used (XXX true? does ANSI say anything about this?)
248 """
Greg Ward3f81cf71999-07-10 02:03:53 +0000249 # Delete from the list of macro definitions/undefinitions if
250 # already there (so that this one will take precedence).
251 i = self._find_macro (name)
252 if i is not None:
253 del self.macros[i]
254
Collin Winter5b7e9d72007-08-30 03:52:21 +0000255 self.macros.append((name, value))
Greg Ward3f81cf71999-07-10 02:03:53 +0000256
Collin Winter5b7e9d72007-08-30 03:52:21 +0000257 def undefine_macro(self, name):
Greg Ward3f81cf71999-07-10 02:03:53 +0000258 """Undefine a preprocessor macro for all compilations driven by
Greg Wardc3a43b42000-06-24 18:10:48 +0000259 this compiler object. If the same macro is defined by
260 'define_macro()' and undefined by 'undefine_macro()' the last call
261 takes precedence (including multiple redefinitions or
262 undefinitions). If the macro is redefined/undefined on a
263 per-compilation basis (ie. in the call to 'compile()'), then that
264 takes precedence.
265 """
Greg Ward3f81cf71999-07-10 02:03:53 +0000266 # Delete from the list of macro definitions/undefinitions if
267 # already there (so that this one will take precedence).
268 i = self._find_macro (name)
269 if i is not None:
270 del self.macros[i]
271
272 undefn = (name,)
Collin Winter5b7e9d72007-08-30 03:52:21 +0000273 self.macros.append(undefn)
Greg Ward3f81cf71999-07-10 02:03:53 +0000274
Collin Winter5b7e9d72007-08-30 03:52:21 +0000275 def add_include_dir(self, dir):
Greg Wardc3a43b42000-06-24 18:10:48 +0000276 """Add 'dir' to the list of directories that will be searched for
277 header files. The compiler is instructed to search directories in
278 the order in which they are supplied by successive calls to
279 'add_include_dir()'.
280 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000281 self.include_dirs.append(dir)
Greg Ward3f81cf71999-07-10 02:03:53 +0000282
Collin Winter5b7e9d72007-08-30 03:52:21 +0000283 def set_include_dirs(self, dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +0000284 """Set the list of directories that will be searched to 'dirs' (a
285 list of strings). Overrides any preceding calls to
286 'add_include_dir()'; subsequence calls to 'add_include_dir()' add
287 to the list passed to 'set_include_dirs()'. This does not affect
288 any list of standard include directories that the compiler may
289 search by default.
290 """
Antoine Pitrou56a00de2009-05-15 17:34:21 +0000291 self.include_dirs = dirs[:]
Greg Ward3f81cf71999-07-10 02:03:53 +0000292
Collin Winter5b7e9d72007-08-30 03:52:21 +0000293 def add_library(self, libname):
Greg Wardc3a43b42000-06-24 18:10:48 +0000294 """Add 'libname' to the list of libraries that will be included in
295 all links driven by this compiler object. Note that 'libname'
296 should *not* be the name of a file containing a library, but the
297 name of the library itself: the actual filename will be inferred by
298 the linker, the compiler, or the compiler class (depending on the
299 platform).
Greg Ward3f81cf71999-07-10 02:03:53 +0000300
Greg Wardc3a43b42000-06-24 18:10:48 +0000301 The linker will be instructed to link against libraries in the
302 order they were supplied to 'add_library()' and/or
303 'set_libraries()'. It is perfectly valid to duplicate library
304 names; the linker will be instructed to link against libraries as
305 many times as they are mentioned.
306 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000307 self.libraries.append(libname)
Greg Ward3f81cf71999-07-10 02:03:53 +0000308
Collin Winter5b7e9d72007-08-30 03:52:21 +0000309 def set_libraries(self, libnames):
Greg Wardc3a43b42000-06-24 18:10:48 +0000310 """Set the list of libraries to be included in all links driven by
311 this compiler object to 'libnames' (a list of strings). This does
312 not affect any standard system libraries that the linker may
313 include by default.
314 """
Antoine Pitrou56a00de2009-05-15 17:34:21 +0000315 self.libraries = libnames[:]
Greg Ward3f81cf71999-07-10 02:03:53 +0000316
Collin Winter5b7e9d72007-08-30 03:52:21 +0000317 def add_library_dir(self, dir):
Greg Ward3f81cf71999-07-10 02:03:53 +0000318 """Add 'dir' to the list of directories that will be searched for
Greg Wardc3a43b42000-06-24 18:10:48 +0000319 libraries specified to 'add_library()' and 'set_libraries()'. The
320 linker will be instructed to search for libraries in the order they
321 are supplied to 'add_library_dir()' and/or 'set_library_dirs()'.
322 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000323 self.library_dirs.append(dir)
Greg Ward3f81cf71999-07-10 02:03:53 +0000324
Collin Winter5b7e9d72007-08-30 03:52:21 +0000325 def set_library_dirs(self, dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +0000326 """Set the list of library search directories to 'dirs' (a list of
327 strings). This does not affect any standard library search path
328 that the linker may search by default.
329 """
Antoine Pitrou56a00de2009-05-15 17:34:21 +0000330 self.library_dirs = dirs[:]
Greg Ward3f81cf71999-07-10 02:03:53 +0000331
Collin Winter5b7e9d72007-08-30 03:52:21 +0000332 def add_runtime_library_dir(self, dir):
Greg Warde1aaaa61999-08-14 23:50:50 +0000333 """Add 'dir' to the list of directories that will be searched for
Greg Wardc3a43b42000-06-24 18:10:48 +0000334 shared libraries at runtime.
335 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000336 self.runtime_library_dirs.append(dir)
Greg Warde1aaaa61999-08-14 23:50:50 +0000337
Collin Winter5b7e9d72007-08-30 03:52:21 +0000338 def set_runtime_library_dirs(self, dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +0000339 """Set the list of directories to search for shared libraries at
340 runtime to 'dirs' (a list of strings). This does not affect any
341 standard search path that the runtime linker may search by
342 default.
343 """
Antoine Pitrou56a00de2009-05-15 17:34:21 +0000344 self.runtime_library_dirs = dirs[:]
Greg Warde1aaaa61999-08-14 23:50:50 +0000345
Collin Winter5b7e9d72007-08-30 03:52:21 +0000346 def add_link_object(self, object):
Greg Wardc3a43b42000-06-24 18:10:48 +0000347 """Add 'object' to the list of object files (or analogues, such as
Greg Ward612eb9f2000-07-27 02:13:20 +0000348 explicitly named library files or the output of "resource
Greg Wardc3a43b42000-06-24 18:10:48 +0000349 compilers") to be included in every link driven by this compiler
350 object.
351 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000352 self.objects.append(object)
Greg Ward3f81cf71999-07-10 02:03:53 +0000353
Collin Winter5b7e9d72007-08-30 03:52:21 +0000354 def set_link_objects(self, objects):
Greg Wardc3a43b42000-06-24 18:10:48 +0000355 """Set the list of object files (or analogues) to be included in
356 every link to 'objects'. This does not affect any standard object
357 files that the linker may include by default (such as system
358 libraries).
359 """
Antoine Pitrou56a00de2009-05-15 17:34:21 +0000360 self.objects = objects[:]
Greg Ward3f81cf71999-07-10 02:03:53 +0000361
362
Thomas Hellere6500802002-04-25 17:03:30 +0000363 # -- Private utility methods --------------------------------------
Greg Ward32c4a8a2000-03-06 03:40:29 +0000364 # (here for the convenience of subclasses)
365
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000366 # Helper method to prep compiler in subclass compile() methods
367
368 def _setup_compile(self, outdir, macros, incdirs, sources, depends,
369 extra):
Tarek Ziadéac4e6ea2010-01-11 23:15:52 +0000370 """Process arguments and decide which source files to compile."""
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000371 if outdir is None:
372 outdir = self.output_dir
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000373 elif not isinstance(outdir, str):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000374 raise TypeError("'output_dir' must be a string or None")
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000375
376 if macros is None:
377 macros = self.macros
Collin Winter5b7e9d72007-08-30 03:52:21 +0000378 elif isinstance(macros, list):
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000379 macros = macros + (self.macros or [])
380 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000381 raise TypeError("'macros' (if supplied) must be a list of tuples")
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000382
383 if incdirs is None:
384 incdirs = self.include_dirs
Collin Winter5b7e9d72007-08-30 03:52:21 +0000385 elif isinstance(incdirs, (list, tuple)):
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000386 incdirs = list(incdirs) + (self.include_dirs or [])
387 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000388 raise TypeError(
389 "'include_dirs' (if supplied) must be a list of strings")
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000390
391 if extra is None:
392 extra = []
393
394 # Get the list of expected output (object) files
Collin Winter5b7e9d72007-08-30 03:52:21 +0000395 objects = self.object_filenames(sources, strip_dir=0,
Andrew M. Kuchling8c6e0ec2002-12-29 17:00:57 +0000396 output_dir=outdir)
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000397 assert len(objects) == len(sources)
398
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000399 pp_opts = gen_preprocess_options(macros, incdirs)
400
401 build = {}
402 for i in range(len(sources)):
403 src = sources[i]
404 obj = objects[i]
405 ext = os.path.splitext(src)[1]
406 self.mkpath(os.path.dirname(obj))
Tarek Ziadéac4e6ea2010-01-11 23:15:52 +0000407 build[obj] = (src, ext)
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000408
409 return macros, objects, extra, pp_opts, build
410
411 def _get_cc_args(self, pp_opts, debug, before):
412 # works for unixccompiler, emxccompiler, cygwinccompiler
413 cc_args = pp_opts + ['-c']
414 if debug:
415 cc_args[:0] = ['-g']
416 if before:
417 cc_args[:0] = before
418 return cc_args
419
Collin Winter5b7e9d72007-08-30 03:52:21 +0000420 def _fix_compile_args(self, output_dir, macros, include_dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +0000421 """Typecheck and fix-up some of the arguments to the 'compile()'
422 method, and return fixed-up values. Specifically: if 'output_dir'
423 is None, replaces it with 'self.output_dir'; ensures that 'macros'
424 is a list, and augments it with 'self.macros'; ensures that
425 'include_dirs' is a list, and augments it with 'self.include_dirs'.
426 Guarantees that the returned values are of the correct type,
427 i.e. for 'output_dir' either string or None, and for 'macros' and
428 'include_dirs' either list or None.
429 """
Greg Ward32c4a8a2000-03-06 03:40:29 +0000430 if output_dir is None:
431 output_dir = self.output_dir
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000432 elif not isinstance(output_dir, str):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000433 raise TypeError("'output_dir' must be a string or None")
Greg Ward32c4a8a2000-03-06 03:40:29 +0000434
435 if macros is None:
436 macros = self.macros
Collin Winter5b7e9d72007-08-30 03:52:21 +0000437 elif isinstance(macros, list):
Greg Ward32c4a8a2000-03-06 03:40:29 +0000438 macros = macros + (self.macros or [])
439 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000440 raise TypeError("'macros' (if supplied) must be a list of tuples")
Greg Ward32c4a8a2000-03-06 03:40:29 +0000441
442 if include_dirs is None:
443 include_dirs = self.include_dirs
Collin Winter5b7e9d72007-08-30 03:52:21 +0000444 elif isinstance(include_dirs, (list, tuple)):
445 include_dirs = list(include_dirs) + (self.include_dirs or [])
Greg Ward32c4a8a2000-03-06 03:40:29 +0000446 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000447 raise TypeError(
448 "'include_dirs' (if supplied) must be a list of strings")
Fred Drakeb94b8492001-12-06 20:51:35 +0000449
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000450 return output_dir, macros, include_dirs
Greg Ward32c4a8a2000-03-06 03:40:29 +0000451
Collin Winter5b7e9d72007-08-30 03:52:21 +0000452 def _fix_object_args(self, objects, output_dir):
Greg Wardc3a43b42000-06-24 18:10:48 +0000453 """Typecheck and fix up some arguments supplied to various methods.
454 Specifically: ensure that 'objects' is a list; if output_dir is
455 None, replace with self.output_dir. Return fixed versions of
456 'objects' and 'output_dir'.
457 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000458 if not isinstance(objects, (list, tuple)):
459 raise TypeError("'objects' must be a list or tuple of strings")
460 objects = list(objects)
Fred Drakeb94b8492001-12-06 20:51:35 +0000461
Greg Ward32c4a8a2000-03-06 03:40:29 +0000462 if output_dir is None:
463 output_dir = self.output_dir
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000464 elif not isinstance(output_dir, str):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000465 raise TypeError("'output_dir' must be a string or None")
Greg Ward32c4a8a2000-03-06 03:40:29 +0000466
Greg Wardf10f95d2000-03-26 21:37:09 +0000467 return (objects, output_dir)
Greg Ward32c4a8a2000-03-06 03:40:29 +0000468
Collin Winter5b7e9d72007-08-30 03:52:21 +0000469 def _fix_lib_args(self, libraries, library_dirs, runtime_library_dirs):
Greg Wardf10f95d2000-03-26 21:37:09 +0000470 """Typecheck and fix up some of the arguments supplied to the
Greg Wardc3a43b42000-06-24 18:10:48 +0000471 'link_*' methods. Specifically: ensure that all arguments are
472 lists, and augment them with their permanent versions
473 (eg. 'self.libraries' augments 'libraries'). Return a tuple with
474 fixed versions of all arguments.
475 """
Greg Wardf10f95d2000-03-26 21:37:09 +0000476 if libraries is None:
477 libraries = self.libraries
Collin Winter5b7e9d72007-08-30 03:52:21 +0000478 elif isinstance(libraries, (list, tuple)):
Greg Wardf10f95d2000-03-26 21:37:09 +0000479 libraries = list (libraries) + (self.libraries or [])
Greg Ward32c4a8a2000-03-06 03:40:29 +0000480 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000481 raise TypeError(
482 "'libraries' (if supplied) must be a list of strings")
Greg Ward32c4a8a2000-03-06 03:40:29 +0000483
Greg Wardf10f95d2000-03-26 21:37:09 +0000484 if library_dirs is None:
485 library_dirs = self.library_dirs
Collin Winter5b7e9d72007-08-30 03:52:21 +0000486 elif isinstance(library_dirs, (list, tuple)):
Greg Wardf10f95d2000-03-26 21:37:09 +0000487 library_dirs = list (library_dirs) + (self.library_dirs or [])
488 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000489 raise TypeError(
490 "'library_dirs' (if supplied) must be a list of strings")
Greg Wardf10f95d2000-03-26 21:37:09 +0000491
492 if runtime_library_dirs is None:
493 runtime_library_dirs = self.runtime_library_dirs
Collin Winter5b7e9d72007-08-30 03:52:21 +0000494 elif isinstance(runtime_library_dirs, (list, tuple)):
495 runtime_library_dirs = (list(runtime_library_dirs) +
Greg Wardf10f95d2000-03-26 21:37:09 +0000496 (self.runtime_library_dirs or []))
497 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000498 raise TypeError("'runtime_library_dirs' (if supplied) "
499 "must be a list of strings")
Greg Wardf10f95d2000-03-26 21:37:09 +0000500
501 return (libraries, library_dirs, runtime_library_dirs)
502
Collin Winter5b7e9d72007-08-30 03:52:21 +0000503 def _need_link(self, objects, output_file):
Greg Wardc3a43b42000-06-24 18:10:48 +0000504 """Return true if we need to relink the files listed in 'objects'
505 to recreate 'output_file'.
506 """
Greg Ward32c4a8a2000-03-06 03:40:29 +0000507 if self.force:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000508 return True
Greg Ward32c4a8a2000-03-06 03:40:29 +0000509 else:
510 if self.dry_run:
511 newer = newer_group (objects, output_file, missing='newer')
512 else:
513 newer = newer_group (objects, output_file)
514 return newer
515
Collin Winter5b7e9d72007-08-30 03:52:21 +0000516 def detect_language(self, sources):
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000517 """Detect the language of a given file, or list of files. Uses
518 language_map, and language_order to do the job.
519 """
Collin Winter5b7e9d72007-08-30 03:52:21 +0000520 if not isinstance(sources, list):
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000521 sources = [sources]
522 lang = None
523 index = len(self.language_order)
524 for source in sources:
525 base, ext = os.path.splitext(source)
526 extlang = self.language_map.get(ext)
527 try:
528 extindex = self.language_order.index(extlang)
529 if extindex < index:
530 lang = extlang
531 index = extindex
532 except ValueError:
533 pass
534 return lang
535
Greg Ward32c4a8a2000-03-06 03:40:29 +0000536
Greg Ward3f81cf71999-07-10 02:03:53 +0000537 # -- Worker methods ------------------------------------------------
538 # (must be implemented by subclasses)
539
Collin Winter5b7e9d72007-08-30 03:52:21 +0000540 def preprocess(self, source, output_file=None, macros=None,
541 include_dirs=None, extra_preargs=None, extra_postargs=None):
Greg Ward3ff3b032000-06-21 02:58:46 +0000542 """Preprocess a single C/C++ source file, named in 'source'.
543 Output will be written to file named 'output_file', or stdout if
544 'output_file' not supplied. 'macros' is a list of macro
545 definitions as for 'compile()', which will augment the macros set
546 with 'define_macro()' and 'undefine_macro()'. 'include_dirs' is a
547 list of directory names that will be added to the default list.
Greg Warde5c62bf2000-06-25 02:08:18 +0000548
549 Raises PreprocessError on failure.
Greg Ward3ff3b032000-06-21 02:58:46 +0000550 """
551 pass
552
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000553 def compile(self, sources, output_dir=None, macros=None,
554 include_dirs=None, debug=0, extra_preargs=None,
555 extra_postargs=None, depends=None):
556 """Compile one or more source files.
557
558 'sources' must be a list of filenames, most likely C/C++
559 files, but in reality anything that can be handled by a
560 particular compiler and compiler class (eg. MSVCCompiler can
561 handle resource files in 'sources'). Return a list of object
562 filenames, one per source filename in 'sources'. Depending on
563 the implementation, not all source files will necessarily be
564 compiled, but all corresponding object filenames will be
565 returned.
Greg Ward32c4a8a2000-03-06 03:40:29 +0000566
Greg Wardc3a43b42000-06-24 18:10:48 +0000567 If 'output_dir' is given, object files will be put under it, while
568 retaining their original path component. That is, "foo/bar.c"
569 normally compiles to "foo/bar.o" (for a Unix implementation); if
570 'output_dir' is "build", then it would compile to
571 "build/foo/bar.o".
Greg Ward3f81cf71999-07-10 02:03:53 +0000572
Greg Wardc3a43b42000-06-24 18:10:48 +0000573 'macros', if given, must be a list of macro definitions. A macro
574 definition is either a (name, value) 2-tuple or a (name,) 1-tuple.
575 The former defines a macro; if the value is None, the macro is
576 defined without an explicit value. The 1-tuple case undefines a
577 macro. Later definitions/redefinitions/ undefinitions take
578 precedence.
Greg Ward3f81cf71999-07-10 02:03:53 +0000579
Greg Wardc3a43b42000-06-24 18:10:48 +0000580 'include_dirs', if given, must be a list of strings, the
581 directories to add to the default include file search path for this
582 compilation only.
Greg Ward3c045a52000-02-09 02:16:14 +0000583
Greg Wardc3a43b42000-06-24 18:10:48 +0000584 'debug' is a boolean; if true, the compiler will be instructed to
585 output debug symbols in (or alongside) the object file(s).
Greg Ward802d6b71999-09-29 12:20:55 +0000586
Greg Wardc3a43b42000-06-24 18:10:48 +0000587 'extra_preargs' and 'extra_postargs' are implementation- dependent.
588 On platforms that have the notion of a command-line (e.g. Unix,
589 DOS/Windows), they are most likely lists of strings: extra
590 command-line arguments to prepand/append to the compiler command
591 line. On other platforms, consult the implementation class
592 documentation. In any event, they are intended as an escape hatch
593 for those occasions when the abstract compiler framework doesn't
594 cut the mustard.
Greg Wardd1517112000-05-30 01:56:44 +0000595
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000596 'depends', if given, is a list of filenames that all targets
597 depend on. If a source file is older than any file in
598 depends, then the source file will be recompiled. This
599 supports dependency tracking, but only at a coarse
600 granularity.
601
Greg Wardc3a43b42000-06-24 18:10:48 +0000602 Raises CompileError on failure.
603 """
Jeremy Hylton6e08d222002-06-18 18:42:41 +0000604 # A concrete compiler class can either override this method
605 # entirely or implement _compile().
Jeremy Hylton6e08d222002-06-18 18:42:41 +0000606 macros, objects, extra_postargs, pp_opts, build = \
607 self._setup_compile(output_dir, macros, include_dirs, sources,
608 depends, extra_postargs)
609 cc_args = self._get_cc_args(pp_opts, debug, extra_preargs)
610
Thomas Heller9436a752003-12-05 20:12:23 +0000611 for obj in objects:
612 try:
613 src, ext = build[obj]
614 except KeyError:
615 continue
Jeremy Hylton6e08d222002-06-18 18:42:41 +0000616 self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
617
618 # Return *all* object filenames, not just the ones we just built.
619 return objects
620
621 def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
622 """Compile 'src' to product 'obj'."""
Jeremy Hylton6e08d222002-06-18 18:42:41 +0000623 # A concrete compiler class that does not override compile()
624 # should implement _compile().
625 pass
Greg Ward3f81cf71999-07-10 02:03:53 +0000626
Collin Winter5b7e9d72007-08-30 03:52:21 +0000627 def create_static_lib(self, objects, output_libname, output_dir=None,
628 debug=0, target_lang=None):
Greg Wardc3a43b42000-06-24 18:10:48 +0000629 """Link a bunch of stuff together to create a static library file.
630 The "bunch of stuff" consists of the list of object files supplied
631 as 'objects', the extra object files supplied to
632 'add_link_object()' and/or 'set_link_objects()', the libraries
633 supplied to 'add_library()' and/or 'set_libraries()', and the
634 libraries supplied as 'libraries' (if any).
Greg Ward3f81cf71999-07-10 02:03:53 +0000635
Greg Wardc3a43b42000-06-24 18:10:48 +0000636 'output_libname' should be a library name, not a filename; the
637 filename will be inferred from the library name. 'output_dir' is
638 the directory where the library file will be put.
Greg Ward3c045a52000-02-09 02:16:14 +0000639
Greg Wardc3a43b42000-06-24 18:10:48 +0000640 'debug' is a boolean; if true, debugging information will be
641 included in the library (note that on most platforms, it is the
642 compile step where this matters: the 'debug' flag is included here
643 just for consistency).
Greg Wardd1517112000-05-30 01:56:44 +0000644
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000645 'target_lang' is the target language for which the given objects
646 are being compiled. This allows specific linkage time treatment of
647 certain languages.
648
Greg Wardc3a43b42000-06-24 18:10:48 +0000649 Raises LibError on failure.
650 """
Greg Ward3c045a52000-02-09 02:16:14 +0000651 pass
Fred Drakeb94b8492001-12-06 20:51:35 +0000652
Greg Ward42406482000-09-27 02:08:14 +0000653 # values for target_desc parameter in link()
654 SHARED_OBJECT = "shared_object"
655 SHARED_LIBRARY = "shared_library"
656 EXECUTABLE = "executable"
657
Tarek Ziadéa278be32010-01-11 23:47:51 +0000658 def link(self, target_desc, objects, output_filename, output_dir=None,
659 libraries=None, library_dirs=None, runtime_library_dirs=None,
660 export_symbols=None, debug=0, extra_preargs=None,
661 extra_postargs=None, build_temp=None, target_lang=None):
Greg Ward42406482000-09-27 02:08:14 +0000662 """Link a bunch of stuff together to create an executable or
663 shared library file.
664
665 The "bunch of stuff" consists of the list of object files supplied
666 as 'objects'. 'output_filename' should be a filename. If
667 'output_dir' is supplied, 'output_filename' is relative to it
668 (i.e. 'output_filename' can provide directory components if
669 needed).
Greg Ward3febd601999-10-03 20:41:02 +0000670
Greg Wardc3a43b42000-06-24 18:10:48 +0000671 'libraries' is a list of libraries to link against. These are
672 library names, not filenames, since they're translated into
673 filenames in a platform-specific way (eg. "foo" becomes "libfoo.a"
674 on Unix and "foo.lib" on DOS/Windows). However, they can include a
675 directory component, which means the linker will look in that
676 specific directory rather than searching all the normal locations.
Greg Ward5299b6a2000-05-20 13:23:21 +0000677
Greg Wardc3a43b42000-06-24 18:10:48 +0000678 'library_dirs', if supplied, should be a list of directories to
679 search for libraries that were specified as bare library names
680 (ie. no directory component). These are on top of the system
681 default and those supplied to 'add_library_dir()' and/or
682 'set_library_dirs()'. 'runtime_library_dirs' is a list of
683 directories that will be embedded into the shared library and used
684 to search for other shared libraries that *it* depends on at
685 run-time. (This may only be relevant on Unix.)
Greg Ward802d6b71999-09-29 12:20:55 +0000686
Greg Wardc3a43b42000-06-24 18:10:48 +0000687 'export_symbols' is a list of symbols that the shared library will
688 export. (This appears to be relevant only on Windows.)
Greg Ward3c045a52000-02-09 02:16:14 +0000689
Greg Wardc3a43b42000-06-24 18:10:48 +0000690 'debug' is as for 'compile()' and 'create_static_lib()', with the
691 slight distinction that it actually matters on most platforms (as
692 opposed to 'create_static_lib()', which includes a 'debug' flag
693 mostly for form's sake).
Greg Wardd1517112000-05-30 01:56:44 +0000694
Greg Wardc3a43b42000-06-24 18:10:48 +0000695 'extra_preargs' and 'extra_postargs' are as for 'compile()' (except
696 of course that they supply command-line arguments for the
697 particular linker being used).
Greg Ward3f81cf71999-07-10 02:03:53 +0000698
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000699 'target_lang' is the target language for which the given objects
700 are being compiled. This allows specific linkage time treatment of
701 certain languages.
702
Greg Wardc3a43b42000-06-24 18:10:48 +0000703 Raises LinkError on failure.
704 """
Greg Ward42406482000-09-27 02:08:14 +0000705 raise NotImplementedError
706
Fred Drakeb94b8492001-12-06 20:51:35 +0000707
Greg Ward264cf742000-09-27 02:24:21 +0000708 # Old 'link_*()' methods, rewritten to use the new 'link()' method.
Greg Ward42406482000-09-27 02:08:14 +0000709
Tarek Ziadéa278be32010-01-11 23:47:51 +0000710 def link_shared_lib(self, objects, output_libname, output_dir=None,
711 libraries=None, library_dirs=None,
712 runtime_library_dirs=None, export_symbols=None,
713 debug=0, extra_preargs=None, extra_postargs=None,
714 build_temp=None, target_lang=None):
Fred Drakeb94b8492001-12-06 20:51:35 +0000715 self.link(CCompiler.SHARED_LIBRARY, objects,
Greg Ward42406482000-09-27 02:08:14 +0000716 self.library_filename(output_libname, lib_type='shared'),
717 output_dir,
718 libraries, library_dirs, runtime_library_dirs,
719 export_symbols, debug,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000720 extra_preargs, extra_postargs, build_temp, target_lang)
Fred Drakeb94b8492001-12-06 20:51:35 +0000721
Greg Ward3f81cf71999-07-10 02:03:53 +0000722
Tarek Ziadéa278be32010-01-11 23:47:51 +0000723 def link_shared_object(self, objects, output_filename, output_dir=None,
724 libraries=None, library_dirs=None,
725 runtime_library_dirs=None, export_symbols=None,
726 debug=0, extra_preargs=None, extra_postargs=None,
727 build_temp=None, target_lang=None):
Greg Ward42406482000-09-27 02:08:14 +0000728 self.link(CCompiler.SHARED_OBJECT, objects,
729 output_filename, output_dir,
730 libraries, library_dirs, runtime_library_dirs,
731 export_symbols, debug,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000732 extra_preargs, extra_postargs, build_temp, target_lang)
Greg Ward3f81cf71999-07-10 02:03:53 +0000733
Greg Warde1aaaa61999-08-14 23:50:50 +0000734
Tarek Ziadéa278be32010-01-11 23:47:51 +0000735 def link_executable(self, objects, output_progname, output_dir=None,
736 libraries=None, library_dirs=None,
737 runtime_library_dirs=None, debug=0, extra_preargs=None,
738 extra_postargs=None, target_lang=None):
Fred Drakeb94b8492001-12-06 20:51:35 +0000739 self.link(CCompiler.EXECUTABLE, objects,
Greg Ward264cf742000-09-27 02:24:21 +0000740 self.executable_filename(output_progname), output_dir,
Fred Drakeb94b8492001-12-06 20:51:35 +0000741 libraries, library_dirs, runtime_library_dirs, None,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000742 debug, extra_preargs, extra_postargs, None, target_lang)
Greg Ward5baf1c22000-01-09 22:41:02 +0000743
744
Greg Wardf7edea72000-05-20 13:31:32 +0000745 # -- Miscellaneous methods -----------------------------------------
746 # These are all used by the 'gen_lib_options() function; there is
747 # no appropriate default implementation so subclasses should
748 # implement all of these.
749
Collin Winter5b7e9d72007-08-30 03:52:21 +0000750 def 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 libraries.
753 """
Greg Wardf7edea72000-05-20 13:31:32 +0000754 raise NotImplementedError
755
Collin Winter5b7e9d72007-08-30 03:52:21 +0000756 def runtime_library_dir_option(self, dir):
Greg Wardc3a43b42000-06-24 18:10:48 +0000757 """Return the compiler option to add 'dir' to the list of
758 directories searched for runtime libraries.
759 """
Greg Wardf7edea72000-05-20 13:31:32 +0000760 raise NotImplementedError
761
Collin Winter5b7e9d72007-08-30 03:52:21 +0000762 def library_option(self, lib):
Greg Wardf7edea72000-05-20 13:31:32 +0000763 """Return the compiler option to add 'dir' to the list of libraries
Greg Wardc3a43b42000-06-24 18:10:48 +0000764 linked into the shared library or executable.
765 """
Greg Wardf7edea72000-05-20 13:31:32 +0000766 raise NotImplementedError
767
Collin Winter5b7e9d72007-08-30 03:52:21 +0000768 def has_function(self, funcname, includes=None, include_dirs=None,
769 libraries=None, library_dirs=None):
Skip Montanarofa012612003-04-24 19:49:23 +0000770 """Return a boolean indicating whether funcname is supported on
771 the current platform. The optional arguments can be used to
772 augment the compilation environment.
773 """
Skip Montanarofa012612003-04-24 19:49:23 +0000774 # this can't be included at module scope because it tries to
775 # import math which might not be available at that point - maybe
776 # the necessary logic should just be inlined?
777 import tempfile
778 if includes is None:
779 includes = []
780 if include_dirs is None:
781 include_dirs = []
782 if libraries is None:
783 libraries = []
784 if library_dirs is None:
785 library_dirs = []
786 fd, fname = tempfile.mkstemp(".c", funcname, text=True)
787 f = os.fdopen(fd, "w")
788 for incl in includes:
789 f.write("""#include "%s"\n""" % incl)
790 f.write("""\
791main (int argc, char **argv) {
792 %s();
793}
794""" % funcname)
795 f.close()
796 try:
797 objects = self.compile([fname], include_dirs=include_dirs)
798 except CompileError:
799 return False
800
801 try:
802 self.link_executable(objects, "a.out",
803 libraries=libraries,
804 library_dirs=library_dirs)
805 except (LinkError, TypeError):
806 return False
807 return True
808
Greg Warde5e60152000-08-04 01:28:39 +0000809 def find_library_file (self, dirs, lib, debug=0):
Greg Wardf7edea72000-05-20 13:31:32 +0000810 """Search the specified list of directories for a static or shared
Greg Warde5e60152000-08-04 01:28:39 +0000811 library file 'lib' and return the full path to that file. If
812 'debug' true, look for a debugging version (if that makes sense on
813 the current platform). Return None if 'lib' wasn't found in any of
814 the specified directories.
Greg Wardc3a43b42000-06-24 18:10:48 +0000815 """
Greg Wardf7edea72000-05-20 13:31:32 +0000816 raise NotImplementedError
817
Greg Ward32c4a8a2000-03-06 03:40:29 +0000818 # -- Filename generation methods -----------------------------------
Greg Warde1aaaa61999-08-14 23:50:50 +0000819
Greg Ward32c4a8a2000-03-06 03:40:29 +0000820 # The default implementation of the filename generating methods are
821 # prejudiced towards the Unix/DOS/Windows view of the world:
822 # * object files are named by replacing the source file extension
823 # (eg. .c/.cpp -> .o/.obj)
824 # * library files (shared or static) are named by plugging the
825 # library name and extension into a format string, eg.
826 # "lib%s.%s" % (lib_name, ".a") for Unix static libraries
827 # * executables are named by appending an extension (possibly
828 # empty) to the program name: eg. progname + ".exe" for
829 # Windows
830 #
831 # To reduce redundant code, these methods expect to find
832 # several attributes in the current object (presumably defined
833 # as class attributes):
834 # * src_extensions -
835 # list of C/C++ source file extensions, eg. ['.c', '.cpp']
836 # * obj_extension -
837 # object file extension, eg. '.o' or '.obj'
838 # * static_lib_extension -
839 # extension for static library files, eg. '.a' or '.lib'
840 # * shared_lib_extension -
841 # extension for shared library/object files, eg. '.so', '.dll'
842 # * static_lib_format -
843 # format string for generating static library filenames,
844 # eg. 'lib%s.%s' or '%s.%s'
845 # * shared_lib_format
846 # format string for generating shared library filenames
847 # (probably same as static_lib_format, since the extension
848 # is one of the intended parameters to the format string)
849 # * exe_extension -
850 # extension for executable files, eg. '' or '.exe'
Greg Ward9b17cb51999-09-13 03:07:24 +0000851
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000852 def object_filenames(self, source_filenames, strip_dir=0, output_dir=''):
Guido van Rossumcc3a6df2002-10-01 04:14:17 +0000853 if output_dir is None:
854 output_dir = ''
Greg Ward32c4a8a2000-03-06 03:40:29 +0000855 obj_names = []
856 for src_name in source_filenames:
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000857 base, ext = os.path.splitext(src_name)
Andrew M. Kuchling10da45e2003-02-26 18:52:07 +0000858 base = os.path.splitdrive(base)[1] # Chop off the drive
859 base = base[os.path.isabs(base):] # If abs, chop off leading /
Greg Ward32c4a8a2000-03-06 03:40:29 +0000860 if ext not in self.src_extensions:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000861 raise UnknownFileError(
862 "unknown file type '%s' (from '%s')" % (ext, src_name))
Greg Ward32c4a8a2000-03-06 03:40:29 +0000863 if strip_dir:
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000864 base = os.path.basename(base)
865 obj_names.append(os.path.join(output_dir,
866 base + self.obj_extension))
Greg Ward32c4a8a2000-03-06 03:40:29 +0000867 return obj_names
Greg Warde1aaaa61999-08-14 23:50:50 +0000868
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000869 def shared_object_filename(self, basename, strip_dir=0, output_dir=''):
870 assert output_dir is not None
Greg Ward32c4a8a2000-03-06 03:40:29 +0000871 if strip_dir:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000872 basename = os.path.basename(basename)
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000873 return os.path.join(output_dir, basename + self.shared_lib_extension)
Greg Warde1aaaa61999-08-14 23:50:50 +0000874
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000875 def executable_filename(self, basename, strip_dir=0, output_dir=''):
876 assert output_dir is not None
Greg Ward42406482000-09-27 02:08:14 +0000877 if strip_dir:
Collin Winter5b7e9d72007-08-30 03:52:21 +0000878 basename = os.path.basename(basename)
Greg Ward42406482000-09-27 02:08:14 +0000879 return os.path.join(output_dir, basename + (self.exe_extension or ''))
Greg Ward26e48ea1999-08-29 18:17:36 +0000880
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000881 def library_filename(self, libname, lib_type='static', # or 'shared'
882 strip_dir=0, output_dir=''):
883 assert output_dir is not None
884 if lib_type not in ("static", "shared", "dylib"):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000885 raise ValueError(
886 "'lib_type' must be \"static\", \"shared\" or \"dylib\"")
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000887 fmt = getattr(self, lib_type + "_lib_format")
888 ext = getattr(self, lib_type + "_lib_extension")
Greg Ward32c4a8a2000-03-06 03:40:29 +0000889
Collin Winter5b7e9d72007-08-30 03:52:21 +0000890 dir, base = os.path.split(libname)
Greg Ward32c4a8a2000-03-06 03:40:29 +0000891 filename = fmt % (base, ext)
892 if strip_dir:
893 dir = ''
894
Jeremy Hylton59b103c2002-06-13 17:26:30 +0000895 return os.path.join(output_dir, dir, filename)
Greg Ward32c4a8a2000-03-06 03:40:29 +0000896
Greg Warde1aaaa61999-08-14 23:50:50 +0000897
898 # -- Utility methods -----------------------------------------------
899
Collin Winter5b7e9d72007-08-30 03:52:21 +0000900 def announce(self, msg, level=1):
Jeremy Hyltoncd8a1142002-06-04 20:14:43 +0000901 log.debug(msg)
Greg Ward9b17cb51999-09-13 03:07:24 +0000902
Collin Winter5b7e9d72007-08-30 03:52:21 +0000903 def debug_print(self, msg):
Jeremy Hyltonfcd73532002-09-11 16:31:53 +0000904 from distutils.debug import DEBUG
Greg Wardf813e592000-08-04 01:31:13 +0000905 if DEBUG:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000906 print(msg)
Greg Wardf813e592000-08-04 01:31:13 +0000907
Collin Winter5b7e9d72007-08-30 03:52:21 +0000908 def warn(self, msg):
909 sys.stderr.write("warning: %s\n" % msg)
Greg Ward3febd601999-10-03 20:41:02 +0000910
Collin Winter5b7e9d72007-08-30 03:52:21 +0000911 def execute(self, func, args, msg=None, level=1):
Jeremy Hyltoncd8a1142002-06-04 20:14:43 +0000912 execute(func, args, msg, self.dry_run)
Greg Ward9dddbb42000-08-02 01:38:20 +0000913
Collin Winter5b7e9d72007-08-30 03:52:21 +0000914 def spawn(self, cmd):
915 spawn(cmd, dry_run=self.dry_run)
Greg Warde1aaaa61999-08-14 23:50:50 +0000916
Collin Winter5b7e9d72007-08-30 03:52:21 +0000917 def move_file(self, src, dst):
918 return move_file(src, dst, dry_run=self.dry_run)
Greg Ward9b17cb51999-09-13 03:07:24 +0000919
Tarek Ziadéa278be32010-01-11 23:47:51 +0000920 def mkpath(self, name, mode=0o777):
Benjamin Peterson6ebe78f2008-12-21 00:06:59 +0000921 mkpath(name, mode, dry_run=self.dry_run)
Greg Ward3f81cf71999-07-10 02:03:53 +0000922
923
Marc-André Lemburg636b9062001-02-19 09:20:04 +0000924# Map a sys.platform/os.name ('posix', 'nt') to the default compiler
925# type for that platform. Keys are interpreted as re match
926# patterns. Order is important; platform mappings are preferred over
927# OS names.
928_default_compilers = (
929
930 # Platform string mappings
Andrew M. Kuchlinga34dbe02001-02-27 19:13:15 +0000931
932 # on a cygwin built python we can use gcc like an ordinary UNIXish
933 # compiler
934 ('cygwin.*', 'unix'),
Marc-André Lemburg2544f512002-01-31 18:56:00 +0000935 ('os2emx', 'emx'),
Fred Drakeb94b8492001-12-06 20:51:35 +0000936
Marc-André Lemburg636b9062001-02-19 09:20:04 +0000937 # OS name mappings
938 ('posix', 'unix'),
939 ('nt', 'msvc'),
Fred Drakeb94b8492001-12-06 20:51:35 +0000940
Marc-André Lemburg636b9062001-02-19 09:20:04 +0000941 )
942
943def get_default_compiler(osname=None, platform=None):
Collin Winter5b7e9d72007-08-30 03:52:21 +0000944 """Determine the default compiler to use for the given platform.
Marc-André Lemburg636b9062001-02-19 09:20:04 +0000945
Collin Winter5b7e9d72007-08-30 03:52:21 +0000946 osname should be one of the standard Python OS names (i.e. the
947 ones returned by os.name) and platform the common value
948 returned by sys.platform for the platform in question.
Marc-André Lemburg636b9062001-02-19 09:20:04 +0000949
Collin Winter5b7e9d72007-08-30 03:52:21 +0000950 The default values are os.name and sys.platform in case the
951 parameters are not given.
Marc-André Lemburg636b9062001-02-19 09:20:04 +0000952 """
953 if osname is None:
954 osname = os.name
955 if platform is None:
956 platform = sys.platform
957 for pattern, compiler in _default_compilers:
958 if re.match(pattern, platform) is not None or \
959 re.match(pattern, osname) is not None:
960 return compiler
961 # Default to Unix compiler
962 return 'unix'
Greg Ward802d6b71999-09-29 12:20:55 +0000963
964# Map compiler types to (module_name, class_name) pairs -- ie. where to
965# find the code that implements an interface to this compiler. (The module
966# is assumed to be in the 'distutils' package.)
Greg Ward2ff78872000-06-24 00:23:20 +0000967compiler_class = { 'unix': ('unixccompiler', 'UnixCCompiler',
968 "standard UNIX-style compiler"),
969 'msvc': ('msvccompiler', 'MSVCCompiler',
970 "Microsoft Visual C++"),
971 'cygwin': ('cygwinccompiler', 'CygwinCCompiler',
972 "Cygwin port of GNU C Compiler for Win32"),
973 'mingw32': ('cygwinccompiler', 'Mingw32CCompiler',
974 "Mingw32 port of GNU C Compiler for Win32"),
Greg Wardbfc79d62000-06-28 01:29:09 +0000975 'bcpp': ('bcppcompiler', 'BCPPCompiler',
976 "Borland C++ Compiler"),
Marc-André Lemburg2544f512002-01-31 18:56:00 +0000977 'emx': ('emxccompiler', 'EMXCCompiler',
978 "EMX port of GNU C Compiler for OS/2"),
Greg Ward802d6b71999-09-29 12:20:55 +0000979 }
980
Greg Ward9d17a7a2000-06-07 03:00:06 +0000981def show_compilers():
Greg Ward2ff78872000-06-24 00:23:20 +0000982 """Print list of available compilers (used by the "--help-compiler"
983 options to "build", "build_ext", "build_clib").
984 """
985 # XXX this "knows" that the compiler option it's describing is
986 # "--compiler", which just happens to be the case for the three
987 # commands that use it.
Fred Drakeb94b8492001-12-06 20:51:35 +0000988 from distutils.fancy_getopt import FancyGetopt
Greg Ward2ff78872000-06-24 00:23:20 +0000989 compilers = []
Greg Ward9d17a7a2000-06-07 03:00:06 +0000990 for compiler in compiler_class.keys():
Jeremy Hylton65d6edb2000-07-07 20:45:21 +0000991 compilers.append(("compiler="+compiler, None,
Greg Ward2ff78872000-06-24 00:23:20 +0000992 compiler_class[compiler][2]))
993 compilers.sort()
994 pretty_printer = FancyGetopt(compilers)
Greg Ward9d17a7a2000-06-07 03:00:06 +0000995 pretty_printer.print_help("List of available compilers:")
Fred Drakeb94b8492001-12-06 20:51:35 +0000996
Greg Ward802d6b71999-09-29 12:20:55 +0000997
Collin Winter5b7e9d72007-08-30 03:52:21 +0000998def new_compiler(plat=None, compiler=None, verbose=0, dry_run=0, force=0):
Greg Ward802d6b71999-09-29 12:20:55 +0000999 """Generate an instance of some CCompiler subclass for the supplied
Greg Wardc3a43b42000-06-24 18:10:48 +00001000 platform/compiler combination. 'plat' defaults to 'os.name'
1001 (eg. 'posix', 'nt'), and 'compiler' defaults to the default compiler
1002 for that platform. Currently only 'posix' and 'nt' are supported, and
1003 the default compilers are "traditional Unix interface" (UnixCCompiler
1004 class) and Visual C++ (MSVCCompiler class). Note that it's perfectly
1005 possible to ask for a Unix compiler object under Windows, and a
1006 Microsoft compiler object under Unix -- if you supply a value for
1007 'compiler', 'plat' is ignored.
1008 """
Greg Ward802d6b71999-09-29 12:20:55 +00001009 if plat is None:
1010 plat = os.name
1011
1012 try:
1013 if compiler is None:
Marc-André Lemburg636b9062001-02-19 09:20:04 +00001014 compiler = get_default_compiler(plat)
Fred Drakeb94b8492001-12-06 20:51:35 +00001015
Greg Ward2ff78872000-06-24 00:23:20 +00001016 (module_name, class_name, long_description) = compiler_class[compiler]
Greg Ward802d6b71999-09-29 12:20:55 +00001017 except KeyError:
1018 msg = "don't know how to compile C/C++ code on platform '%s'" % plat
1019 if compiler is not None:
1020 msg = msg + " with '%s' compiler" % compiler
Collin Winter5b7e9d72007-08-30 03:52:21 +00001021 raise DistutilsPlatformError(msg)
Fred Drakeb94b8492001-12-06 20:51:35 +00001022
Greg Ward802d6b71999-09-29 12:20:55 +00001023 try:
1024 module_name = "distutils." + module_name
1025 __import__ (module_name)
1026 module = sys.modules[module_name]
1027 klass = vars(module)[class_name]
1028 except ImportError:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001029 raise DistutilsModuleError(
Greg Ward802d6b71999-09-29 12:20:55 +00001030 "can't compile C/C++ code: unable to load module '%s'" % \
Collin Winter5b7e9d72007-08-30 03:52:21 +00001031 module_name)
Greg Ward802d6b71999-09-29 12:20:55 +00001032 except KeyError:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001033 raise DistutilsModuleError(
1034 "can't compile C/C++ code: unable to find class '%s' "
1035 "in module '%s'" % (class_name, module_name))
Greg Ward802d6b71999-09-29 12:20:55 +00001036
Jeremy Hyltoncd8a1142002-06-04 20:14:43 +00001037 # XXX The None is necessary to preserve backwards compatibility
1038 # with classes that expect verbose to be the first positional
1039 # argument.
Collin Winter5b7e9d72007-08-30 03:52:21 +00001040 return klass(None, dry_run, force)
Greg Wardf7a39ec1999-09-08 02:29:08 +00001041
1042
Collin Winter5b7e9d72007-08-30 03:52:21 +00001043def gen_preprocess_options(macros, include_dirs):
Greg Wardc3a43b42000-06-24 18:10:48 +00001044 """Generate C pre-processor options (-D, -U, -I) as used by at least
1045 two types of compilers: the typical Unix compiler and Visual C++.
1046 'macros' is the usual thing, a list of 1- or 2-tuples, where (name,)
1047 means undefine (-U) macro 'name', and (name,value) means define (-D)
1048 macro 'name' to 'value'. 'include_dirs' is just a list of directory
1049 names to be added to the header file search path (-I). Returns a list
1050 of command-line options suitable for either Unix compilers or Visual
1051 C++.
1052 """
Greg Wardf7a39ec1999-09-08 02:29:08 +00001053 # XXX it would be nice (mainly aesthetic, and so we don't generate
1054 # stupid-looking command lines) to go over 'macros' and eliminate
1055 # redundant definitions/undefinitions (ie. ensure that only the
1056 # latest mention of a particular macro winds up on the command
1057 # line). I don't think it's essential, though, since most (all?)
1058 # Unix C compilers only pay attention to the latest -D or -U
1059 # mention of a macro on their command line. Similar situation for
Greg Ward0bdd90a1999-12-12 17:19:58 +00001060 # 'include_dirs'. I'm punting on both for now. Anyways, weeding out
Greg Wardf7a39ec1999-09-08 02:29:08 +00001061 # redundancies like this should probably be the province of
1062 # CCompiler, since the data structures used are inherited from it
1063 # and therefore common to all CCompiler classes.
Greg Wardf7a39ec1999-09-08 02:29:08 +00001064 pp_opts = []
1065 for macro in macros:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001066 if not (isinstance(macro, tuple) and 1 <= len(macro) <= 2):
1067 raise TypeError(
1068 "bad macro definition '%s': "
1069 "each element of 'macros' list must be a 1- or 2-tuple"
1070 % macro)
Greg Wardfbf8aff1999-09-21 18:35:09 +00001071
Collin Winter5b7e9d72007-08-30 03:52:21 +00001072 if len(macro) == 1: # undefine this macro
1073 pp_opts.append("-U%s" % macro[0])
1074 elif len(macro) == 2:
Greg Wardf7a39ec1999-09-08 02:29:08 +00001075 if macro[1] is None: # define with no explicit value
Collin Winter5b7e9d72007-08-30 03:52:21 +00001076 pp_opts.append("-D%s" % macro[0])
Greg Wardf7a39ec1999-09-08 02:29:08 +00001077 else:
1078 # XXX *don't* need to be clever about quoting the
1079 # macro value here, because we're going to avoid the
1080 # shell at all costs when we spawn the command!
Collin Winter5b7e9d72007-08-30 03:52:21 +00001081 pp_opts.append("-D%s=%s" % macro)
Greg Wardf7a39ec1999-09-08 02:29:08 +00001082
Greg Ward0bdd90a1999-12-12 17:19:58 +00001083 for dir in include_dirs:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001084 pp_opts.append("-I%s" % dir)
Greg Wardf7a39ec1999-09-08 02:29:08 +00001085 return pp_opts
1086
Greg Wardf7a39ec1999-09-08 02:29:08 +00001087
Tarek Ziadécc9144a2009-06-28 21:29:24 +00001088def gen_lib_options(compiler, library_dirs, runtime_library_dirs, libraries):
Greg Wardf7a39ec1999-09-08 02:29:08 +00001089 """Generate linker options for searching library directories and
Tarek Ziadécc9144a2009-06-28 21:29:24 +00001090 linking with specific libraries.
1091
1092 'libraries' and 'library_dirs' are, respectively, lists of library names
1093 (not filenames!) and search directories. Returns a list of command-line
1094 options suitable for use with some compiler (depending on the two format
1095 strings passed in).
Greg Wardc3a43b42000-06-24 18:10:48 +00001096 """
Greg Wardf7a39ec1999-09-08 02:29:08 +00001097 lib_opts = []
1098
1099 for dir in library_dirs:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001100 lib_opts.append(compiler.library_dir_option(dir))
Greg Wardf7a39ec1999-09-08 02:29:08 +00001101
Greg Wardd03f88a2000-03-18 15:19:51 +00001102 for dir in runtime_library_dirs:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001103 opt = compiler.runtime_library_dir_option(dir)
1104 if isinstance(opt, list):
Tarek Ziadécc9144a2009-06-28 21:29:24 +00001105 lib_opts.extend(opt)
Martin v. Löwis061f1322004-08-29 16:40:55 +00001106 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001107 lib_opts.append(opt)
Greg Wardd03f88a2000-03-18 15:19:51 +00001108
Greg Wardf7a39ec1999-09-08 02:29:08 +00001109 # XXX it's important that we *not* remove redundant library mentions!
1110 # sometimes you really do have to say "-lfoo -lbar -lfoo" in order to
1111 # resolve all symbols. I just hope we never have to say "-lfoo obj.o
1112 # -lbar" to get things to work -- that's certainly a possibility, but a
1113 # pretty nasty way to arrange your C code.
1114
1115 for lib in libraries:
Tarek Ziadécc9144a2009-06-28 21:29:24 +00001116 lib_dir, lib_name = os.path.split(lib)
1117 if lib_dir != '':
Collin Winter5b7e9d72007-08-30 03:52:21 +00001118 lib_file = compiler.find_library_file([lib_dir], lib_name)
Tarek Ziadécc9144a2009-06-28 21:29:24 +00001119 if lib_file is not None:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001120 lib_opts.append(lib_file)
Greg Ward3febd601999-10-03 20:41:02 +00001121 else:
Collin Winter5b7e9d72007-08-30 03:52:21 +00001122 compiler.warn("no library file corresponding to "
1123 "'%s' found (skipping)" % lib)
Greg Ward3febd601999-10-03 20:41:02 +00001124 else:
Tarek Ziadécc9144a2009-06-28 21:29:24 +00001125 lib_opts.append(compiler.library_option(lib))
Greg Wardf7a39ec1999-09-08 02:29:08 +00001126 return lib_opts