mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 00:04:15 +08:00
9dabf40034
setup.py was building most perf sources causing setup.py to mimic the Makefile logic as well as flex/bison code to be stubbed out, due to complexity building. By using libraries fewer functions are stubbed out, the build is faster and the Makefile logic is reused which should simplify updating. The libraries are passed through LDFLAGS to avoid complexity in python. Force the -fPIC flag for libbpf.a to ensure it is suitable for linking into the perf python module. Signed-off-by: Ian Rogers <irogers@google.com> Reviewed-by: James Clark <james.clark@arm.com> Cc: Suzuki K Poulose <suzuki.poulose@arm.com> Cc: Kees Cook <keescook@chromium.org> Cc: Palmer Dabbelt <palmer@dabbelt.com> Cc: Albert Ou <aou@eecs.berkeley.edu> Cc: Nick Terrell <terrelln@fb.com> Cc: Gary Guo <gary@garyguo.net> Cc: Alex Gaynor <alex.gaynor@gmail.com> Cc: Boqun Feng <boqun.feng@gmail.com> Cc: Wedson Almeida Filho <wedsonaf@gmail.com> Cc: Ze Gao <zegao2021@gmail.com> Cc: Alice Ryhl <aliceryhl@google.com> Cc: Andrei Vagin <avagin@google.com> Cc: Yicong Yang <yangyicong@hisilicon.com> Cc: Jonathan Cameron <jonathan.cameron@huawei.com> Cc: Guo Ren <guoren@kernel.org> Cc: Miguel Ojeda <ojeda@kernel.org> Cc: Will Deacon <will@kernel.org> Cc: Mike Leach <mike.leach@linaro.org> Cc: Leo Yan <leo.yan@linux.dev> Cc: Oliver Upton <oliver.upton@linux.dev> Cc: John Garry <john.g.garry@oracle.com> Cc: Benno Lossin <benno.lossin@proton.me> Cc: Björn Roy Baron <bjorn3_gh@protonmail.com> Cc: Andreas Hindborg <a.hindborg@samsung.com> Cc: Paul Walmsley <paul.walmsley@sifive.com> Signed-off-by: Namhyung Kim <namhyung@kernel.org> Link: https://lore.kernel.org/r/20240625214117.953777-8-irogers@google.com
91 lines
3.5 KiB
Python
91 lines
3.5 KiB
Python
from os import getenv, path
|
|
from subprocess import Popen, PIPE
|
|
from re import sub
|
|
|
|
cc = getenv("CC")
|
|
|
|
# Check if CC has options, as is the case in yocto, where it uses CC="cc --sysroot..."
|
|
cc_tokens = cc.split()
|
|
if len(cc_tokens) > 1:
|
|
cc = cc_tokens[0]
|
|
cc_options = " ".join([str(e) for e in cc_tokens[1:]]) + " "
|
|
else:
|
|
cc_options = ""
|
|
|
|
cc_is_clang = b"clang version" in Popen([cc, "-v"], stderr=PIPE).stderr.readline()
|
|
src_feature_tests = getenv('srctree') + '/tools/build/feature'
|
|
|
|
def clang_has_option(option):
|
|
cc_output = Popen([cc, cc_options + option, path.join(src_feature_tests, "test-hello.c") ], stderr=PIPE).stderr.readlines()
|
|
return [o for o in cc_output if ((b"unknown argument" in o) or (b"is not supported" in o))] == [ ]
|
|
|
|
if cc_is_clang:
|
|
from sysconfig import get_config_vars
|
|
vars = get_config_vars()
|
|
for var in ('CFLAGS', 'OPT'):
|
|
vars[var] = sub("-specs=[^ ]+", "", vars[var])
|
|
if not clang_has_option("-mcet"):
|
|
vars[var] = sub("-mcet", "", vars[var])
|
|
if not clang_has_option("-fcf-protection"):
|
|
vars[var] = sub("-fcf-protection", "", vars[var])
|
|
if not clang_has_option("-fstack-clash-protection"):
|
|
vars[var] = sub("-fstack-clash-protection", "", vars[var])
|
|
if not clang_has_option("-fstack-protector-strong"):
|
|
vars[var] = sub("-fstack-protector-strong", "", vars[var])
|
|
if not clang_has_option("-fno-semantic-interposition"):
|
|
vars[var] = sub("-fno-semantic-interposition", "", vars[var])
|
|
if not clang_has_option("-ffat-lto-objects"):
|
|
vars[var] = sub("-ffat-lto-objects", "", vars[var])
|
|
if not clang_has_option("-ftree-loop-distribute-patterns"):
|
|
vars[var] = sub("-ftree-loop-distribute-patterns", "", vars[var])
|
|
if not clang_has_option("-gno-variable-location-views"):
|
|
vars[var] = sub("-gno-variable-location-views", "", vars[var])
|
|
|
|
from setuptools import setup, Extension
|
|
|
|
from setuptools.command.build_ext import build_ext as _build_ext
|
|
from setuptools.command.install_lib import install_lib as _install_lib
|
|
|
|
class build_ext(_build_ext):
|
|
def finalize_options(self):
|
|
_build_ext.finalize_options(self)
|
|
self.build_lib = build_lib
|
|
self.build_temp = build_tmp
|
|
|
|
class install_lib(_install_lib):
|
|
def finalize_options(self):
|
|
_install_lib.finalize_options(self)
|
|
self.build_dir = build_lib
|
|
|
|
|
|
cflags = getenv('CFLAGS', '').split()
|
|
# switch off several checks (need to be at the end of cflags list)
|
|
cflags += ['-fno-strict-aliasing', '-Wno-write-strings', '-Wno-unused-parameter', '-Wno-redundant-decls' ]
|
|
if cc_is_clang:
|
|
cflags += ["-Wno-unused-command-line-argument" ]
|
|
else:
|
|
cflags += ['-Wno-cast-function-type' ]
|
|
|
|
# The python headers have mixed code with declarations (decls after asserts, for instance)
|
|
cflags += [ "-Wno-declaration-after-statement" ]
|
|
|
|
src_perf = getenv('srctree') + '/tools/perf'
|
|
build_lib = getenv('PYTHON_EXTBUILD_LIB')
|
|
build_tmp = getenv('PYTHON_EXTBUILD_TMP')
|
|
|
|
perf = Extension('perf',
|
|
sources = [ src_perf + '/util/python.c' ],
|
|
include_dirs = ['util/include'],
|
|
extra_compile_args = cflags,
|
|
)
|
|
|
|
setup(name='perf',
|
|
version='0.1',
|
|
description='Interface with the Linux profiling infrastructure',
|
|
author='Arnaldo Carvalho de Melo',
|
|
author_email='acme@redhat.com',
|
|
license='GPLv2',
|
|
url='http://perf.wiki.kernel.org',
|
|
ext_modules=[perf],
|
|
cmdclass={'build_ext': build_ext, 'install_lib': install_lib})
|