[RFC][PATCH] Make BPF support optional

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Non-linux systems also can make good use of these tools. This patch
adds option LIBBPF_ENABLED (default: on) so to opt-out BPF when needed.

Signed-off-by: Domenico Andreoli <domenico.andreoli@xxxxxxxxx>
---
 CMakeLists.txt |   61 +++++++++++++++++++++++++++++++++------------------------
 dwarves.c      |    2 ++
 pahole.c       |   34 ++++++++++++++++++++++++++------
 3 files changed, 65 insertions(+), 32 deletions(-)

Index: b/CMakeLists.txt
===================================================================
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,23 +2,30 @@ project(pahole C)
 cmake_minimum_required(VERSION 2.8.12)
 cmake_policy(SET CMP0005 NEW)
 
-option(LIBBPF_EMBEDDED "Use the embedded version of libbpf instead of searching it via pkg-config" ON)
-if (NOT LIBBPF_EMBEDDED)
-	find_package(PkgConfig REQUIRED)
-	if(PKGCONFIG_FOUND)
-		pkg_check_modules(LIBBPF REQUIRED libbpf>=0.4.0)
+option(LIBBPF_ENABLED "Enable BPF support" ON)
+if(LIBBPF_ENABLED)
+	option(LIBBPF_EMBEDDED "Use the embedded version of libbpf instead of searching it via pkg-config" ON)
+	if(NOT LIBBPF_EMBEDDED)
+		find_package(PkgConfig REQUIRED)
+		if(PKGCONFIG_FOUND)
+			pkg_check_modules(LIBBPF REQUIRED libbpf>=0.4.0)
+		endif()
 	endif()
+else()
+	message(STATUS "Disabled BPF support")
 endif()
 
 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}
 		    ${CMAKE_CURRENT_SOURCE_DIR})
-if(NOT LIBBPF_FOUND)
-	# Allows to use 'system' style #include with both embedded and system libbpf
-	INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/lib/include)
-	INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/lib/bpf/include/uapi)
-else()
-	INCLUDE_DIRECTORIES(${LIBBPF_INCLUDE_DIRS})
-	LINK_DIRECTORIES(${LIBBPF_LIBRARY_DIRS})
+if(LIBBPF_ENABLED)
+	if(LIBBPF_FOUND)
+		INCLUDE_DIRECTORIES(${LIBBPF_INCLUDE_DIRS})
+		LINK_DIRECTORIES(${LIBBPF_LIBRARY_DIRS})
+	else()
+		# Allows to use 'system' style #include with both embedded and system libbpf
+		INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/lib/include)
+		INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/lib/bpf/include/uapi)
+	endif()
 endif()
 
 # Try to parse this later, Helio just showed me a KDE4 example to support
