1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
diff -ur Python-2.7.16.orig/Lib/distutils/ccompiler.py Python-2.7.16/Lib/distutils/ccompiler.py
--- Python-2.7.16.orig/Lib/distutils/ccompiler.py 2019-03-02 19:17:42.000000000 +0100
+++ Python-2.7.16/Lib/distutils/ccompiler.py 2019-03-09 16:30:09.036803900 +0100
@@ -14,7 +14,7 @@
from distutils.spawn import spawn
from distutils.file_util import move_file
from distutils.dir_util import mkpath
-from distutils.dep_util import newer_group
+from distutils.dep_util import newer_group, newer
from distutils.util import split_quoted, execute
from distutils import log
# following import is for backward compatibility
@@ -571,7 +571,9 @@
src, ext = build[obj]
except KeyError:
continue
- self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
+ if newer(src, obj):
+ # some extensions share source files so we need to avoid compiling the same source multiple times
+ self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
# Return *all* object filenames, not just the ones we just built.
return objects
diff -ur Python-2.7.16.orig/Lib/distutils/dep_util.py Python-2.7.16/Lib/distutils/dep_util.py
--- Python-2.7.16.orig/Lib/distutils/dep_util.py 2019-03-02 19:17:42.000000000 +0100
+++ Python-2.7.16/Lib/distutils/dep_util.py 2019-03-09 16:30:09.036803900 +0100
@@ -11,7 +11,7 @@
from distutils.errors import DistutilsFileError
def newer(source, target):
- """Tells if the target is newer than the source.
+ """Tells if the source is newer than the target.
Return true if 'source' exists and is more recently modified than
'target', or if 'source' exists and 'target' doesn't.
diff -ur Python-2.7.16.orig/Makefile.pre.in Python-2.7.16/Makefile.pre.in
--- Python-2.7.16.orig/Makefile.pre.in 2019-03-09 16:29:29.004188933 +0100
+++ Python-2.7.16/Makefile.pre.in 2019-03-09 16:33:30.788823762 +0100
@@ -209,9 +209,9 @@
TCLTK_LIBS= @TCLTK_LIBS@
# The task to run while instrument when building the profile-opt target
-# We exclude unittests with -x that take a rediculious amount of time to
-# run in the instrumented training build or do not provide much value.
-PROFILE_TASK=-m test.regrtest --pgo -x test_asyncore test_gdb test_multiprocessing test_subprocess
+# We exclude unittests with -x that take a ridiculous amount of time to
+# run in the instrumented training build or do not provide much value
+PROFILE_TASK=-m test.regrtest --pgo $(EXTRATESTOPTS) -x test_asyncore test_gdb test_multiprocessing test_subprocess test_xpickle
# report files for gcov / lcov coverage report
COVERAGE_INFO= $(abs_builddir)/coverage.info
@@ -437,7 +437,7 @@
run_profile_task:
: # FIXME: can't run for a cross build
- $(LLVM_PROF_FILE) $(RUNSHARED) ./$(BUILDPYTHON) $(PROFILE_TASK) || true
+ $(LLVM_PROF_FILE) _PYTHONNOSITEPACKAGES=1 $(RUNSHARED) ./$(BUILDPYTHON) -E $(PROFILE_TASK) || true # allow failures here
build_all_merge_profile:
$(LLVM_PROF_MERGER)
diff -ur Python-2.7.16.orig/setup.py Python-2.7.16/setup.py
--- Python-2.7.16.orig/setup.py 2019-03-09 16:29:29.028188103 +0100
+++ Python-2.7.16/setup.py 2019-03-09 16:30:09.037803866 +0100
@@ -269,11 +269,13 @@
# those environment variables passed into the setup.py phase. Here's
# a small set of useful ones.
compiler = os.environ.get('CC')
+ # it's important to get CFLAGS from the environment for proper extension PGO support
+ cflags = os.environ.get('CFLAGS', sysconfig.get_config_vars('CFLAGS')[0])
args = {}
# unfortunately, distutils doesn't let us provide separate C and C++
# compilers
if compiler is not None:
- (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
+ (ccshared,) = sysconfig.get_config_vars('CCSHARED')
args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
self.compiler.set_executables(**args)
|