Commit | Line | Data |
---|---|---|
1b7155f7 | 1 | from os import getenv |
5508672d ACM |
2 | from subprocess import Popen, PIPE |
3 | from re import sub | |
4 | ||
a7ffd416 IH |
5 | cc = getenv("CC") |
6 | cc_is_clang = b"clang version" in Popen([cc, "-v"], stderr=PIPE).stderr.readline() | |
7 | ||
5508672d | 8 | def clang_has_option(option): |
a7ffd416 | 9 | return [o for o in Popen([cc, option], stderr=PIPE).stderr.readlines() if b"unknown argument" in o] == [ ] |
1b7155f7 | 10 | |
a7ffd416 | 11 | if cc_is_clang: |
8b2f245f EH |
12 | from distutils.sysconfig import get_config_vars |
13 | vars = get_config_vars() | |
14 | for var in ('CFLAGS', 'OPT'): | |
15 | vars[var] = sub("-specs=[^ ]+", "", vars[var]) | |
16 | if not clang_has_option("-mcet"): | |
17 | vars[var] = sub("-mcet", "", vars[var]) | |
18 | if not clang_has_option("-fcf-protection"): | |
19 | vars[var] = sub("-fcf-protection", "", vars[var]) | |
a5dcc4ca ACM |
20 | if not clang_has_option("-fstack-clash-protection"): |
21 | vars[var] = sub("-fstack-clash-protection", "", vars[var]) | |
7952fa3b ACM |
22 | if not clang_has_option("-fstack-protector-strong"): |
23 | vars[var] = sub("-fstack-protector-strong", "", vars[var]) | |
4be92cf0 ACM |
24 | |
25 | from distutils.core import setup, Extension | |
26 | ||
9941c96a JO |
27 | from distutils.command.build_ext import build_ext as _build_ext |
28 | from distutils.command.install_lib import install_lib as _install_lib | |
29 | ||
30 | class build_ext(_build_ext): | |
31 | def finalize_options(self): | |
32 | _build_ext.finalize_options(self) | |
33 | self.build_lib = build_lib | |
34 | self.build_temp = build_tmp | |
35 | ||
36 | class install_lib(_install_lib): | |
37 | def finalize_options(self): | |
38 | _install_lib.finalize_options(self) | |
39 | self.build_dir = build_lib | |
40 | ||
41 | ||
9c12cf95 JO |
42 | cflags = getenv('CFLAGS', '').split() |
43 | # switch off several checks (need to be at the end of cflags list) | |
24ef0fd0 | 44 | cflags += ['-fno-strict-aliasing', '-Wno-write-strings', '-Wno-unused-parameter', '-Wno-redundant-decls' ] |
a7ffd416 | 45 | if not cc_is_clang: |
b7a313d8 | 46 | cflags += ['-Wno-cast-function-type' ] |
877108e4 | 47 | |
67d52689 | 48 | src_perf = getenv('srctree') + '/tools/perf' |
9941c96a JO |
49 | build_lib = getenv('PYTHON_EXTBUILD_LIB') |
50 | build_tmp = getenv('PYTHON_EXTBUILD_TMP') | |
45bff41a | 51 | libtraceevent = getenv('LIBTRACEEVENT') |
285a8f24 | 52 | libapikfs = getenv('LIBAPI') |
a429dcb8 | 53 | libperf = getenv('LIBPERF') |
9941c96a | 54 | |
66dfdff0 | 55 | ext_sources = [f.strip() for f in open('util/python-ext-sources') |
6a5c13af NK |
56 | if len(f.strip()) > 0 and f[0] != '#'] |
57 | ||
67d52689 | 58 | # use full paths with source files |
66dfdff0 | 59 | ext_sources = list(map(lambda x: '%s/%s' % (src_perf, x) , ext_sources)) |
67d52689 | 60 | |
c44a8b44 AB |
61 | extra_libraries = [] |
62 | if '-DHAVE_LIBNUMA_SUPPORT' in cflags: | |
63 | extra_libraries = [ 'numa' ] | |
c22e150e IL |
64 | if '-DHAVE_LIBCAP_SUPPORT' in cflags: |
65 | extra_libraries += [ 'cap' ] | |
c44a8b44 | 66 | |
877108e4 | 67 | perf = Extension('perf', |
6a5c13af | 68 | sources = ext_sources, |
f6bbc1da | 69 | include_dirs = ['util/include'], |
c44a8b44 | 70 | libraries = extra_libraries, |
1b7155f7 | 71 | extra_compile_args = cflags, |
a429dcb8 | 72 | extra_objects = [libtraceevent, libapikfs, libperf], |
1b7155f7 | 73 | ) |
877108e4 ACM |
74 | |
75 | setup(name='perf', | |
76 | version='0.1', | |
77 | description='Interface with the Linux profiling infrastructure', | |
78 | author='Arnaldo Carvalho de Melo', | |
79 | author_email='acme@redhat.com', | |
80 | license='GPLv2', | |
81 | url='http://perf.wiki.kernel.org', | |
9941c96a JO |
82 | ext_modules=[perf], |
83 | cmdclass={'build_ext': build_ext, 'install_lib': install_lib}) |