| """
|
| unixccompiler - can handle very long argument lists for ar.
|
|
|
| """
|
| import os
|
| import sys
|
| import subprocess
|
| import shlex
|
|
|
| from distutils.errors import CompileError, DistutilsExecError, LibError
|
| from distutils.unixccompiler import UnixCCompiler
|
| from numpy.distutils.ccompiler import replace_method
|
| from numpy.distutils.misc_util import _commandline_dep_string
|
| from numpy.distutils import log
|
|
|
|
|
| def UnixCCompiler__compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
|
| """Compile a single source files with a Unix-style compiler."""
|
|
|
| ccomp = self.compiler_so
|
| if ccomp[0] == 'aCC':
|
|
|
| if '-Ae' in ccomp:
|
| ccomp.remove('-Ae')
|
| if '-Aa' in ccomp:
|
| ccomp.remove('-Aa')
|
|
|
| ccomp += ['-AA']
|
| self.compiler_so = ccomp
|
|
|
| if 'OPT' in os.environ:
|
|
|
| from sysconfig import get_config_vars
|
| opt = shlex.join(shlex.split(os.environ['OPT']))
|
| gcv_opt = shlex.join(shlex.split(get_config_vars('OPT')[0]))
|
| ccomp_s = shlex.join(self.compiler_so)
|
| if opt not in ccomp_s:
|
| ccomp_s = ccomp_s.replace(gcv_opt, opt)
|
| self.compiler_so = shlex.split(ccomp_s)
|
| llink_s = shlex.join(self.linker_so)
|
| if opt not in llink_s:
|
| self.linker_so = self.linker_so + shlex.split(opt)
|
|
|
| display = '%s: %s' % (os.path.basename(self.compiler_so[0]), src)
|
|
|
|
|
|
|
| if getattr(self, '_auto_depends', False):
|
| deps = ['-MMD', '-MF', obj + '.d']
|
| else:
|
| deps = []
|
|
|
| try:
|
| self.spawn(self.compiler_so + cc_args + [src, '-o', obj] + deps +
|
| extra_postargs, display = display)
|
| except DistutilsExecError as e:
|
| msg = str(e)
|
| raise CompileError(msg) from None
|
|
|
|
|
| if deps:
|
|
|
|
|
|
|
| if sys.platform == 'zos':
|
| subprocess.check_output(['chtag', '-tc', 'IBM1047', obj + '.d'])
|
| with open(obj + '.d', 'a') as f:
|
| f.write(_commandline_dep_string(cc_args, extra_postargs, pp_opts))
|
|
|
| replace_method(UnixCCompiler, '_compile', UnixCCompiler__compile)
|
|
|
|
|
| def UnixCCompiler_create_static_lib(self, objects, output_libname,
|
| output_dir=None, debug=0, target_lang=None):
|
| """
|
| Build a static library in a separate sub-process.
|
|
|
| Parameters
|
| ----------
|
| objects : list or tuple of str
|
| List of paths to object files used to build the static library.
|
| output_libname : str
|
| The library name as an absolute or relative (if `output_dir` is used)
|
| path.
|
| output_dir : str, optional
|
| The path to the output directory. Default is None, in which case
|
| the ``output_dir`` attribute of the UnixCCompiler instance.
|
| debug : bool, optional
|
| This parameter is not used.
|
| target_lang : str, optional
|
| This parameter is not used.
|
|
|
| Returns
|
| -------
|
| None
|
|
|
| """
|
| objects, output_dir = self._fix_object_args(objects, output_dir)
|
|
|
| output_filename = \
|
| self.library_filename(output_libname, output_dir=output_dir)
|
|
|
| if self._need_link(objects, output_filename):
|
| try:
|
|
|
|
|
|
|
| os.unlink(output_filename)
|
| except OSError:
|
| pass
|
| self.mkpath(os.path.dirname(output_filename))
|
| tmp_objects = objects + self.objects
|
| while tmp_objects:
|
| objects = tmp_objects[:50]
|
| tmp_objects = tmp_objects[50:]
|
| display = '%s: adding %d object files to %s' % (
|
| os.path.basename(self.archiver[0]),
|
| len(objects), output_filename)
|
| self.spawn(self.archiver + [output_filename] + objects,
|
| display = display)
|
|
|
|
|
|
|
|
|
|
|
|
|
| if self.ranlib:
|
| display = '%s:@ %s' % (os.path.basename(self.ranlib[0]),
|
| output_filename)
|
| try:
|
| self.spawn(self.ranlib + [output_filename],
|
| display = display)
|
| except DistutilsExecError as e:
|
| msg = str(e)
|
| raise LibError(msg) from None
|
| else:
|
| log.debug("skipping %s (up-to-date)", output_filename)
|
| return
|
|
|
| replace_method(UnixCCompiler, 'create_static_lib',
|
| UnixCCompiler_create_static_lib)
|
|
|