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