xref: /openbmc/linux/tools/perf/util/setup.py (revision fac59652993f075d57860769c99045b3ca18780d)
1dd6e1fe9SArnaldo Carvalho de Melofrom os import getenv, path
25508672dSArnaldo Carvalho de Melofrom subprocess import Popen, PIPE
35508672dSArnaldo Carvalho de Melofrom re import sub
45508672dSArnaldo Carvalho de Melo
54be92cf0SArnaldo Carvalho de Melocc = getenv("CC")
609e6f9f9SArnaldo Carvalho de Melo
709e6f9f9SArnaldo Carvalho de Melo# Check if CC has options, as is the case in yocto, where it uses CC="cc --sysroot..."
809e6f9f9SArnaldo Carvalho de Melocc_tokens = cc.split()
909e6f9f9SArnaldo Carvalho de Meloif len(cc_tokens) > 1:
1009e6f9f9SArnaldo Carvalho de Melo    cc = cc_tokens[0]
1109e6f9f9SArnaldo Carvalho de Melo    cc_options = " ".join([str(e) for e in cc_tokens[1:]]) + " "
1209e6f9f9SArnaldo Carvalho de Meloelse:
1309e6f9f9SArnaldo Carvalho de Melo    cc_options = ""
1409e6f9f9SArnaldo Carvalho de Melo
1509e6f9f9SArnaldo Carvalho de Melocc_is_clang = b"clang version" in Popen([cc, "-v"], stderr=PIPE).stderr.readline()
16dd6e1fe9SArnaldo Carvalho de Melosrc_feature_tests  = getenv('srctree') + '/tools/build/feature'
17a7ffd416SIlie Halip
18a7ffd416SIlie Halipdef clang_has_option(option):
1909e6f9f9SArnaldo Carvalho de Melo    cc_output = Popen([cc, cc_options + option, path.join(src_feature_tests, "test-hello.c") ], stderr=PIPE).stderr.readlines()
20*e334ae4aSArnaldo Carvalho de Melo    return [o for o in cc_output if ((b"unknown argument" in o) or (b"is not supported" in o) or (b"unknown warning option" in o))] == [ ]
21a7ffd416SIlie Halip
22a7ffd416SIlie Halipif cc_is_clang:
23ee87a084SIan Rogers    from sysconfig import get_config_vars
248b2f245fSEduardo Habkost    vars = get_config_vars()
258b2f245fSEduardo Habkost    for var in ('CFLAGS', 'OPT'):
268b2f245fSEduardo Habkost        vars[var] = sub("-specs=[^ ]+", "", vars[var])
275508672dSArnaldo Carvalho de Melo        if not clang_has_option("-mcet"):
288b2f245fSEduardo Habkost            vars[var] = sub("-mcet", "", vars[var])
295508672dSArnaldo Carvalho de Melo        if not clang_has_option("-fcf-protection"):
308b2f245fSEduardo Habkost            vars[var] = sub("-fcf-protection", "", vars[var])
31a5dcc4caSArnaldo Carvalho de Melo        if not clang_has_option("-fstack-clash-protection"):
32a5dcc4caSArnaldo Carvalho de Melo            vars[var] = sub("-fstack-clash-protection", "", vars[var])
337952fa3bSArnaldo Carvalho de Melo        if not clang_has_option("-fstack-protector-strong"):
347952fa3bSArnaldo Carvalho de Melo            vars[var] = sub("-fstack-protector-strong", "", vars[var])
359a00df31SArnaldo Carvalho de Melo        if not clang_has_option("-fno-semantic-interposition"):
369a00df31SArnaldo Carvalho de Melo            vars[var] = sub("-fno-semantic-interposition", "", vars[var])
373a8a0475SArnaldo Carvalho de Melo        if not clang_has_option("-ffat-lto-objects"):
383a8a0475SArnaldo Carvalho de Melo            vars[var] = sub("-ffat-lto-objects", "", vars[var])
39190c6854SArnaldo Carvalho de Melo        if not clang_has_option("-ftree-loop-distribute-patterns"):
40190c6854SArnaldo Carvalho de Melo            vars[var] = sub("-ftree-loop-distribute-patterns", "", vars[var])
41190c6854SArnaldo Carvalho de Melo        if not clang_has_option("-gno-variable-location-views"):
42190c6854SArnaldo Carvalho de Melo            vars[var] = sub("-gno-variable-location-views", "", vars[var])
434be92cf0SArnaldo Carvalho de Melo
44ee87a084SIan Rogersfrom setuptools import setup, Extension
454be92cf0SArnaldo Carvalho de Melo
46ee87a084SIan Rogersfrom setuptools.command.build_ext   import build_ext   as _build_ext
47ee87a084SIan Rogersfrom setuptools.command.install_lib import install_lib as _install_lib
489941c96aSJiri Olsa
499941c96aSJiri Olsaclass build_ext(_build_ext):
509941c96aSJiri Olsa    def finalize_options(self):
519941c96aSJiri Olsa        _build_ext.finalize_options(self)
529941c96aSJiri Olsa        self.build_lib  = build_lib
539941c96aSJiri Olsa        self.build_temp = build_tmp
549941c96aSJiri Olsa
559941c96aSJiri Olsaclass install_lib(_install_lib):
569941c96aSJiri Olsa    def finalize_options(self):
579941c96aSJiri Olsa        _install_lib.finalize_options(self)
589941c96aSJiri Olsa        self.build_dir = build_lib
599941c96aSJiri Olsa
609941c96aSJiri Olsa
619c12cf95SJiri Olsacflags = getenv('CFLAGS', '').split()
629c12cf95SJiri Olsa# switch off several checks (need to be at the end of cflags list)
63142544a9SJiri Olsacflags += ['-fno-strict-aliasing', '-Wno-write-strings', '-Wno-unused-parameter', '-Wno-redundant-decls', '-DPYTHON_PERF' ]
6441d0914dSArnaldo Carvalho de Meloif cc_is_clang:
6541d0914dSArnaldo Carvalho de Melo    cflags += ["-Wno-unused-command-line-argument" ]
66bebb4c24SArnaldo Carvalho de Melo    if clang_has_option("-Wno-cast-function-type-mismatch"):
67bebb4c24SArnaldo Carvalho de Melo        cflags += ["-Wno-cast-function-type-mismatch" ]
6841d0914dSArnaldo Carvalho de Meloelse:
69b7a313d8SJiri Olsa    cflags += ['-Wno-cast-function-type' ]
70877108e4SArnaldo Carvalho de Melo
71a7789d3fSArnaldo Carvalho de Melo# The python headers have mixed code with declarations (decls after asserts, for instance)
72a7789d3fSArnaldo Carvalho de Melocflags += [ "-Wno-declaration-after-statement" ]
73a7789d3fSArnaldo Carvalho de Melo
7467d52689SJiri Olsasrc_perf  = getenv('srctree') + '/tools/perf'
759941c96aSJiri Olsabuild_lib = getenv('PYTHON_EXTBUILD_LIB')
769941c96aSJiri Olsabuild_tmp = getenv('PYTHON_EXTBUILD_TMP')
7745bff41aSArnaldo Carvalho de Melolibtraceevent = getenv('LIBTRACEEVENT')
78285a8f24SJiri Olsalibapikfs = getenv('LIBAPI')
79a429dcb8SJiri Olsalibperf = getenv('LIBPERF')
809941c96aSJiri Olsa
8166dfdff0SJaroslav Škarvadaext_sources = [f.strip() for f in open('util/python-ext-sources')
826a5c13afSNamhyung Kim				if len(f.strip()) > 0 and f[0] != '#']
836a5c13afSNamhyung Kim
84378ef0f5SIan Rogersextra_libraries = []
85378ef0f5SIan Rogers
86378ef0f5SIan Rogersif '-DHAVE_LIBTRACEEVENT' in cflags:
87378ef0f5SIan Rogers    extra_libraries += [ 'traceevent' ]
88378ef0f5SIan Rogerselse:
89378ef0f5SIan Rogers    ext_sources.remove('util/trace-event.c')
90378ef0f5SIan Rogers
9167d52689SJiri Olsa# use full paths with source files
9266dfdff0SJaroslav Škarvadaext_sources = list(map(lambda x: '%s/%s' % (src_perf, x) , ext_sources))
9367d52689SJiri Olsa
94c44a8b44SAlexey Budankovif '-DHAVE_LIBNUMA_SUPPORT' in cflags:
95378ef0f5SIan Rogers    extra_libraries += [ 'numa' ]
96c22e150eSIgor Lubashevif '-DHAVE_LIBCAP_SUPPORT' in cflags:
97c22e150eSIgor Lubashev    extra_libraries += [ 'cap' ]
98c44a8b44SAlexey Budankov
99877108e4SArnaldo Carvalho de Meloperf = Extension('perf',
1006a5c13afSNamhyung Kim		  sources = ext_sources,
101f6bbc1daSArnaldo Carvalho de Melo		  include_dirs = ['util/include'],
102c44a8b44SAlexey Budankov		  libraries = extra_libraries,
1031b7155f7SRobert Richter		  extra_compile_args = cflags,
104a3720e96SIan Rogers		  extra_objects = [ x for x in [libtraceevent, libapikfs, libperf]
105a3720e96SIan Rogers                                    if x is not None],
1061b7155f7SRobert Richter                 )
107877108e4SArnaldo Carvalho de Melo
108877108e4SArnaldo Carvalho de Melosetup(name='perf',
109877108e4SArnaldo Carvalho de Melo      version='0.1',
110877108e4SArnaldo Carvalho de Melo      description='Interface with the Linux profiling infrastructure',
111877108e4SArnaldo Carvalho de Melo      author='Arnaldo Carvalho de Melo',
112877108e4SArnaldo Carvalho de Melo      author_email='acme@redhat.com',
113877108e4SArnaldo Carvalho de Melo      license='GPLv2',
114877108e4SArnaldo Carvalho de Melo      url='http://perf.wiki.kernel.org',
1159941c96aSJiri Olsa      ext_modules=[perf],
1169941c96aSJiri Olsa      cmdclass={'build_ext': build_ext, 'install_lib': install_lib})
117