Slight change to the meaning of the 'libraries' list: if a library name

has a directory component, then we only search for the library in
  that one directory, ie. ignore the 'library_dirs' lists for that
  one library.
Changed calling convention to 'gen_lib_options()' again: now, it takes
  a CCompiler instance and calls methods on it instead of taking
  format strings.  Also implemented the new "library name" semantics
  using the 'find_library_file()' method in the CCompiler instance.
Added 'force' flag to CCompiler; added to constructor and 'new_compiler()'.
Added 'warn()' method.
This commit is contained in:
Greg Ward 1999-10-03 20:41:02 +00:00
parent 99eb7a1255
commit 3febd60682
1 changed files with 37 additions and 14 deletions

View File

@ -67,10 +67,12 @@ class CCompiler:
def __init__ (self,
verbose=0,
dry_run=0):
dry_run=0,
force=0):
self.verbose = verbose
self.dry_run = dry_run
self.force = force
# 'output_dir': a common output directory for object, library,
# shared object, and shared library files
@ -312,9 +314,19 @@ class CCompiler:
'output_libname' should be a library name, not a filename;
the filename will be inferred from the library name.
'library_dirs', if supplied, should be a list of additional
directories to search on top of the system default and those
supplied to 'add_library_dir()' and/or 'set_library_dirs()'.
'libraries' is a list of libraries to link against. These are
library names, not filenames, since they're translated into
filenames in a platform-specific way (eg. "foo" becomes
"libfoo.a" on Unix and "foo.lib" on DOS/Windows). However, they
can include a directory component, which means the linker will
look in that specific directory rather than searching all the
normal locations.
'library_dirs', if supplied, should be a list of directories to
search for libraries that were specified as bare library names
(ie. no directory component). These are on top of the system
default and those supplied to 'add_library_dir()' and/or
'set_library_dirs()'.
'extra_preargs' and 'extra_postargs' are as for 'compile()'
(except of course that they supply command-line arguments
@ -402,6 +414,9 @@ class CCompiler:
if self.verbose >= level:
print msg
def warn (self, msg):
sys.stderr.write ("warning: %s\n" % msg)
def spawn (self, cmd):
spawn (cmd, verbose=self.verbose, dry_run=self.dry_run)
@ -429,7 +444,8 @@ compiler_class = { 'unix': ('unixccompiler', 'UnixCCompiler'),
def new_compiler (plat=None,
compiler=None,
verbose=0,
dry_run=0):
dry_run=0,
force=0):
"""Generate an instance of some CCompiler subclass for the supplied
platform/compiler combination. 'plat' defaults to 'os.name'
@ -470,7 +486,7 @@ def new_compiler (plat=None,
("can't compile C/C++ code: unable to find class '%s' " +
"in module '%s'") % (class_name, module_name)
return klass (verbose, dry_run)
return klass (verbose, dry_run, force)
def gen_preprocess_options (macros, includes):
@ -524,20 +540,18 @@ def gen_preprocess_options (macros, includes):
# gen_preprocess_options ()
def gen_lib_options (library_dirs, libraries, dir_format, lib_format):
def gen_lib_options (compiler, library_dirs, libraries):
"""Generate linker options for searching library directories and
linking with specific libraries. 'libraries' and 'library_dirs'
are, respectively, lists of library names (not filenames!) and
search directories. 'lib_format' is a format string with exactly
one "%s", into which will be plugged each library name in turn;
'dir_format' is similar, but directory names will be plugged into
it. Returns a list of command-line options suitable for use with
some compiler (depending on the two format strings passed in)."""
search directories. Returns a list of command-line options suitable
for use with some compiler (depending on the two format strings
passed in)."""
lib_opts = []
for dir in library_dirs:
lib_opts.append (dir_format % dir)
lib_opts.append (compiler.library_dir_option (dir))
# XXX it's important that we *not* remove redundant library mentions!
# sometimes you really do have to say "-lfoo -lbar -lfoo" in order to
@ -546,7 +560,16 @@ def gen_lib_options (library_dirs, libraries, dir_format, lib_format):
# pretty nasty way to arrange your C code.
for lib in libraries:
lib_opts.append (lib_format % lib)
(lib_dir, lib_name) = os.path.split (lib)
if lib_dir:
lib_file = compiler.find_library_file ([lib_dir], lib_name)
if lib_file:
lib_opts.append (lib_file)
else:
compiler.warn ("no library file corresponding to "
"'%s' found (skipping)" % lib)
else:
lib_opts.append (compiler.library_option (lib))
return lib_opts