@@ -79,7 +86,7 @@ if(GIT_FOUND AND EXISTS "${PROJECT_SOURC
 		endif()
 	endif()
 endif()
-if(NOT LIBBPF_FOUND AND NOT EXISTS "${PROJECT_SOURCE_DIR}/lib/bpf/src/btf.h")
+if(LIBBPF_ENABLED AND NOT LIBBPF_FOUND AND NOT EXISTS "${PROJECT_SOURCE_DIR}/lib/bpf/src/btf.h")
 	message(FATAL_ERROR "The submodules were not downloaded! GIT_SUBMODULE was turned off or failed. Please update submodules and try again.")
 endif()
 
@@ -104,21 +111,23 @@ endif()
 
 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64")
 
-if (NOT LIBBPF_FOUND)
-	file(GLOB libbpf_sources "lib/bpf/src/*.c")
-	add_library(bpf OBJECT ${libbpf_sources})
-	set_property(TARGET bpf PROPERTY POSITION_INDEPENDENT_CODE 1)
-	target_include_directories(bpf PRIVATE
-				   ${CMAKE_CURRENT_SOURCE_DIR}/lib/bpf/include
-				   ${CMAKE_CURRENT_SOURCE_DIR}/lib/bpf/include/uapi)
-endif()
+set(dwarves_LIB_SRCS dwarves.c dwarves_fprintf.c gobuffer.c ctf_loader.c libctf.c
+                     dwarf_loader.c dutil.c elf_symtab.c rbtree.c)
 
-set(dwarves_LIB_SRCS dwarves.c dwarves_fprintf.c gobuffer.c
-		     ctf_loader.c libctf.c btf_encoder.c btf_loader.c
-		     dwarf_loader.c dutil.c elf_symtab.c rbtree.c)
-if (NOT LIBBPF_FOUND)
-	list(APPEND dwarves_LIB_SRCS $<TARGET_OBJECTS:bpf>)
+if(LIBBPF_ENABLED)
+	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_BPF")
+	list(APPEND dwarves_LIB_SRCS btf_encoder.c btf_loader.c)
+	if(NOT LIBBPF_FOUND)
+		file(GLOB libbpf_sources "lib/bpf/src/*.c")
+		add_library(bpf OBJECT ${libbpf_sources})
+		set_property(TARGET bpf PROPERTY POSITION_INDEPENDENT_CODE 1)
+		target_include_directories(bpf PRIVATE
+					   ${CMAKE_CURRENT_SOURCE_DIR}/lib/bpf/include
+					   ${CMAKE_CURRENT_SOURCE_DIR}/lib/bpf/include/uapi)
+		list(APPEND dwarves_LIB_SRCS $<TARGET_OBJECTS:bpf>)
+	endif()
 endif()
+
 add_library(dwarves ${dwarves_LIB_SRCS})
 set_target_properties(dwarves PROPERTIES VERSION 1.0.0 SOVERSION 1)
 set_target_properties(dwarves PROPERTIES INTERFACE_LINK_LIBRARIES "")
Index: b/pahole.c
===================================================================
--- a/pahole.c
+++ b/pahole.c
@@ -19,26 +19,32 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+
+#ifdef HAVE_BPF
 #include <bpf/btf.h>
 #include "bpf/libbpf.h"
+#include "btf_encoder.h"
+#endif
 
 #include "dwarves_reorganize.h"
 #include "dwarves.h"
 #include "dutil.h"
 //#include "ctf_encoder.h" FIXME: disabled, probably its better to move to Oracle's libctf
-#include "btf_encoder.h"
 
+static bool btf_encode;
+static bool ctf_encode;
+#ifdef HAVE_BPF
 static struct btf_encoder *btf_encoder;
 static char *detached_btf_filename;
-static bool btf_encode;
 static bool btf_gen_floats;
-static bool ctf_encode;
-static bool sort_output;
-static bool need_resort;
-static bool first_obj_only;
 static bool skip_encoding_btf_vars;
 static bool btf_encode_force;
 static const char *base_btf_file;
+#endif
+
+static bool sort_output;
+static bool need_resort;
+static bool first_obj_only;
 
 static const char *prettify_input_filename;
 static FILE *prettify_input;
@@ -1533,6 +1539,7 @@ static error_t pahole__options_parser(in
 		  fputs("pahole: Multithreading requires elfutils >= 0.178. Continuing with a single thread...\n", stderr);
 #endif
 							break;
+#ifdef HAVE_BPF
 	case ARGP_btf_encode_detached:
 		  detached_btf_filename = arg; // fallthru
 	case 'J': btf_encode = 1;
@@ -1544,6 +1551,7 @@ static error_t pahole__options_parser(in
 		  conf_load.ignore_labels	     = true;
 		  conf_load.use_obstack		     = true;
 		  no_bitfield_type_recode = true;	break;
+#endif
 	case 'l': conf.show_first_biggest_size_base_type_member = 1;	break;
 	case 'M': conf.show_only_data_members = 1;	break;
 	case 'm': stats_formatter = nr_methods_formatter; break;
@@ -1617,21 +1625,25 @@ static error_t pahole__options_parser(in
 		conf.range = arg;			break;
 	case ARGP_header_type:
 		conf.header_type = arg;			break;
+#ifdef HAVE_BPF
 	case ARGP_skip_encoding_btf_vars:
 		skip_encoding_btf_vars = true;		break;
 	case ARGP_btf_encode_force:
 		btf_encode_force = true;		break;
 	case ARGP_btf_base:
 		base_btf_file = arg;			break;
+#endif
 	case ARGP_kabi_prefix:
 		conf_load.kabi_prefix = arg;
 		conf_load.kabi_prefix_len = strlen(arg); break;
 	case ARGP_numeric_version:
 		print_numeric_version = true;		break;
+#ifdef HAVE_BPF
 	case ARGP_btf_gen_floats:
 		btf_gen_floats = true;			break;
 	case ARGP_btf_gen_all:
 		btf_gen_floats = true;			break;
+#endif
 	case ARGP_with_flexible_array:
 		show_with_flexible_array = true;	break;
 	case ARGP_prettify_input_filename:
@@ -2792,6 +2804,7 @@ static enum load_steal_kind pahole_steal
 		cu__fprintf_ptr_table_stats_csv(cu, stderr);
 	}
 
+#ifdef HAVE_BTF
 	if (btf_encode) {
 		static pthread_mutex_t btf_lock = PTHREAD_MUTEX_INITIALIZER;
 
@@ -2820,6 +2833,7 @@ out_btf:
 		pthread_mutex_unlock(&btf_lock);
 		return ret;
 	}
+#endif
 #if 0
 	if (ctf_encode) {
 		cu__encode_ctf(cu, global_verbose);
@@ -3153,6 +3167,7 @@ int main(int argc, char *argv[])
 		}
 	}
 
+#ifdef HAVE_BPF
 	if (base_btf_file) {
 		conf_load.base_btf = btf__parse(base_btf_file, NULL);
 		if (libbpf_get_error(conf_load.base_btf)) {
@@ -3165,6 +3180,7 @@ int main(int argc, char *argv[])
 			conf_load.format_path = "btf";
 		}
 	}
+#endif
 
 	struct cus *cus = cus__new();
 	if (cus == NULL) {
@@ -3187,6 +3203,7 @@ try_sole_arg_as_class_names:
 	if (class_name && populate_class_names())
 		goto out_dwarves_exit;
 
+#ifdef HAVE_BPF
 	if (base_btf_file == NULL) {
 		const char *filename = argv[remaining];
 
@@ -3202,6 +3219,7 @@ try_sole_arg_as_class_names:
 			}
 		}
 	}
+#endif
 
 	err = cus__load_files(cus, &conf_load, argv + remaining);
 	if (err != 0) {
@@ -3261,6 +3279,7 @@ try_sole_arg_as_class_names:
 	type_instance__delete(header);
 	header = NULL;
 
+#ifdef HAVE_BTF
 	if (btf_encode) {
 		err = btf_encoder__encode(btf_encoder);
 		if (err) {
@@ -3268,6 +3287,7 @@ try_sole_arg_as_class_names:
 			goto out_cus_delete;
 		}
 	}
+#endif
 out_ok:
 	if (stats_formatter != NULL)
 		print_stats();
@@ -3277,9 +3297,11 @@ out_cus_delete:
 #ifdef DEBUG_CHECK_LEAKS
 	cus__delete(cus);
 	structures__delete();
+#ifdef HAVE_BTF
 	btf__free(conf_load.base_btf);
 	conf_load.base_btf = NULL;
 #endif
+#endif
 out_dwarves_exit:
 	if (prettify_input && prettify_input != stdin) {
 		fclose(prettify_input);
Index: b/dwarves.c
===================================================================
--- a/dwarves.c
+++ b/dwarves.c
@@ -1979,8 +1979,10 @@ extern struct debug_fmt_ops dwarf__ops,
 
 static struct debug_fmt_ops *debug_fmt_table[] = {
 	&dwarf__ops,
+#ifdef HAVE_BPF
 	&btf__ops,
 	&ctf__ops,
+#endif
 	NULL,
 };
 
-- 
rsa4096: 3B10 0CA1 8674 ACBA B4FE  FCD2 CE5B CF17 9960 DE13
ed25519: FFB4 0CC3 7F2E 091D F7DA  356E CC79 2832 ED38 CB05



[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux