| From d53c785aaaf684d0c7f5990ab874270aee00dfce Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 6 Oct 2025 17:21:24 +0100 |
| Subject: perf python: split Clang options when invoking Popen |
| |
| From: Leo Yan <leo.yan@arm.com> |
| |
| [ Upstream commit c6a43bc3e8f6102a47da0d2e53428d08f00172fb ] |
| |
| When passing a list to subprocess.Popen, each element maps to one argv |
| token. Current code bundles multiple Clang flags into a single element, |
| something like: |
| |
| cmd = ['clang', |
| '--target=x86_64-linux-gnu -fintegrated-as -Wno-cast-function-type-mismatch', |
| 'test-hello.c'] |
| |
| So Clang only sees one long, invalid option instead of separate flags, |
| as a result, the script cannot capture any log via PIPE. |
| |
| Fix this by using shlex.split() to separate the string so each option |
| becomes its own argv element. The fixed list will be: |
| |
| cmd = ['clang', |
| '--target=x86_64-linux-gnu', |
| '-fintegrated-as', |
| '-Wno-cast-function-type-mismatch', |
| 'test-hello.c'] |
| |
| Fixes: 09e6f9f98370 ("perf python: Fix splitting CC into compiler and options") |
| Signed-off-by: Leo Yan <leo.yan@arm.com> |
| Reviewed-by: Ian Rogers <irogers@google.com> |
| Link: https://lore.kernel.org/r/20251006-perf_build_android_ndk-v3-2-4305590795b2@arm.com |
| Cc: Palmer Dabbelt <palmer@dabbelt.com> |
| Cc: Albert Ou <aou@eecs.berkeley.edu> |
| Cc: Alexandre Ghiti <alex@ghiti.fr> |
| Cc: Nick Desaulniers <nick.desaulniers+lkml@gmail.com> |
| Cc: Justin Stitt <justinstitt@google.com> |
| Cc: Bill Wendling <morbo@google.com> |
| Cc: Adrian Hunter <adrian.hunter@intel.com> |
| Cc: Arnaldo Carvalho de Melo <acme@kernel.org> |
| Cc: Jiri Olsa <jolsa@kernel.org> |
| Cc: Namhyung Kim <namhyung@kernel.org> |
| Cc: Nathan Chancellor <nathan@kernel.org> |
| Cc: James Clark <james.clark@linaro.org> |
| Cc: linux-riscv@lists.infradead.org |
| Cc: llvm@lists.linux.dev |
| Cc: Paul Walmsley <paul.walmsley@sifive.com> |
| Cc: linux-kernel@vger.kernel.org |
| Cc: linux-perf-users@vger.kernel.org |
| Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| tools/perf/util/setup.py | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| diff --git a/tools/perf/util/setup.py b/tools/perf/util/setup.py |
| index e837132d5031b..eecb462c021cd 100644 |
| --- a/tools/perf/util/setup.py |
| +++ b/tools/perf/util/setup.py |
| @@ -1,6 +1,7 @@ |
| from os import getenv, path |
| from subprocess import Popen, PIPE |
| from re import sub |
| +import shlex |
| |
| cc = getenv("CC") |
| |
| @@ -16,7 +17,9 @@ 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() |
| + cmd = shlex.split(f"{cc} {cc_options} {option}") |
| + cmd.append(path.join(src_feature_tests, "test-hello.c")) |
| + cc_output = Popen(cmd, stderr=PIPE).stderr.readlines() |
| 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))] == [ ] |
| |
| if cc_is_clang: |
| -- |
| 2.51.0 |
| |