Commit 4da28291 authored by Brenden Blanco's avatar Brenden Blanco

When in KERNEL_HAS_SOURCE_DIR mode, include everything

Include all of the paths in the build/ directory when kernel headers are
split.
Signed-off-by: default avatarBrenden Blanco <bblanco@plumgrid.com>
parent 3e2f9d9d
...@@ -22,7 +22,7 @@ namespace ebpf { ...@@ -22,7 +22,7 @@ namespace ebpf {
using std::string; using std::string;
using std::vector; using std::vector;
KBuildHelper::KBuildHelper() { KBuildHelper::KBuildHelper(const std::string &kdir) : kdir_(kdir) {
} }
// read the flags from cache or learn // read the flags from cache or learn
...@@ -58,6 +58,19 @@ int KBuildHelper::get_flags(const char *uname_machine, vector<string> *cflags) { ...@@ -58,6 +58,19 @@ int KBuildHelper::get_flags(const char *uname_machine, vector<string> *cflags) {
cflags->push_back("-nostdinc"); cflags->push_back("-nostdinc");
cflags->push_back("-isystem"); cflags->push_back("-isystem");
cflags->push_back("/virtual/lib/clang/include"); cflags->push_back("/virtual/lib/clang/include");
// some module build directories split headers between source/ and build/
if (KERNEL_HAS_SOURCE_DIR) {
cflags->push_back("-I" + kdir_ + "/build/arch/"+arch+"/include");
cflags->push_back("-I" + kdir_ + "/build/arch/"+arch+"/include/generated/uapi");
cflags->push_back("-I" + kdir_ + "/build/arch/"+arch+"/include/generated");
cflags->push_back("-I" + kdir_ + "/build/include");
cflags->push_back("-I" + kdir_ + "/build/./arch/"+arch+"/include/uapi");
cflags->push_back("-I" + kdir_ + "/build/arch/"+arch+"/include/generated/uapi");
cflags->push_back("-I" + kdir_ + "/build/include/uapi");
cflags->push_back("-I" + kdir_ + "/build/include/generated/uapi");
}
cflags->push_back("-I./arch/"+arch+"/include"); cflags->push_back("-I./arch/"+arch+"/include");
cflags->push_back("-Iarch/"+arch+"/include/generated/uapi"); cflags->push_back("-Iarch/"+arch+"/include/generated/uapi");
cflags->push_back("-Iarch/"+arch+"/include/generated"); cflags->push_back("-Iarch/"+arch+"/include/generated");
...@@ -71,6 +84,7 @@ int KBuildHelper::get_flags(const char *uname_machine, vector<string> *cflags) { ...@@ -71,6 +84,7 @@ int KBuildHelper::get_flags(const char *uname_machine, vector<string> *cflags) {
cflags->push_back("-D__KERNEL__"); cflags->push_back("-D__KERNEL__");
cflags->push_back("-Wno-unused-value"); cflags->push_back("-Wno-unused-value");
cflags->push_back("-Wno-pointer-sign"); cflags->push_back("-Wno-pointer-sign");
return 0; return 0;
} }
......
...@@ -33,13 +33,13 @@ typedef std::unique_ptr<FILE, FileDeleter> FILEPtr; ...@@ -33,13 +33,13 @@ typedef std::unique_ptr<FILE, FileDeleter> FILEPtr;
// Helper with pushd/popd semantics // Helper with pushd/popd semantics
class DirStack { class DirStack {
public: public:
explicit DirStack(const char *dst) : ok_(false) { explicit DirStack(const std::string &dst) : ok_(false) {
if (getcwd(cwd_, sizeof(cwd_)) == NULL) { if (getcwd(cwd_, sizeof(cwd_)) == NULL) {
::perror("getcwd"); ::perror("getcwd");
return; return;
} }
if (::chdir(dst)) { if (::chdir(dst.c_str())) {
fprintf(stderr, "chdir(%s): %s\n", dst, strerror(errno)); fprintf(stderr, "chdir(%s): %s\n", dst.c_str(), strerror(errno));
return; return;
} }
ok_ = true; ok_ = true;
...@@ -94,8 +94,10 @@ class TmpDir { ...@@ -94,8 +94,10 @@ class TmpDir {
// case we eventually support non-root user programs, cache in $HOME. // case we eventually support non-root user programs, cache in $HOME.
class KBuildHelper { class KBuildHelper {
public: public:
KBuildHelper(); explicit KBuildHelper(const std::string &kdir);
int get_flags(const char *uname_machine, std::vector<std::string> *cflags); int get_flags(const char *uname_machine, std::vector<std::string> *cflags);
private:
std::string kdir_;
}; };
} // namespace ebpf } // namespace ebpf
...@@ -82,11 +82,10 @@ int ClangLoader::parse(unique_ptr<llvm::Module> *mod, unique_ptr<vector<TableDes ...@@ -82,11 +82,10 @@ int ClangLoader::parse(unique_ptr<llvm::Module> *mod, unique_ptr<vector<TableDes
unique_ptr<llvm::MemoryBuffer> main_buf; unique_ptr<llvm::MemoryBuffer> main_buf;
struct utsname un; struct utsname un;
uname(&un); uname(&un);
char kdir[256]; string kdir = string(KERNEL_MODULES_DIR) + "/" + un.release;
snprintf(kdir, sizeof(kdir), "%s/%s/%s", KERNEL_MODULES_DIR, un.release, KERNEL_MODULES_SUFFIX);
// clang needs to run inside the kernel dir // clang needs to run inside the kernel dir
DirStack dstack(kdir); DirStack dstack(kdir + "/" + KERNEL_MODULES_SUFFIX);
if (!dstack.ok()) if (!dstack.ok())
return -1; return -1;
...@@ -106,17 +105,10 @@ int ClangLoader::parse(unique_ptr<llvm::Module> *mod, unique_ptr<vector<TableDes ...@@ -106,17 +105,10 @@ int ClangLoader::parse(unique_ptr<llvm::Module> *mod, unique_ptr<vector<TableDes
"-Wno-gnu-variable-sized-type-not-at-end", "-Wno-gnu-variable-sized-type-not-at-end",
"-x", "c", "-c", abs_file.c_str()}); "-x", "c", "-c", abs_file.c_str()});
KBuildHelper kbuild_helper; KBuildHelper kbuild_helper(kdir);
vector<string> kflags; vector<string> kflags;
if (kbuild_helper.get_flags(un.machine, &kflags)) if (kbuild_helper.get_flags(un.machine, &kflags))
return -1; return -1;
// some module build directories split headers between source/ and build/
if (KERNEL_HAS_SOURCE_DIR) {
kflags.push_back("-isystem");
kflags.push_back(string(KERNEL_MODULES_DIR "/") + un.release + "/build/include");
kflags.push_back("-isystem");
kflags.push_back(string(KERNEL_MODULES_DIR "/") + un.release + "/build/include/generated/uapi");
}
kflags.push_back("-include"); kflags.push_back("-include");
kflags.push_back("/virtual/include/bcc/helpers.h"); kflags.push_back("/virtual/include/bcc/helpers.h");
kflags.push_back("-isystem"); kflags.push_back("-isystem");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment