Chris@87: """ Chris@87: unixccompiler - can handle very long argument lists for ar. Chris@87: Chris@87: """ Chris@87: from __future__ import division, absolute_import, print_function Chris@87: Chris@87: import os Chris@87: Chris@87: from distutils.errors import DistutilsExecError, CompileError Chris@87: from distutils.unixccompiler import * Chris@87: from numpy.distutils.ccompiler import replace_method Chris@87: from numpy.distutils.compat import get_exception Chris@87: Chris@87: if sys.version_info[0] < 3: Chris@87: from . import log Chris@87: else: Chris@87: from numpy.distutils import log Chris@87: Chris@87: # Note that UnixCCompiler._compile appeared in Python 2.3 Chris@87: def UnixCCompiler__compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts): Chris@87: """Compile a single source files with a Unix-style compiler.""" Chris@87: # HP ad-hoc fix, see ticket 1383 Chris@87: ccomp = self.compiler_so Chris@87: if ccomp[0] == 'aCC': Chris@87: # remove flags that will trigger ANSI-C mode for aCC Chris@87: if '-Ae' in ccomp: Chris@87: ccomp.remove('-Ae') Chris@87: if '-Aa' in ccomp: Chris@87: ccomp.remove('-Aa') Chris@87: # add flags for (almost) sane C++ handling Chris@87: ccomp += ['-AA'] Chris@87: self.compiler_so = ccomp Chris@87: Chris@87: display = '%s: %s' % (os.path.basename(self.compiler_so[0]), src) Chris@87: try: Chris@87: self.spawn(self.compiler_so + cc_args + [src, '-o', obj] + Chris@87: extra_postargs, display = display) Chris@87: except DistutilsExecError: Chris@87: msg = str(get_exception()) Chris@87: raise CompileError(msg) Chris@87: Chris@87: replace_method(UnixCCompiler, '_compile', UnixCCompiler__compile) Chris@87: Chris@87: Chris@87: def UnixCCompiler_create_static_lib(self, objects, output_libname, Chris@87: output_dir=None, debug=0, target_lang=None): Chris@87: """ Chris@87: Build a static library in a separate sub-process. Chris@87: Chris@87: Parameters Chris@87: ---------- Chris@87: objects : list or tuple of str Chris@87: List of paths to object files used to build the static library. Chris@87: output_libname : str Chris@87: The library name as an absolute or relative (if `output_dir` is used) Chris@87: path. Chris@87: output_dir : str, optional Chris@87: The path to the output directory. Default is None, in which case Chris@87: the ``output_dir`` attribute of the UnixCCompiler instance. Chris@87: debug : bool, optional Chris@87: This parameter is not used. Chris@87: target_lang : str, optional Chris@87: This parameter is not used. Chris@87: Chris@87: Returns Chris@87: ------- Chris@87: None Chris@87: Chris@87: """ Chris@87: objects, output_dir = self._fix_object_args(objects, output_dir) Chris@87: Chris@87: output_filename = \ Chris@87: self.library_filename(output_libname, output_dir=output_dir) Chris@87: Chris@87: if self._need_link(objects, output_filename): Chris@87: try: Chris@87: # previous .a may be screwed up; best to remove it first Chris@87: # and recreate. Chris@87: # Also, ar on OS X doesn't handle updating universal archives Chris@87: os.unlink(output_filename) Chris@87: except (IOError, OSError): Chris@87: pass Chris@87: self.mkpath(os.path.dirname(output_filename)) Chris@87: tmp_objects = objects + self.objects Chris@87: while tmp_objects: Chris@87: objects = tmp_objects[:50] Chris@87: tmp_objects = tmp_objects[50:] Chris@87: display = '%s: adding %d object files to %s' % ( Chris@87: os.path.basename(self.archiver[0]), Chris@87: len(objects), output_filename) Chris@87: self.spawn(self.archiver + [output_filename] + objects, Chris@87: display = display) Chris@87: Chris@87: # Not many Unices required ranlib anymore -- SunOS 4.x is, I Chris@87: # think the only major Unix that does. Maybe we need some Chris@87: # platform intelligence here to skip ranlib if it's not Chris@87: # needed -- or maybe Python's configure script took care of Chris@87: # it for us, hence the check for leading colon. Chris@87: if self.ranlib: Chris@87: display = '%s:@ %s' % (os.path.basename(self.ranlib[0]), Chris@87: output_filename) Chris@87: try: Chris@87: self.spawn(self.ranlib + [output_filename], Chris@87: display = display) Chris@87: except DistutilsExecError: Chris@87: msg = str(get_exception()) Chris@87: raise LibError(msg) Chris@87: else: Chris@87: log.debug("skipping %s (up-to-date)", output_filename) Chris@87: return Chris@87: Chris@87: replace_method(UnixCCompiler, 'create_static_lib', Chris@87: UnixCCompiler_create_static_lib)