Skip to content
4 changes: 4 additions & 0 deletions .github/workflows/docker-build-and-test-arm.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,10 @@ jobs:
test5) echo "staticBuildParam=-e JBPF_STATIC=1 -e JBPF_EXPERIMENTAL_FEATURES=1" >> "$GITHUB_ENV"; echo "sanitizerBuildParam=-e SANITIZER=1" >> "$GITHUB_ENV";;
test6) echo "staticBuildParam=" >> "$GITHUB_ENV"; echo "sanitizerBuildParam=-e JBPF_EXPERIMENTAL_FEATURES=1" >> "$GITHUB_ENV";;
test7) echo "staticBuildParam=-e JBPF_STATIC=1 -e JBPF_EXPERIMENTAL_FEATURES=1" >> "$GITHUB_ENV"; echo "sanitizerBuildParam=" >> "$GITHUB_ENV";;
test8) echo "staticBuildParam=-e JBPF_STATIC=2 -e JBPF_EXPERIMENTAL_FEATURES=1" >> "$GITHUB_ENV"; echo "sanitizerBuildParam=" >> "$GITHUB_ENV";;
test9) echo "staticBuildParam=-e JBPF_STATIC=2" >> "$GITHUB_ENV"; echo "sanitizerBuildParam=" >> "$GITHUB_ENV";;
test10) echo "staticBuildParam=-e JBPF_STATIC=2 -e JBPF_EXPERIMENTAL_FEATURES=1" >> "$GITHUB_ENV"; echo "sanitizerBuildParam=-e SANITIZER=1" >> "$GITHUB_ENV";;
test11) echo "staticBuildParam=-e JBPF_STATIC=2" >> "$GITHUB_ENV"; echo "sanitizerBuildParam=-e SANITIZER=1" >> "$GITHUB_ENV";;
esac

- name: Display Build Parameters
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/docker_build_and_test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ jobs:
test5) echo "staticBuildParam=-e JBPF_STATIC=1 -e JBPF_EXPERIMENTAL_FEATURES=1" >> "$GITHUB_ENV"; echo "sanitizerBuildParam=-e SANITIZER=1" >> "$GITHUB_ENV";;
test6) echo "staticBuildParam=" >> "$GITHUB_ENV"; echo "sanitizerBuildParam=-e JBPF_EXPERIMENTAL_FEATURES=1" >> "$GITHUB_ENV";;
test7) echo "staticBuildParam=-e JBPF_STATIC=1 -e JBPF_EXPERIMENTAL_FEATURES=1" >> "$GITHUB_ENV"; echo "sanitizerBuildParam=" >> "$GITHUB_ENV";;
test8) echo "staticBuildParam=-e JBPF_STATIC=2 -e JBPF_EXPERIMENTAL_FEATURES=1" >> "$GITHUB_ENV"; echo "sanitizerBuildParam=" >> "$GITHUB_ENV";;
test9) echo "staticBuildParam=-e JBPF_STATIC=2" >> "$GITHUB_ENV"; echo "sanitizerBuildParam=" >> "$GITHUB_ENV";;
test10) echo "staticBuildParam=-e JBPF_STATIC=2 -e JBPF_EXPERIMENTAL_FEATURES=1" >> "$GITHUB_ENV"; echo "sanitizerBuildParam=-e SANITIZER=1" >> "$GITHUB_ENV";;
test11) echo "staticBuildParam=-e JBPF_STATIC=2" >> "$GITHUB_ENV"; echo "sanitizerBuildParam=-e SANITIZER=1" >> "$GITHUB_ENV";;
esac

- name: Display Build Parameters
Expand Down
13 changes: 9 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,17 @@ 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)
option(BUILD_TESTING "Enable tests" ON)

# 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 @@ -61,9 +66,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()

# To build static library on ARM, disable out-of-line helpers for atomics
if ((JBPF_STATIC) AND (${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64"))
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, pass options using the `-e OPTION_NAME=VALUE` format. Most options use `0` for disabled and `1` for enabled; `JBPF_STATIC` also accepts `2`. Here are some available options:

* JBPF_STATIC - Build jbpf as a static library (**default: disabled**)
* JBPF_STATIC - Select which library artifacts to build: `0` builds only `libjbpf.so`, `1` builds only `libjbpf.a`, and `2` builds both (**default: `2`**).
* 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
4 changes: 4 additions & 0 deletions examples/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,8 @@ add_custom_target(examples ALL

add_dependencies(examples jbpf::core_lib)

if(TARGET jbpf_shared)
add_dependencies(examples jbpf_shared)
endif()

add_subdirectory(reverse_proxy)
8 changes: 7 additions & 1 deletion helper_build_files/build_utils.sh
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,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 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 @@ -27,3 +27,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
147 changes: 83 additions & 64 deletions src/core/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,82 +4,101 @@ 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"
)

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(${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})
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})

set_target_properties(${JBPF_LIB}
PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY "${OUTPUT_DIR}/lib"
LIBRARY_OUTPUT_DIRECTORY "${OUTPUT_DIR}/lib"
)
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_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_dependencies(${LIB_NAME} copy-common-headers)
endfunction()

add_dependencies(${JBPF_LIB} copy-common-headers)
message(STATUS "JBPF_STATIC_OPTION_UPPER: ${JBPF_STATIC_OPTION_UPPER}")

if(JBPF_STATIC_OPTION_UPPER STREQUAL "ON")
message(STATUS "Building static library i.e. lib${JBPF_LIB}.a")
create_jbpf_library(${JBPF_LIB} "static")
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")
set_target_properties(${JBPF_LIB}_shared PROPERTIES OUTPUT_NAME ${JBPF_LIB})

## add JBPF_SHARED_LIB definition to shared library
target_compile_definitions(${JBPF_LIB}_shared PRIVATE JBPF_SHARED_LIB)
endif()

add_library(jbpf::core_lib ALIAS ${JBPF_LIB})
Loading