1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
From c1737d4ab6ab263932caa9e3ac170ebe3e28d404 Mon Sep 17 00:00:00 2001
From: Dominique Martinet <asmadeus@codewreck.org>
Date: Fri, 14 Jun 2024 21:56:46 +0900
Subject: [PATCH] clang_parser system_include_paths: allow overriding at
compile time
While bpftrace depends on libclang it can be installed without a clang
frontend, so some distributions might want to make these paths fixed as
they are unlikely to change.
In particular, this is necessary to include system libraries as used by
older versions of tcpaccept.bt (they now no longer require these since
#3152, but that illustrate this was a recurring problem)
(cherry picked from commit 5bf5f86313600b16c8c23e03b31337941cbefdd0)
---
CMakeLists.txt | 2 ++
src/CMakeLists.txt | 4 +++-
src/clang_parser.cpp | 19 +++++++++++++++----
3 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index cd620d0e56e5..ade33c503efb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -21,6 +21,8 @@ set(VENDOR_GTEST OFF CACHE BOOL "Clone gtest from github")
set(BUILD_FUZZ OFF CACHE BOOL "Build bpftrace for fuzzing")
set(USE_LIBFUZZER OFF CACHE BOOL "Use libfuzzer for fuzzing")
set(FUZZ_TARGET "codegen" CACHE STRING "Fuzzing target")
+set(KERNEL_HEADERS_DIR "" CACHE PATH "Hard-code kernel headers directory")
+set(SYSTEM_INCLUDE_PATHS "auto" CACHE STRING "Hard-code system include paths (colon separated, the default value \"auto\" queries clang at runtime)")
set(ENABLE_SKB_OUTPUT ON CACHE BOOL "Enable skb_output, will include libpcap")
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 88f5928c8a75..eadb11207052 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -88,11 +88,13 @@ endif()
# compile definitions
-set(KERNEL_HEADERS_DIR "" CACHE PATH "Hard-code kernel headers directory")
if (KERNEL_HEADERS_DIR)
MESSAGE(STATUS "Using KERNEL_HEADERS_DIR=${KERNEL_HEADERS_DIR}")
target_compile_definitions(runtime PUBLIC KERNEL_HEADERS_DIR="${KERNEL_HEADERS_DIR}")
endif()
+if (NOT SYSTEM_INCLUDE_PATHS EQUAL "auto")
+ MESSAGE(STATUS "Using SYSTEM_INCLUDE_PATHS=${SYSTEM_INCLUDE_PATHS}")
+endif()
execute_process(
COMMAND git describe --abbrev=4 --dirty --tags
diff --git a/src/clang_parser.cpp b/src/clang_parser.cpp
index 8b6689454267..9367e6692eb0 100644
--- a/src/clang_parser.cpp
+++ b/src/clang_parser.cpp
@@ -882,11 +882,9 @@ std::string ClangParser::get_arch_include_path()
return "/usr/include/" + std::string(utsname.machine) + "-linux-gnu";
}
-std::vector<std::string> ClangParser::system_include_paths()
+static void query_clang_include_dirs(std::vector<std::string> &result)
{
- std::vector<std::string> result;
- try
- {
+ try {
auto clang = "clang-" + std::to_string(LLVM_VERSION_MAJOR);
auto cmd = clang + " -Wp,-v -x c -fsyntax-only /dev/null 2>&1";
auto check = exec_system(cmd.c_str());
@@ -902,6 +900,19 @@ std::vector<std::string> ClangParser::system_include_paths()
catch (std::runtime_error &)
{ // If exec_system fails, just ignore it
}
+}
+
+std::vector<std::string> ClangParser::system_include_paths()
+{
+ std::vector<std::string> result;
+ std::istringstream lines(SYSTEM_INCLUDE_PATHS);
+ std::string line;
+ while (std::getline(lines, line, ':')) {
+ if (line == "auto")
+ query_clang_include_dirs(result);
+ else
+ result.push_back(trim(line));
+ }
if (result.empty())
result = { "/usr/local/include", "/usr/include" };
--
2.45.2
|