xref: /linux-6.15/tools/perf/util/setup.py (revision ba3b0861)
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")
6*ba3b0861SIan Rogersassert cc, "Environment variable CC not set"
709e6f9f9SArnaldo Carvalho de Melo
809e6f9f9SArnaldo Carvalho de Melo# Check if CC has options, as is the case in yocto, where it uses CC="cc --sysroot..."
909e6f9f9SArnaldo Carvalho de Melocc_tokens = cc.split()
1009e6f9f9SArnaldo Carvalho de Meloif len(cc_tokens) > 1:
1109e6f9f9SArnaldo Carvalho de Melo    cc = cc_tokens[0]
1209e6f9f9SArnaldo Carvalho de Melo    cc_options = " ".join([str(e) for e in cc_tokens[1:]]) + " "
1309e6f9f9SArnaldo Carvalho de Meloelse:
1409e6f9f9SArnaldo Carvalho de Melo    cc_options = ""
1509e6f9f9SArnaldo Carvalho de Melo
16*ba3b0861SIan Rogers# ignore optional stderr could be None as it is set to PIPE to avoid that.
17*ba3b0861SIan Rogers# mypy: disable-error-code="union-attr"
1809e6f9f9SArnaldo Carvalho de Melocc_is_clang = b"clang version" in Popen([cc, "-v"], stderr=PIPE).stderr.readline()
19*ba3b0861SIan Rogers
20*ba3b0861SIan Rogerssrctree = getenv('srctree')
21*ba3b0861SIan Rogersassert srctree, "Environment variable srctree, for the Linux sources, not set"
22*ba3b0861SIan Rogerssrc_feature_tests  = f'{srctree}/tools/build/feature'
23a7ffd416SIlie Halip
24a7ffd416SIlie Halipdef clang_has_option(option):
2509e6f9f9SArnaldo Carvalho de Melo    cc_output = Popen([cc, cc_options + option, path.join(src_feature_tests, "test-hello.c") ], stderr=PIPE).stderr.readlines()
26b8116230SArnaldo 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))] == [ ]
27a7ffd416SIlie Halip
28a7ffd416SIlie Halipif cc_is_clang:
29ee87a084SIan Rogers    from sysconfig import get_config_vars
308b2f245fSEduardo Habkost    vars = get_config_vars()
318b2f245fSEduardo Habkost    for var in ('CFLAGS', 'OPT'):
328b2f245fSEduardo Habkost        vars[var] = sub("-specs=[^ ]+", "", vars[var])
335508672dSArnaldo Carvalho de Melo        if not clang_has_option("-mcet"):
348b2f245fSEduardo Habkost            vars[var] = sub("-mcet", "", vars[var])
355508672dSArnaldo Carvalho de Melo        if not clang_has_option("-fcf-protection"):
368b2f245fSEduardo Habkost            vars[var] = sub("-fcf-protection", "", vars[var])
37a5dcc4caSArnaldo Carvalho de Melo        if not clang_has_option("-fstack-clash-protection"):
38a5dcc4caSArnaldo Carvalho de Melo            vars[var] = sub("-fstack-clash-protection", "", vars[var])
397952fa3bSArnaldo Carvalho de Melo        if not clang_has_option("-fstack-protector-strong"):
407952fa3bSArnaldo Carvalho de Melo            vars[var] = sub("-fstack-protector-strong", "", vars[var])
419a00df31SArnaldo Carvalho de Melo        if not clang_has_option("-fno-semantic-interposition"):
429a00df31SArnaldo Carvalho de Melo            vars[var] = sub("-fno-semantic-interposition", "", vars[var])
433a8a0475SArnaldo Carvalho de Melo        if not clang_has_option("-ffat-lto-objects"):
443a8a0475SArnaldo Carvalho de Melo            vars[var] = sub("-ffat-lto-objects", "", vars[var])
45190c6854SArnaldo Carvalho de Melo        if not clang_has_option("-ftree-loop-distribute-patterns"):
46190c6854SArnaldo Carvalho de Melo            vars[var] = sub("-ftree-loop-distribute-patterns", "", vars[var])
47190c6854SArnaldo Carvalho de Melo        if not clang_has_option("-gno-variable-location-views"):
48190c6854SArnaldo Carvalho de Melo            vars[var] = sub("-gno-variable-location-views", "", vars[var])
494be92cf0SArnaldo Carvalho de Melo
50ee87a084SIan Rogersfrom setuptools import setup, Extension
514be92cf0SArnaldo Carvalho de Melo
52ee87a084SIan Rogersfrom setuptools.command.build_ext   import build_ext   as _build_ext
53ee87a084SIan Rogersfrom setuptools.command.install_lib import install_lib as _install_lib
549941c96aSJiri Olsa
559941c96aSJiri Olsaclass build_ext(_build_ext):
569941c96aSJiri Olsa    def finalize_options(self):
579941c96aSJiri Olsa        _build_ext.finalize_options(self)
589941c96aSJiri Olsa        self.build_lib  = build_lib
599941c96aSJiri Olsa        self.build_temp = build_tmp
609941c96aSJiri Olsa
619941c96aSJiri Olsaclass install_lib(_install_lib):
629941c96aSJiri Olsa    def finalize_options(self):
639941c96aSJiri Olsa        _install_lib.finalize_options(self)
649941c96aSJiri Olsa        self.build_dir = build_lib
659941c96aSJiri Olsa
669941c96aSJiri Olsa
679c12cf95SJiri Olsacflags = getenv('CFLAGS', '').split()
689c12cf95SJiri Olsa# switch off several checks (need to be at the end of cflags list)
699dabf400SIan Rogerscflags += ['-fno-strict-aliasing', '-Wno-write-strings', '-Wno-unused-parameter', '-Wno-redundant-decls' ]
7041d0914dSArnaldo Carvalho de Meloif cc_is_clang:
7141d0914dSArnaldo Carvalho de Melo    cflags += ["-Wno-unused-command-line-argument" ]
7200dc5146SArnaldo Carvalho de Melo    if clang_has_option("-Wno-cast-function-type-mismatch"):
7300dc5146SArnaldo Carvalho de Melo        cflags += ["-Wno-cast-function-type-mismatch" ]
7441d0914dSArnaldo Carvalho de Meloelse:
75b7a313d8SJiri Olsa    cflags += ['-Wno-cast-function-type' ]
76877108e4SArnaldo Carvalho de Melo
77a7789d3fSArnaldo Carvalho de Melo# The python headers have mixed code with declarations (decls after asserts, for instance)
78a7789d3fSArnaldo Carvalho de Melocflags += [ "-Wno-declaration-after-statement" ]
79a7789d3fSArnaldo Carvalho de Melo
80*ba3b0861SIan Rogerssrc_perf  = f'{srctree}/tools/perf'
819941c96aSJiri Olsabuild_lib = getenv('PYTHON_EXTBUILD_LIB')
829941c96aSJiri Olsabuild_tmp = getenv('PYTHON_EXTBUILD_TMP')
83c44a8b44SAlexey Budankov
84877108e4SArnaldo Carvalho de Meloperf = Extension('perf',
859dabf400SIan Rogers                 sources = [ src_perf + '/util/python.c' ],
86f6bbc1daSArnaldo Carvalho de Melo		         include_dirs = ['util/include'],
871b7155f7SRobert Richter		         extra_compile_args = cflags,
881b7155f7SRobert Richter                 )
89877108e4SArnaldo Carvalho de Melo
90877108e4SArnaldo Carvalho de Melosetup(name='perf',
91877108e4SArnaldo Carvalho de Melo      version='0.1',
92877108e4SArnaldo Carvalho de Melo      description='Interface with the Linux profiling infrastructure',
93877108e4SArnaldo Carvalho de Melo      author='Arnaldo Carvalho de Melo',
94877108e4SArnaldo Carvalho de Melo      author_email='[email protected]',
95877108e4SArnaldo Carvalho de Melo      license='GPLv2',
96877108e4SArnaldo Carvalho de Melo      url='http://perf.wiki.kernel.org',
979941c96aSJiri Olsa      ext_modules=[perf],
989941c96aSJiri Olsa      cmdclass={'build_ext': build_ext, 'install_lib': install_lib})
99