Chris@87
|
1 """
|
Chris@87
|
2 unixccompiler - can handle very long argument lists for ar.
|
Chris@87
|
3
|
Chris@87
|
4 """
|
Chris@87
|
5 from __future__ import division, absolute_import, print_function
|
Chris@87
|
6
|
Chris@87
|
7 import os
|
Chris@87
|
8
|
Chris@87
|
9 from distutils.errors import DistutilsExecError, CompileError
|
Chris@87
|
10 from distutils.unixccompiler import *
|
Chris@87
|
11 from numpy.distutils.ccompiler import replace_method
|
Chris@87
|
12 from numpy.distutils.compat import get_exception
|
Chris@87
|
13
|
Chris@87
|
14 if sys.version_info[0] < 3:
|
Chris@87
|
15 from . import log
|
Chris@87
|
16 else:
|
Chris@87
|
17 from numpy.distutils import log
|
Chris@87
|
18
|
Chris@87
|
19 # Note that UnixCCompiler._compile appeared in Python 2.3
|
Chris@87
|
20 def UnixCCompiler__compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
|
Chris@87
|
21 """Compile a single source files with a Unix-style compiler."""
|
Chris@87
|
22 # HP ad-hoc fix, see ticket 1383
|
Chris@87
|
23 ccomp = self.compiler_so
|
Chris@87
|
24 if ccomp[0] == 'aCC':
|
Chris@87
|
25 # remove flags that will trigger ANSI-C mode for aCC
|
Chris@87
|
26 if '-Ae' in ccomp:
|
Chris@87
|
27 ccomp.remove('-Ae')
|
Chris@87
|
28 if '-Aa' in ccomp:
|
Chris@87
|
29 ccomp.remove('-Aa')
|
Chris@87
|
30 # add flags for (almost) sane C++ handling
|
Chris@87
|
31 ccomp += ['-AA']
|
Chris@87
|
32 self.compiler_so = ccomp
|
Chris@87
|
33
|
Chris@87
|
34 display = '%s: %s' % (os.path.basename(self.compiler_so[0]), src)
|
Chris@87
|
35 try:
|
Chris@87
|
36 self.spawn(self.compiler_so + cc_args + [src, '-o', obj] +
|
Chris@87
|
37 extra_postargs, display = display)
|
Chris@87
|
38 except DistutilsExecError:
|
Chris@87
|
39 msg = str(get_exception())
|
Chris@87
|
40 raise CompileError(msg)
|
Chris@87
|
41
|
Chris@87
|
42 replace_method(UnixCCompiler, '_compile', UnixCCompiler__compile)
|
Chris@87
|
43
|
Chris@87
|
44
|
Chris@87
|
45 def UnixCCompiler_create_static_lib(self, objects, output_libname,
|
Chris@87
|
46 output_dir=None, debug=0, target_lang=None):
|
Chris@87
|
47 """
|
Chris@87
|
48 Build a static library in a separate sub-process.
|
Chris@87
|
49
|
Chris@87
|
50 Parameters
|
Chris@87
|
51 ----------
|
Chris@87
|
52 objects : list or tuple of str
|
Chris@87
|
53 List of paths to object files used to build the static library.
|
Chris@87
|
54 output_libname : str
|
Chris@87
|
55 The library name as an absolute or relative (if `output_dir` is used)
|
Chris@87
|
56 path.
|
Chris@87
|
57 output_dir : str, optional
|
Chris@87
|
58 The path to the output directory. Default is None, in which case
|
Chris@87
|
59 the ``output_dir`` attribute of the UnixCCompiler instance.
|
Chris@87
|
60 debug : bool, optional
|
Chris@87
|
61 This parameter is not used.
|
Chris@87
|
62 target_lang : str, optional
|
Chris@87
|
63 This parameter is not used.
|
Chris@87
|
64
|
Chris@87
|
65 Returns
|
Chris@87
|
66 -------
|
Chris@87
|
67 None
|
Chris@87
|
68
|
Chris@87
|
69 """
|
Chris@87
|
70 objects, output_dir = self._fix_object_args(objects, output_dir)
|
Chris@87
|
71
|
Chris@87
|
72 output_filename = \
|
Chris@87
|
73 self.library_filename(output_libname, output_dir=output_dir)
|
Chris@87
|
74
|
Chris@87
|
75 if self._need_link(objects, output_filename):
|
Chris@87
|
76 try:
|
Chris@87
|
77 # previous .a may be screwed up; best to remove it first
|
Chris@87
|
78 # and recreate.
|
Chris@87
|
79 # Also, ar on OS X doesn't handle updating universal archives
|
Chris@87
|
80 os.unlink(output_filename)
|
Chris@87
|
81 except (IOError, OSError):
|
Chris@87
|
82 pass
|
Chris@87
|
83 self.mkpath(os.path.dirname(output_filename))
|
Chris@87
|
84 tmp_objects = objects + self.objects
|
Chris@87
|
85 while tmp_objects:
|
Chris@87
|
86 objects = tmp_objects[:50]
|
Chris@87
|
87 tmp_objects = tmp_objects[50:]
|
Chris@87
|
88 display = '%s: adding %d object files to %s' % (
|
Chris@87
|
89 os.path.basename(self.archiver[0]),
|
Chris@87
|
90 len(objects), output_filename)
|
Chris@87
|
91 self.spawn(self.archiver + [output_filename] + objects,
|
Chris@87
|
92 display = display)
|
Chris@87
|
93
|
Chris@87
|
94 # Not many Unices required ranlib anymore -- SunOS 4.x is, I
|
Chris@87
|
95 # think the only major Unix that does. Maybe we need some
|
Chris@87
|
96 # platform intelligence here to skip ranlib if it's not
|
Chris@87
|
97 # needed -- or maybe Python's configure script took care of
|
Chris@87
|
98 # it for us, hence the check for leading colon.
|
Chris@87
|
99 if self.ranlib:
|
Chris@87
|
100 display = '%s:@ %s' % (os.path.basename(self.ranlib[0]),
|
Chris@87
|
101 output_filename)
|
Chris@87
|
102 try:
|
Chris@87
|
103 self.spawn(self.ranlib + [output_filename],
|
Chris@87
|
104 display = display)
|
Chris@87
|
105 except DistutilsExecError:
|
Chris@87
|
106 msg = str(get_exception())
|
Chris@87
|
107 raise LibError(msg)
|
Chris@87
|
108 else:
|
Chris@87
|
109 log.debug("skipping %s (up-to-date)", output_filename)
|
Chris@87
|
110 return
|
Chris@87
|
111
|
Chris@87
|
112 replace_method(UnixCCompiler, 'create_static_lib',
|
Chris@87
|
113 UnixCCompiler_create_static_lib)
|