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