diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b4b087..f092a6d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,11 +9,16 @@ option(USE_JBPF_PERF_OPT "Assume CPU affinity when running jbpf hooks and use rd option(USE_JBPF_PRINTF_HELPER "Enable printing from codelets using jbpf_printf_debug() helper function" ON) option(JBPF_THREADS_LARGE "Allow more threads to be registered by jbpf and the IO lib" OFF) option(ENABLE_POISONING "Enable ASAN poisoning. Should not be used for IPC mode tests and must be used in conjunction with ASAN" OFF) -option(JBPF_STATIC "Build jbpf as static library" OFF) option(JBPF_EXPERIMENTAL_FEATURES "Enable experimental features of jbpf" OFF) option(CLANG_FORMAT_CHECK "Enable clang-format check" OFF) option(CPP_CHECK "Enable cppcheck" OFF) +# Define the JBPF_STATIC option with three states: ON, OFF, BOTH +# Default is BOTH, which means both static and shared libraries will be built +set(JBPF_STATIC "BOTH" CACHE STRING "Build jbpf as static library: ON, OFF, or BOTH") +set_property(CACHE JBPF_STATIC PROPERTY STRINGS ON OFF BOTH) +string(TOUPPER "${JBPF_STATIC}" JBPF_STATIC_OPTION_UPPER) + set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) @@ -60,9 +65,9 @@ if(JBPF_THREADS_LARGE) add_definitions(-DJBPF_MAX_NUM_REG_THREADS=256) endif(JBPF_THREADS_LARGE) -if(NOT JBPF_STATIC) - add_definitions(-DJBPF_SHARED_LIB) -endif(NOT JBPF_STATIC) +if(JBPF_STATIC_OPTION_UPPER STREQUAL "OFF") + add_definitions(-DJBPF_SHARED_LIB) +endif() if(USE_JBPF_PERF_OPT) add_definitions(-DJBPF_PERF_OPT) diff --git a/docs/integrate_lib.md b/docs/integrate_lib.md index e887e66..30e92ad 100644 --- a/docs/integrate_lib.md +++ b/docs/integrate_lib.md @@ -36,9 +36,9 @@ sudo -E docker run -v $DEST_PATH:/jbpf_out_lib \ The `$DEST_PATH` should be set to the absolute path of the directory where you want the output to be stored. ### Available Build Options: -When building the library, you can pass various options using the -e OPTION_NAME={0,1} format. Here are some available options: +When building the library, you can pass various options using the -e OPTION_NAME={0,1} format where 0 is disabled and 1 is enabled. Here are some available options: -* JBPF_STATIC - Build jbpf as a static library (**default: disabled**) +* JBPF_STATIC - Build jbpf as a static library. By default this is set to value 2 which means to build the jbpf in both `libjbpf.so` (when set to 0) and `libjbpf.a` (when set to 1). * USE_NATIVE - Enable/disable `-march=native` compilation flag (**default: enabled**) * USE_JBPF_PERF_OPT - Performance optimizations that assume threads calling jbpf codelets are pinned to a certain core (**default: enabled**) * USE_JBPF_PRINTF_HELPER - Disable the use of the helper function jbpf_printf_debug() (**default: enabled**) diff --git a/helper_build_files/build_utils.sh b/helper_build_files/build_utils.sh index a3753db..7b3292e 100644 --- a/helper_build_files/build_utils.sh +++ b/helper_build_files/build_utils.sh @@ -22,10 +22,16 @@ get_flags() { if [[ "$JBPF_STATIC" == "1" ]]; then OUTPUT="$OUTPUT Building jbpf as a static library\n" FLAGS="$FLAGS -DJBPF_STATIC=on" - else + fi + if [[ "$JBPF_STATIC" == "0" ]]; then OUTPUT="$OUTPUT Building jbpf as a dynamic library\n" FLAGS="$FLAGS -DJBPF_STATIC=off" fi + if [[ "$JBPF_STATIC" == "2" || "$JBPF_STATIC" == "" ]]; then + OUTPUT="$OUTPUT Building jbpf as a both shared and static libraries.\n" + FLAGS="$FLAGS -DJBPF_STATIC=both" + fi + if [[ "$USE_NATIVE" == "1" || "$USE_NATIVE" == "" ]]; then OUTPUT="$OUTPUT Enabling flag -march=native\n" FLAGS="$FLAGS -DUSE_NATIVE=on" diff --git a/helper_build_files/test_build_utils.sh b/helper_build_files/test_build_utils.sh index edd69cc..3ac808a 100755 --- a/helper_build_files/test_build_utils.sh +++ b/helper_build_files/test_build_utils.sh @@ -91,8 +91,13 @@ if ! test_flags "-DJBPF_STATIC=off" "When JBPF_STATIC=0 flags should contain -DJ exit 1 fi +JBPF_STATIC=2 +if ! test_flags "-DJBPF_STATIC=both" "When JBPF_STATIC=2 flags should contain -DJBPF_STATIC=both"; then + exit 1 +fi + JBPF_STATIC= -if ! test_flags "-DJBPF_STATIC=off" "When JBPF_STATIC is unset flags should contain -DJBPF_STATIC=off"; then +if ! test_flags "-DJBPF_STATIC=both" "When JBPF_STATIC is unset flags should contain -DJBPF_STATIC=both"; then exit 1 fi diff --git a/jbpf_tests/CMakeLists.txt b/jbpf_tests/CMakeLists.txt index 96a1356..de79e7d 100644 --- a/jbpf_tests/CMakeLists.txt +++ b/jbpf_tests/CMakeLists.txt @@ -24,3 +24,4 @@ add_subdirectory(stress_tests) add_subdirectory(concurrency) set(JBPF_TESTS ${JBPF_TESTS} PARENT_SCOPE) +set(JBPF_STATIC_OPTION_UPPER ${JBPF_STATIC_OPTION_UPPER} PARENT_SCOPE) \ No newline at end of file diff --git a/jbpf_tests/unit_tests/CMakeLists.txt b/jbpf_tests/unit_tests/CMakeLists.txt index 696c860..3290258 100644 --- a/jbpf_tests/unit_tests/CMakeLists.txt +++ b/jbpf_tests/unit_tests/CMakeLists.txt @@ -8,4 +8,5 @@ add_subdirectory(io_mem) add_subdirectory(array) add_subdirectory(helper_functions) add_subdirectory(hashmap) -set(JBPF_TESTS ${JBPF_TESTS} PARENT_SCOPE) \ No newline at end of file +set(JBPF_TESTS ${JBPF_TESTS} PARENT_SCOPE) +set(JBPF_STATIC_OPTION_UPPER ${JBPF_STATIC_OPTION_UPPER} PARENT_SCOPE) \ No newline at end of file diff --git a/jbpf_tests/unit_tests/bitmap/CMakeLists.txt b/jbpf_tests/unit_tests/bitmap/CMakeLists.txt index d600cc2..2c5cb26 100644 --- a/jbpf_tests/unit_tests/bitmap/CMakeLists.txt +++ b/jbpf_tests/unit_tests/bitmap/CMakeLists.txt @@ -4,10 +4,13 @@ set(JBPF_BITMAP_TEST jbpf_bitmap_test) set(JBPF_BITMAP_TESTS_SOURCE jbpf_bitmap_test.c ${TESTS_COMMON}/jbpf_test_lib.c) add_executable(${JBPF_BITMAP_TEST} ${JBPF_BITMAP_TESTS_SOURCE}) -if(JBPF_STATIC) +set(JBPF_STATIC_OPTION_UPPER ${JBPF_STATIC_OPTION_UPPER} PARENT_SCOPE) +if(JBPF_STATIC_OPTION_UPPER STREQUAL "ON") target_link_libraries(${JBPF_BITMAP_TEST} PUBLIC jbpf::core_lib jbpf::logger_lib jbpf::mem_mgmt_lib) -else() +elseif(JBPF_STATIC_OPTION_UPPER STREQUAL "OFF") target_link_libraries(${JBPF_BITMAP_TEST} PUBLIC jbpf::core_lib) +elseif(JBPF_STATIC_OPTION_UPPER STREQUAL "BOTH") + target_link_libraries(${JBPF_BITMAP_TEST} PUBLIC jbpf::core_lib jbpf::logger_lib jbpf::mem_mgmt_lib) endif() target_include_directories(${JBPF_BITMAP_TEST} PUBLIC ${JBPF_LIB_HEADER_FILES} ${TEST_HEADER_FILES} ${JBPF_LOGGER_HEADERS}) add_test(NAME unit_tests/${JBPF_BITMAP_TEST} COMMAND ${JBPF_BITMAP_TEST}) diff --git a/pipeline/build-for-os.yaml b/pipeline/build-for-os.yaml index da7ba76..6980b9f 100644 --- a/pipeline/build-for-os.yaml +++ b/pipeline/build-for-os.yaml @@ -22,7 +22,7 @@ parameters: default: - description: "Dynamic" id: test0 - staticBuildParam: "" + staticBuildParam: "-e JBPF_STATIC=0" sanitizerBuildParam: "" - description: "Static" @@ -32,7 +32,7 @@ parameters: - description: "Dynamic with ASAN" id: test2 - staticBuildParam: "" + staticBuildParam: "-e JBPF_STATIC=0" sanitizerBuildParam: "-e SANITIZER=1" - description: "Static with ASAN" @@ -42,7 +42,7 @@ parameters: - description: "Experimental Features, Dynamic with ASAN" id: test4 - staticBuildParam: "" + staticBuildParam: "-e JBPF_STATIC=0" sanitizerBuildParam: "-e SANITIZER=1 -e JBPF_EXPERIMENTAL_FEATURES=1" - description: "Experimental Features, Static with ASAN" @@ -52,7 +52,7 @@ parameters: - description: "Experimental Features, Dynamic" id: test6 - staticBuildParam: "" + staticBuildParam: "-e JBPF_STATIC=0" sanitizerBuildParam: "-e JBPF_EXPERIMENTAL_FEATURES=1" - description: "Experimental Features, Static" @@ -60,6 +60,11 @@ parameters: staticBuildParam: "-e JBPF_STATIC=1 -e JBPF_EXPERIMENTAL_FEATURES=1" sanitizerBuildParam: "" + - description: "Both Static and Dynamic" + id: test8 + staticBuildParam: "-e JBPF_STATIC=2" + sanitizerBuildParam: "" + stages: - stage: CoverageTests displayName: CoverageTests diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 16fee41..bcae509 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -4,82 +4,105 @@ cmake_minimum_required(VERSION 3.16) project(jbpf_core) set(JBPF_LIB jbpf) - set(JBPF_LIB_DIR ${PROJECT_SOURCE_DIR}) set(JBPF_LIB_SOURCES ${JBPF_LIB_DIR}/jbpf_helper_impl.c - ${JBPF_LIB_DIR}/jbpf_bpf_array.c - ${JBPF_LIB_DIR}/jbpf_bpf_hashmap.c - ${JBPF_LIB_DIR}/jbpf_bpf_spsc_hashmap.c - ${JBPF_LIB_DIR}/jbpf.c - ${JBPF_LIB_DIR}/jbpf_hook.c - ${JBPF_LIB_DIR}/jbpf_perf.c - ${JBPF_LIB_DIR}/jbpf_lookup3.c - ${JBPF_LIB_DIR}/jbpf_memory.c - ${JBPF_LIB_DIR}/jbpf_utils.c) + ${JBPF_LIB_DIR}/jbpf_bpf_array.c + ${JBPF_LIB_DIR}/jbpf_bpf_hashmap.c + ${JBPF_LIB_DIR}/jbpf_bpf_spsc_hashmap.c + ${JBPF_LIB_DIR}/jbpf.c + ${JBPF_LIB_DIR}/jbpf_hook.c + ${JBPF_LIB_DIR}/jbpf_perf.c + ${JBPF_LIB_DIR}/jbpf_lookup3.c + ${JBPF_LIB_DIR}/jbpf_memory.c + ${JBPF_LIB_DIR}/jbpf_utils.c) set(JBPF_LIB_HEADER_FILES ${PROJECT_SOURCE_DIR} PARENT_SCOPE) +set(JBPF_STATIC_OPTION_UPPER ${JBPF_STATIC_OPTION_UPPER} PARENT_SCOPE) -if(JBPF_STATIC) - add_library(${JBPF_LIB} ${JBPF_LIB_SOURCES} ${JBPF_LIB_HEADER_FILES} - $ - $ - $ - $) - - target_link_libraries(${JBPF_LIB} libubpf - ${JBPF_CK_STATIC_LIB} - mimalloc-static - pthread - dl - rt) - -else(JBPF_STATIC) - add_library(${JBPF_LIB} SHARED ${JBPF_LIB_SOURCES} ${JBPF_LIB_HEADER_FILES}) - set_target_properties(${JBPF_LIB} PROPERTIES LINK_FLAGS "-Wl,-z,now -Wl,--version-script=${JBPF_HELPER_BUILD_FILES}/symver.map" ) - target_link_libraries(${JBPF_LIB} PUBLIC jbpf::lcm_ipc_lib +function(create_jbpf_library LIB_NAME LIBRARY_TYPE) + if(LIBRARY_TYPE STREQUAL "static") + add_library(${LIB_NAME} STATIC ${JBPF_LIB_SOURCES} ${JBPF_LIB_HEADER_FILES} + $ + $ + $ + $) + target_link_libraries(${LIB_NAME} libubpf + ${JBPF_CK_STATIC_LIB} + mimalloc-static + pthread + dl + rt) + elseif(LIBRARY_TYPE STREQUAL "shared") + add_library(${LIB_NAME} SHARED ${JBPF_LIB_SOURCES} ${JBPF_LIB_HEADER_FILES}) + target_link_libraries(${LIB_NAME} PUBLIC jbpf::lcm_ipc_lib jbpf::logger_lib jbpf::io_lib jbpf::mem_mgmt_lib - libubpf - ${JBPF_CK_STATIC_LIB} + libubpf + ${JBPF_CK_STATIC_LIB} mimalloc-static - pthread - dl + pthread + dl rt) - target_compile_options(${JBPF_LIB} PUBLIC -flto) -endif(JBPF_STATIC) -add_library(jbpf::core_lib ALIAS ${JBPF_LIB}) -target_include_directories(${JBPF_LIB} PUBLIC ${JBPF_LIB_HEADER_FILES} - ${JBPF_COMMON_HEADERS} - ${JBPF_IO_HEADER_FILES} - ${JBPF_LCM_IPC_HEADER_FILES} - ${JBPF_LOGGER_HEADERS} - ${JBPF_CK_INCLUDES}) + target_compile_options(${LIB_NAME} PUBLIC -flto) + endif() + + set_target_properties(${LIB_NAME} PROPERTIES + LINK_FLAGS "-Wl,-z,now -Wl,--version-script=${JBPF_HELPER_BUILD_FILES}/symver.map" + ARCHIVE_OUTPUT_DIRECTORY "${OUTPUT_DIR}/lib" + LIBRARY_OUTPUT_DIRECTORY "${OUTPUT_DIR}/lib" + ) + add_library(jbpf::core_lib ALIAS ${LIB_NAME}) + + target_include_directories(${LIB_NAME} PUBLIC ${JBPF_LIB_HEADER_FILES} + ${JBPF_COMMON_HEADERS} + ${JBPF_IO_HEADER_FILES} + ${JBPF_LCM_IPC_HEADER_FILES} + ${JBPF_LOGGER_HEADERS} + ${JBPF_CK_INCLUDES}) + + add_dependencies(${LIB_NAME} jbpf_libck libubpf generate_jbpf_lib_version) + add_clang_format_check(${LIB_NAME} ${JBPF_LIB_SOURCES}) + add_cppcheck(${LIB_NAME} ${JBPF_LIB_SOURCES}) + + add_custom_command(TARGET ${LIB_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIR}/inc/ + COMMAND ${CMAKE_COMMAND} -E copy ${JBPF_LIB_DIR}/jbpf.h ${OUTPUT_DIR}/inc/ + COMMAND ${CMAKE_COMMAND} -E copy ${JBPF_LIB_DIR}/jbpf_device_defs.h ${OUTPUT_DIR}/inc/ + COMMAND ${CMAKE_COMMAND} -E copy ${JBPF_LIB_DIR}/jbpf_config.h ${OUTPUT_DIR}/inc/ + COMMAND ${CMAKE_COMMAND} -E copy ${JBPF_LIB_DIR}/jbpf_hook_defs.h ${OUTPUT_DIR}/inc/ + COMMAND ${CMAKE_COMMAND} -E copy ${JBPF_LIB_DIR}/jbpf_hook.h ${OUTPUT_DIR}/inc/ + COMMAND ${CMAKE_COMMAND} -E copy ${JBPF_LIB_DIR}/jbpf_perf_ext.h ${OUTPUT_DIR}/inc/ + COMMAND ${CMAKE_COMMAND} -E copy ${JBPF_LIB_DIR}/jbpf_perf.h ${OUTPUT_DIR}/inc/ + COMMAND ${CMAKE_COMMAND} -E copy ${JBPF_LIB_DIR}/jbpf_utils.h ${OUTPUT_DIR}/inc/ + COMMAND ${CMAKE_COMMAND} -E copy ${JBPF_LIB_DIR}/jbpf_helper.h ${OUTPUT_DIR}/inc/ + COMMAND ${CMAKE_COMMAND} -E copy ${JBPF_LIB_DIR}/jbpf_helper_api_defs.h ${OUTPUT_DIR}/inc/ + COMMAND ${CMAKE_COMMAND} -E copy_directory ${JBPF_CK_INCLUDES} ${OUTPUT_DIR}/inc/ + ) + + add_dependencies(${LIB_NAME} copy-common-headers) +endfunction() -add_dependencies(${JBPF_LIB} jbpf_libck libubpf generate_jbpf_lib_version) -add_clang_format_check(${JBPF_LIB} ${JBPF_LIB_SOURCES}) -add_cppcheck(${JBPF_LIB} ${JBPF_LIB_SOURCES}) +message(STATUS "JBPF_STATIC_OPTION_UPPER: ${JBPF_STATIC_OPTION_UPPER}") -set_target_properties(${JBPF_LIB} - PROPERTIES - ARCHIVE_OUTPUT_DIRECTORY "${OUTPUT_DIR}/lib" - LIBRARY_OUTPUT_DIRECTORY "${OUTPUT_DIR}/lib" -) +if(JBPF_STATIC_OPTION_UPPER STREQUAL "ON") + message(STATUS "Building static library i.e. lib${JBPF_LIB}.a") + create_jbpf_library(${JBPF_LIB} "static") + add_library(jbpf::core_lib ALIAS ${JBPF_LIB}) +elseif(JBPF_STATIC_OPTION_UPPER STREQUAL "OFF") + message(STATUS "Building shared library i.e. lib${JBPF_LIB}.so") + create_jbpf_library(${JBPF_LIB} "shared") +elseif(JBPF_STATIC_OPTION_UPPER STREQUAL "BOTH") + message(STATUS "Building both static and shared libraries i.e. lib${JBPF_LIB}.a and lib${JBPF_LIB}.so") + create_jbpf_library(${JBPF_LIB} "static") + create_jbpf_library(${JBPF_LIB}_shared "shared") -add_custom_command(TARGET ${JBPF_LIB} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIR}/inc/ - COMMAND ${CMAKE_COMMAND} -E copy ${JBPF_LIB_DIR}/jbpf.h ${OUTPUT_DIR}/inc/ - COMMAND ${CMAKE_COMMAND} -E copy ${JBPF_LIB_DIR}/jbpf_device_defs.h ${OUTPUT_DIR}/inc/ - COMMAND ${CMAKE_COMMAND} -E copy ${JBPF_LIB_DIR}/jbpf_config.h ${OUTPUT_DIR}/inc/ - COMMAND ${CMAKE_COMMAND} -E copy ${JBPF_LIB_DIR}/jbpf_hook_defs.h ${OUTPUT_DIR}/inc/ - COMMAND ${CMAKE_COMMAND} -E copy ${JBPF_LIB_DIR}/jbpf_hook.h ${OUTPUT_DIR}/inc/ - COMMAND ${CMAKE_COMMAND} -E copy ${JBPF_LIB_DIR}/jbpf_perf_ext.h ${OUTPUT_DIR}/inc/ - COMMAND ${CMAKE_COMMAND} -E copy ${JBPF_LIB_DIR}/jbpf_perf.h ${OUTPUT_DIR}/inc/ - COMMAND ${CMAKE_COMMAND} -E copy ${JBPF_LIB_DIR}/jbpf_utils.h ${OUTPUT_DIR}/inc/ - COMMAND ${CMAKE_COMMAND} -E copy ${JBPF_LIB_DIR}/jbpf_helper.h ${OUTPUT_DIR}/inc/ - COMMAND ${CMAKE_COMMAND} -E copy ${JBPF_LIB_DIR}/jbpf_helper_api_defs.h ${OUTPUT_DIR}/inc/ - COMMAND ${CMAKE_COMMAND} -E copy_directory ${JBPF_CK_INCLUDES} ${OUTPUT_DIR}/inc/ -) + ## add JBPF_SHARED_LIB definition to shared library + target_compile_definitions(${JBPF_LIB}_shared PRIVATE JBPF_SHARED_LIB) -add_dependencies(${JBPF_LIB} copy-common-headers) \ No newline at end of file + ## move libjbpf_shared.so to libjbpf.so + add_custom_command(TARGET ${JBPF_LIB}_shared POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy $ ${OUTPUT_DIR}/lib/lib${JBPF_LIB}.so + ) +endif()