diff options
author | Greg Ward <gward@python.net> | 2000-06-25 02:05:29 (GMT) |
---|---|---|
committer | Greg Ward <gward@python.net> | 2000-06-25 02:05:29 (GMT) |
commit | 73076ff7549c69da7bb9622e0dd916b225072306 (patch) | |
tree | f428d46725ab85db47dcdfa0fad829d335b20378 /Lib/distutils/unixccompiler.py | |
parent | 6a2a3dbec59f267e05c0c507457dfd234263237b (diff) | |
download | cpython-73076ff7549c69da7bb9622e0dd916b225072306.zip cpython-73076ff7549c69da7bb9622e0dd916b225072306.tar.gz cpython-73076ff7549c69da7bb9622e0dd916b225072306.tar.bz2 |
Got rid of direct dependence on the sysconfig module. Mainly, this
meant playing along with the new "dictionary of executables" scheme
added to CCompiler by adding the 'executables' class attribute, and
changing all the compile/link/etc. methods to use the new attributes
(which encapsulate both the program to run and its standard arguments,
so it was a *little* bit more than just changing some names).
Diffstat (limited to 'Lib/distutils/unixccompiler.py')
-rw-r--r-- | Lib/distutils/unixccompiler.py | 102 |
1 files changed, 35 insertions, 67 deletions
diff --git a/Lib/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py index 47d8ad6..85ce5df 100644 --- a/Lib/distutils/unixccompiler.py +++ b/Lib/distutils/unixccompiler.py @@ -20,7 +20,6 @@ __revision__ = "$Id$" import string, re, os from types import * from copy import copy -from distutils import sysconfig from distutils.dep_util import newer from distutils.ccompiler import \ CCompiler, gen_preprocess_options, gen_lib_options @@ -45,65 +44,42 @@ from distutils.errors import \ class UnixCCompiler (CCompiler): - # XXX perhaps there should really be *three* kinds of include - # directories: those built in to the preprocessor, those from Python's - # Makefiles, and those supplied to {add,set}_include_dirs(). Currently - # we make no distinction between the latter two at this point; it's all - # up to the client class to select the include directories to use above - # and beyond the compiler's defaults. That is, both the Python include - # directories and any module- or package-specific include directories - # are specified via {add,set}_include_dirs(), and there's no way to - # distinguish them. This might be a bug. - compiler_type = 'unix' - # Needed for the filename generation methods provided by the - # base class, CCompiler. + # These are used by CCompiler in two places: the constructor sets + # instance attributes 'preprocessor', 'compiler', etc. from them, and + # 'set_executable()' allows any of these to be set. The defaults here + # are pretty generic; they will probably have to be set by an outsider + # (eg. using information discovered by the sysconfig about building + # Python extensions). + executables = {'preprocessor' : None, + 'compiler' : ["cc"], + 'compiler_so' : ["cc"], + 'linker_so' : ["cc", "-shared"], + 'linker_exe' : ["cc"], + 'archiver' : ["ar", "-cr"], + 'ranlib' : None, + } + + # Needed for the filename generation methods provided by the base + # class, CCompiler. NB. whoever instantiates/uses a particular + # UnixCCompiler instance should set 'shared_lib_ext' -- we set a + # reasonable common default here, but it's not necessarily used on all + # Unices! + src_extensions = [".c",".C",".cc",".cxx",".cpp"] obj_extension = ".o" static_lib_extension = ".a" - shared_lib_extension = sysconfig.SO + shared_lib_extension = ".so" static_lib_format = shared_lib_format = "lib%s%s" - # Command to create a static library: seems to be pretty consistent - # across the major Unices. Might have to move down into the - # constructor if we need platform-specific guesswork. - archiver = sysconfig.AR - archiver_options = "-cr" - ranlib = sysconfig.RANLIB - def __init__ (self, verbose=0, dry_run=0, force=0): - CCompiler.__init__ (self, verbose, dry_run, force) - self.preprocess_options = None - self.compile_options = None - - # Munge CC and OPT together in case there are flags stuck in CC. - # Note that using these variables from sysconfig immediately makes - # this module specific to building Python extensions and - # inappropriate as a general-purpose C compiler front-end. So sue - # me. Note also that we use OPT rather than CFLAGS, because CFLAGS - # is the flags used to compile Python itself -- not only are there - # -I options in there, they are the *wrong* -I options. We'll - # leave selection of include directories up to the class using - # UnixCCompiler! - - (self.cc, self.ccflags) = \ - _split_command (sysconfig.CC + ' ' + sysconfig.OPT) - self.ccflags_shared = string.split (sysconfig.CCSHARED) - - (self.ld_shared, self.ldflags_shared) = \ - _split_command (sysconfig.LDSHARED) - - self.ld_exec = self.cc - - # __init__ () - def preprocess (self, source, @@ -116,11 +92,11 @@ class UnixCCompiler (CCompiler): (_, macros, include_dirs) = \ self._fix_compile_args (None, macros, include_dirs) pp_opts = gen_preprocess_options (macros, include_dirs) - cc_args = ['-E'] + pp_opts + pp_args = self.preprocessor + pp_opts if output_file: - cc_args.extend(['-o', output_file]) + pp_args.extend(['-o', output_file]) if extra_preargs: - cc_args[:0] = extra_preargs + pp_args[:0] = extra_preargs if extra_postargs: extra_postargs.extend(extra_postargs) @@ -131,7 +107,7 @@ class UnixCCompiler (CCompiler): if output_file: self.mkpath(os.path.dirname(output_file)) try: - self.spawn ([self.cc] + cc_args) + self.spawn (pp_args) except DistutilsExecError, msg: raise CompileError, msg @@ -151,7 +127,7 @@ class UnixCCompiler (CCompiler): # Figure out the options for the compiler command line. pp_opts = gen_preprocess_options (macros, include_dirs) - cc_args = ['-c'] + pp_opts + self.ccflags + self.ccflags_shared + cc_args = pp_opts + ['-c'] if debug: cc_args[:0] = ['-g'] if extra_preargs: @@ -168,7 +144,7 @@ class UnixCCompiler (CCompiler): else: self.mkpath (os.path.dirname (obj)) try: - self.spawn ([self.cc] + cc_args + + self.spawn (self.compiler_so + cc_args + [src, '-o', obj] + extra_postargs) except DistutilsExecError, msg: @@ -193,9 +169,8 @@ class UnixCCompiler (CCompiler): if self._need_link (objects, output_filename): self.mkpath (os.path.dirname (output_filename)) - self.spawn ([self.archiver, - self.archiver_options, - output_filename] + + self.spawn (self.archiver + + [output_filename] + objects + self.objects) # Not many Unices required ranlib anymore -- SunOS 4.x is, I @@ -203,9 +178,9 @@ class UnixCCompiler (CCompiler): # platform intelligence here to skip ranlib if it's not # needed -- or maybe Python's configure script took care of # it for us, hence the check for leading colon. - if self.ranlib[0] != ':': + if self.ranlib: try: - self.spawn ([self.ranlib, output_filename]) + self.spawn (self.ranlib + [output_filename]) except DistutilsExecError, msg: raise LibError, msg else: @@ -263,7 +238,7 @@ class UnixCCompiler (CCompiler): output_filename = os.path.join (output_dir, output_filename) if self._need_link (objects, output_filename): - ld_args = (self.ldflags_shared + objects + self.objects + + ld_args = (objects + self.objects + lib_opts + ['-o', output_filename]) if debug: ld_args[:0] = ['-g'] @@ -273,7 +248,7 @@ class UnixCCompiler (CCompiler): ld_args.extend (extra_postargs) self.mkpath (os.path.dirname (output_filename)) try: - self.spawn ([self.ld_shared] + ld_args) + self.spawn (self.linker_so + ld_args) except DistutilsExecError, msg: raise LinkError, msg else: @@ -314,7 +289,7 @@ class UnixCCompiler (CCompiler): ld_args.extend (extra_postargs) self.mkpath (os.path.dirname (output_filename)) try: - self.spawn ([self.ld_exec] + ld_args) + self.spawn (self.linker_exe + ld_args) except DistutilsExecError, msg: raise LinkError, msg else: @@ -359,10 +334,3 @@ class UnixCCompiler (CCompiler): # find_library_file () # class UnixCCompiler - - -def _split_command (cmd): - """Split a command string up into the progam to run (a string) and - the list of arguments; return them as (cmd, arglist).""" - args = string.split (cmd) - return (args[0], args[1:]) |