Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable Building Both libjbpf.a and libjbpf.so with cmake option -DJBPF_STATIC=Both #22

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 9 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions docs/integrate_lib.md
Original file line number Diff line number Diff line change
Expand Up @@ -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**)
Expand Down
8 changes: 7 additions & 1 deletion helper_build_files/build_utils.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
7 changes: 6 additions & 1 deletion helper_build_files/test_build_utils.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
1 change: 1 addition & 0 deletions jbpf_tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
3 changes: 2 additions & 1 deletion jbpf_tests/unit_tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
set(JBPF_TESTS ${JBPF_TESTS} PARENT_SCOPE)
set(JBPF_STATIC_OPTION_UPPER ${JBPF_STATIC_OPTION_UPPER} PARENT_SCOPE)
7 changes: 5 additions & 2 deletions jbpf_tests/unit_tests/bitmap/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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})
Expand Down
13 changes: 9 additions & 4 deletions pipeline/build-for-os.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ parameters:
default:
- description: "Dynamic"
id: test0
staticBuildParam: ""
staticBuildParam: "-e JBPF_STATIC=0"
sanitizerBuildParam: ""

- description: "Static"
Expand All @@ -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"
Expand All @@ -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"
Expand All @@ -52,14 +52,19 @@ parameters:

- description: "Experimental Features, Dynamic"
id: test6
staticBuildParam: ""
staticBuildParam: "-e JBPF_STATIC=0"
sanitizerBuildParam: "-e JBPF_EXPERIMENTAL_FEATURES=1"

- description: "Experimental Features, Static"
id: test7
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
Expand Down
151 changes: 87 additions & 64 deletions src/core/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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_OBJECTS:jbpf::logger_lib>
$<TARGET_OBJECTS:jbpf::io_lib>
$<TARGET_OBJECTS:jbpf::mem_mgmt_lib>
$<TARGET_OBJECTS:jbpf::lcm_ipc_lib>)

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_OBJECTS:jbpf::logger_lib>
$<TARGET_OBJECTS:jbpf::io_lib>
$<TARGET_OBJECTS:jbpf::mem_mgmt_lib>
$<TARGET_OBJECTS:jbpf::lcm_ipc_lib>)
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)
## move libjbpf_shared.so to libjbpf.so
add_custom_command(TARGET ${JBPF_LIB}_shared POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${JBPF_LIB}_shared> ${OUTPUT_DIR}/lib/lib${JBPF_LIB}.so
)
endif()