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() 20dd6e1fe9SArnaldo Carvalho de Melo return [o for o in cc_output if ((b"unknown argument" in o) or (b"is not supported" 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) 63*9dabf400SIan Rogerscflags += ['-fno-strict-aliasing', '-Wno-write-strings', '-Wno-unused-parameter', '-Wno-redundant-decls' ] 6441d0914dSArnaldo Carvalho de Meloif cc_is_clang: 6541d0914dSArnaldo Carvalho de Melo cflags += ["-Wno-unused-command-line-argument" ] 6641d0914dSArnaldo Carvalho de Meloelse: 67b7a313d8SJiri Olsa cflags += ['-Wno-cast-function-type' ] 68877108e4SArnaldo Carvalho de Melo 69a7789d3fSArnaldo Carvalho de Melo# The python headers have mixed code with declarations (decls after asserts, for instance) 70a7789d3fSArnaldo Carvalho de Melocflags += [ "-Wno-declaration-after-statement" ] 71a7789d3fSArnaldo Carvalho de Melo 7267d52689SJiri Olsasrc_perf = getenv('srctree') + '/tools/perf' 739941c96aSJiri Olsabuild_lib = getenv('PYTHON_EXTBUILD_LIB') 749941c96aSJiri Olsabuild_tmp = getenv('PYTHON_EXTBUILD_TMP') 75c44a8b44SAlexey Budankov 76877108e4SArnaldo Carvalho de Meloperf = Extension('perf', 77*9dabf400SIan Rogers sources = [ src_perf + '/util/python.c' ], 78f6bbc1daSArnaldo Carvalho de Melo include_dirs = ['util/include'], 791b7155f7SRobert Richter extra_compile_args = cflags, 801b7155f7SRobert Richter ) 81877108e4SArnaldo Carvalho de Melo 82877108e4SArnaldo Carvalho de Melosetup(name='perf', 83877108e4SArnaldo Carvalho de Melo version='0.1', 84877108e4SArnaldo Carvalho de Melo description='Interface with the Linux profiling infrastructure', 85877108e4SArnaldo Carvalho de Melo author='Arnaldo Carvalho de Melo', 86877108e4SArnaldo Carvalho de Melo author_email='acme@redhat.com', 87877108e4SArnaldo Carvalho de Melo license='GPLv2', 88877108e4SArnaldo Carvalho de Melo url='http://perf.wiki.kernel.org', 899941c96aSJiri Olsa ext_modules=[perf], 909941c96aSJiri Olsa cmdclass={'build_ext': build_ext, 'install_lib': install_lib}) 91