From 241063ca84811cd4bf6be1274cfd3f57413f6297 Mon Sep 17 00:00:00 2001 From: Austin Seipp Date: Fri, 3 May 2019 01:16:37 -0500 Subject: bpftrace: unstable-2018-10-27 -> 0.9 Update bpftrace to the latest pre-release, with a real version number. The most notable change now is that bpftrace can use a stable version of the 'bcc' toolchain in order to build, meaning no more hacks are needed to clone the source code and fix up the build system, etc. This simplifies things greatly and removes the old bcc-source patch. Similarly, we can remove our custom gtests patch (which disabled the build) by just passing -DBUILD_TESTING=FALSE when running cmake. This was also added upstream recently. However, something does still need to be fixed, at a cost: bpftrace requires the kernel -dev package because it wants both objects and include directories (some files are only shipped in one or the other). Therefore, we remove the dependency on linuxHeaders and instead use kernel.dev as the sole input to the build. This is both a positive and a negative: the positive is that tools work without annoying fatal errors, and that the bpf toolchain is synchronized to the linuxPackages.kernel derivation it was built against. The downside is that the .dev expression is much heavier as a dependency, so bpftrace is now closer to 700mb in closure size. (This especially hurts across kernel upgrades requiring a whole new rebuild, especially if you have existing nixos generations that won't GC, etc.) We probably want to slim this down substantially in the future (and there may be a few ways to do that), but as this will probably also touch bcc, and as a first cut of the pre-releases, this is probably fine while we work out other kinks. Signed-off-by: Austin Seipp --- pkgs/os-specific/linux/bpftrace/bcc-source.patch | 32 ---------- pkgs/os-specific/linux/bpftrace/default.nix | 70 ++++++++++----------- .../linux/bpftrace/disable-gtests.patch | 73 ---------------------- .../linux/bpftrace/fix-kernel-include-dir.patch | 22 +++++++ 4 files changed, 56 insertions(+), 141 deletions(-) delete mode 100644 pkgs/os-specific/linux/bpftrace/bcc-source.patch delete mode 100644 pkgs/os-specific/linux/bpftrace/disable-gtests.patch create mode 100644 pkgs/os-specific/linux/bpftrace/fix-kernel-include-dir.patch (limited to 'pkgs/os-specific') diff --git a/pkgs/os-specific/linux/bpftrace/bcc-source.patch b/pkgs/os-specific/linux/bpftrace/bcc-source.patch deleted file mode 100644 index a4c9947f0c3..00000000000 --- a/pkgs/os-specific/linux/bpftrace/bcc-source.patch +++ /dev/null @@ -1,32 +0,0 @@ -From fc0a5bd2ddb5827c5288ee284c1f2d834d79e432 Mon Sep 17 00:00:00 2001 -From: Rodney Lorrimar -Date: Tue, 16 Oct 2018 09:55:59 +1000 -Subject: [PATCH 1/3] Don't use ExternalProject for bcc sources - ---- - CMakeLists.txt | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index eae850a..b20fb33 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -31,6 +31,15 @@ if (OFFLINE_BUILDS) - UPDATE_DISCONNECTED 1 - BUILD_COMMAND ${CMAKE_COMMAND} --build . --target bcc-static - ) -+elseif (NIX_BUILDS) -+ include(ExternalProject) -+ ExternalProject_Add(bcc -+ DOWNLOAD_COMMAND rmdir bcc && ln -sf $ENV{bccSrc} bcc -+ STEP_TARGETS build update -+ EXCLUDE_FROM_ALL 1 -+ UPDATE_DISCONNECTED 1 -+ BUILD_COMMAND ${CMAKE_COMMAND} --build . --target bcc-static -+ ) - else() - include(ExternalProject) - ExternalProject_Add(bcc --- -2.17.1 - diff --git a/pkgs/os-specific/linux/bpftrace/default.nix b/pkgs/os-specific/linux/bpftrace/default.nix index 12773a95716..022e0300a8c 100644 --- a/pkgs/os-specific/linux/bpftrace/default.nix +++ b/pkgs/os-specific/linux/bpftrace/default.nix @@ -1,57 +1,55 @@ { stdenv, fetchFromGitHub , cmake, pkgconfig, flex, bison -, llvmPackages, kernel, linuxHeaders, elfutils, libelf, bcc +, llvmPackages, kernel, elfutils, libelf, bcc }: stdenv.mkDerivation rec { - name = "bpftrace-unstable-${version}"; - version = "2018-10-27"; + name = "bpftrace-${version}"; + version = "0.9"; src = fetchFromGitHub { - owner = "iovisor"; - repo = "bpftrace"; - rev = "c07b54f61fd7b7b49e0a254e746d6f442c5d780d"; - sha256 = "1mpcjfyay9akmpqxag2ndwpz1qsdx8ii07jh9fky4w40wi9cipyg"; + owner = "iovisor"; + repo = "bpftrace"; + rev = "refs/tags/v${version}"; + sha256 = "1kp6as3i67dnw5v3vc1cj5hmrq6c8pjpg9g38g1qcnc9i6drl1r8"; }; - # bpftrace requires an unreleased version of bcc, added to the cmake - # build as an ExternalProject. - # https://github.com/iovisor/bpftrace/issues/184 - bccSrc = fetchFromGitHub { - owner = "iovisor"; - repo = "bcc"; - rev = "afd00154865f3b2da6781cf92cecebaca4853950"; - sha256 = "0ad78smrnipr1f377i5rv6ksns7v2vq54g5badbj5ldqs4x0hygd"; - }; + enableParallelBuilding = true; - buildInputs = [ - llvmPackages.llvm llvmPackages.clang-unwrapped kernel - elfutils libelf bccSrc - ]; + buildInputs = with llvmPackages; + [ llvm clang-unwrapped + kernel elfutils libelf bcc + ]; nativeBuildInputs = [ cmake pkgconfig flex bison ] # libelf is incompatible with elfutils-libelf ++ stdenv.lib.filter (x: x != libelf) kernel.moduleBuildDependencies; - patches = [ - ./bcc-source.patch - # https://github.com/iovisor/bpftrace/issues/184 - ./disable-gtests.patch - ]; - - configurePhase = '' - mkdir build - cd build - cmake ../ \ - -DKERNEL_HEADERS_DIR=${linuxHeaders} \ - -DNIX_BUILDS:BOOL=ON \ - -DCMAKE_INSTALL_PREFIX=$out + # patch the source, *then* substitute on @NIX_KERNEL_SRC@ in the result. we could + # also in theory make this an environment variable around bpftrace, but this works + # nicely without wrappers. + patchPhase = '' + patch -p1 < ${./fix-kernel-include-dir.patch} + substituteInPlace ./src/clang_parser.cpp \ + --subst-var-by NIX_KERNEL_SRC '${kernel.dev}/lib/modules/${kernel.modDirVersion}' ''; + # tests aren't built, due to gtest shenanigans. see: + # + # https://github.com/iovisor/bpftrace/issues/161#issuecomment-453606728 + # https://github.com/iovisor/bpftrace/pull/363 + # + cmakeFlags = + [ "-DBUILD_TESTING=FALSE" + "-DLIBBCC_INCLUDE_DIRS=${bcc}/include/bcc" + ]; + + outputs = [ "out" "man" ]; + meta = with stdenv.lib; { description = "High-level tracing language for Linux eBPF"; - homepage = https://github.com/iovisor/bpftrace; - license = licenses.asl20; - maintainers = with maintainers; [ rvl ]; + homepage = https://github.com/iovisor/bpftrace; + license = licenses.asl20; + maintainers = with maintainers; [ rvl thoughtpolice ]; }; } diff --git a/pkgs/os-specific/linux/bpftrace/disable-gtests.patch b/pkgs/os-specific/linux/bpftrace/disable-gtests.patch deleted file mode 100644 index 941d85a4112..00000000000 --- a/pkgs/os-specific/linux/bpftrace/disable-gtests.patch +++ /dev/null @@ -1,73 +0,0 @@ -From 221eea24674fffb3b657b2bd0c923071b69d48a7 Mon Sep 17 00:00:00 2001 -From: Rodney Lorrimar -Date: Tue, 16 Oct 2018 09:56:47 +1000 -Subject: [PATCH 2/3] Disable tests - -Would prefer to use gtest library in the normal way rather through -ExternalProject. ---- - CMakeLists.txt | 4 ++-- - tests/CMakeLists.txt | 18 +++++++++++------- - 2 files changed, 13 insertions(+), 9 deletions(-) - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index b20fb33..7025d17 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -20,7 +20,7 @@ add_compile_options("-Wno-format-security") - #add_compile_options("-Wstrict-overflow=5") - #add_compile_options("-Wdisabled-optimization") - --enable_testing() -+# enable_testing() - - if (OFFLINE_BUILDS) - include(ExternalProject) -@@ -79,7 +79,7 @@ include_directories(${CLANG_INCLUDE_DIRS}) - add_subdirectory(src/arch) - add_subdirectory(src/ast) - add_subdirectory(src) --add_subdirectory(tests) -+# add_subdirectory(tests) - add_subdirectory(resources) - add_subdirectory(tools) - add_subdirectory(man) -diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt -index c283efa..6b5bff0 100644 ---- a/tests/CMakeLists.txt -+++ b/tests/CMakeLists.txt -@@ -45,6 +45,8 @@ if (OFFLINE_BUILDS) - EXCLUDE_FROM_ALL 1 - UPDATE_DISCONNECTED 1 - ) -+elseif (NIX_BUILDS) -+ - else() - include(ExternalProject) - ExternalProject_Add(gtest-git -@@ -54,13 +56,15 @@ else() - EXCLUDE_FROM_ALL 1 - ) - endif() --add_dependencies(bpftrace_test gtest-git-build) --ExternalProject_Get_Property(gtest-git source_dir binary_dir) --target_include_directories(bpftrace_test PUBLIC ${source_dir}/googletest/include) --target_include_directories(bpftrace_test PUBLIC ${source_dir}/googlemock/include) --target_link_libraries(bpftrace_test ${binary_dir}/googlemock/gtest/libgtest.a) --target_link_libraries(bpftrace_test ${binary_dir}/googlemock/gtest/libgtest_main.a) --target_link_libraries(bpftrace_test ${binary_dir}/googlemock/libgmock.a) -+ -+find_library(LIBGTEST "gtest") -+if(LIBGTEST) -+ set(LIBRARY_DEPENDENCIES -+ ${LIBRARY_DEPENDENCIES} -+ ${LIBGTEST} -+ ) -+endif() -+ - target_link_libraries(bpftrace_test ${CMAKE_THREAD_LIBS_INIT}) - - add_test(NAME bpftrace_test COMMAND bpftrace_test) --- -2.17.1 - diff --git a/pkgs/os-specific/linux/bpftrace/fix-kernel-include-dir.patch b/pkgs/os-specific/linux/bpftrace/fix-kernel-include-dir.patch new file mode 100644 index 00000000000..0c6ffc471ad --- /dev/null +++ b/pkgs/os-specific/linux/bpftrace/fix-kernel-include-dir.patch @@ -0,0 +1,22 @@ +commit b6172952c0150d84912fa6f09bab782dd0549f1e +Author: Austin Seipp +Date: Fri May 3 00:47:12 2019 -0500 + + src: special case nix build directories for clang + + Signed-off-by: Austin Seipp + +diff --git a/src/clang_parser.cpp b/src/clang_parser.cpp +index b1db8ff..0cfb01f 100644 +--- a/src/clang_parser.cpp ++++ b/src/clang_parser.cpp +@@ -140,6 +140,9 @@ static bool is_dir(const std::string& path) + // Both ksrc and kobj are guaranteed to be != "", if at least some trace of kernel sources was found. + static std::tuple get_kernel_dirs(const struct utsname& utsname) + { ++ // NB (aseipp): special case the kernel directory for nix ++ return { "@NIX_KERNEL_SRC@/source", "@NIX_KERNEL_SRC@/build" }; ++ + #ifdef KERNEL_HEADERS_DIR + return {KERNEL_HEADERS_DIR, KERNEL_HEADERS_DIR}; + #endif -- cgit 1.4.1