Last active
May 14, 2020 21:14
-
-
Save bacher09/beef9131ceece01c6980908a5ca5a560 to your computer and use it in GitHub Desktop.
cmake for CO-RE
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
cmake_minimum_required(VERSION 3.6) | |
project(CORE) | |
find_program(BASH bash HINTS /bin) | |
find_package(ZLIB) | |
if(NOT DEFINED BPFTOOL_PATH) | |
set(BPFTOOL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/bin/bpftool") | |
endif() | |
if(NOT DEFINED CLANG_PATH) | |
set(CLANG_PATH "clang") | |
endif() | |
if(NOT DEFINED LLVM_STRIP_PATH) | |
set(LLVM_STRIP_PATH "llvm-strip") | |
endif() | |
add_custom_target(core_libbpf | |
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/libbpf | |
COMMAND make -C ../src/cc/libbpf/src BUILD_STATIC_ONLY=1 | |
OBJDIR=${CMAKE_CURRENT_BINARY_DIR}/libbpf | |
DESTDIR=${CMAKE_CURRENT_BINARY_DIR} INCLUDEDIR= LIBDIR= UAPIDIR= install | |
) | |
function(generate_bpf_skel bpf_source bpf_headers bpf_object skel_output) | |
add_custom_command(OUTPUT ${bpf_object} | |
COMMAND ${CLANG_PATH} -g -O2 -target bpf -D__TARGET_ARCH_x86 | |
-I ${CMAKE_CURRENT_BINARY_DIR} | |
-c ${bpf_source} | |
-o ${bpf_object} | |
COMMAND ${LLVM_STRIP_PATH} -g ${bpf_object} | |
MAIN_DEPENDENCY ${bpf_source} | |
DEPENDS ${bpf_headers} | |
) | |
add_custom_command(OUTPUT ${skel_output} | |
COMMAND ${CMAKE_COMMAND} -E env ${BASH} -c | |
"${BPFTOOL_PATH} gen skeleton ${bpf_object} > ${skel_output}" | |
VERBATIM | |
MAIN_DEPENDENCY ${bpf_object} | |
) | |
endfunction(generate_bpf_skel) | |
function(add_core_executable) | |
set(ONE_VALUE NAME) | |
set(MULTI_VALUE SRC BPF_SRC BPF_HEADERS) | |
set(_TEMP_SKEL "") | |
cmake_parse_arguments(CORE_EXECUTABLE "" "${ONE_VALUE}" "${MULTI_VALUE}" ${ARGN}) | |
list(TRANSFORM ${CORE_EXECUTABLE_BPF_HEADERS} PREPEND ${CMAKE_CURRENT_SOURCE_DIR}) | |
foreach(bpf_src IN ITEMS ${CORE_EXECUTABLE_BPF_SRC}) | |
string(REGEX REPLACE "\.bpf\.c$" ".bpf.o" temp_bpf_object ${bpf_src}) | |
string(REGEX REPLACE "\.bpf\.c$" ".skel.h" bpf_skel ${bpf_src}) | |
set(_skel_output "${CMAKE_CURRENT_BINARY_DIR}/${bpf_skel}") | |
generate_bpf_skel( | |
"${CMAKE_CURRENT_SOURCE_DIR}/${bpf_src}" | |
"${CORE_EXECUTABLE_BPF_HEADERS}" | |
"${CMAKE_CURRENT_BINARY_DIR}/${temp_bpf_object}" | |
"${_skel_output}" | |
) | |
list(APPEND _TEMP_SKEL "${_skel_output}") | |
endforeach() | |
add_executable(${CORE_EXECUTABLE_NAME} ${CORE_EXECUTABLE_SRC} ${_TEMP_SKEL}) | |
add_dependencies(${CORE_EXECUTABLE_NAME} core_libbpf) | |
target_include_directories(${CORE_EXECUTABLE_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) | |
target_link_libraries(${CORE_EXECUTABLE_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/libbpf.a) | |
target_link_libraries(${CORE_EXECUTABLE_NAME} PRIVATE elf ZLIB::ZLIB) | |
endfunction(add_core_executable) | |
add_core_executable( | |
NAME drsnoop | |
SRC drsnoop.c drsnoop.h | |
BPF_SRC drsnoop.bpf.c | |
BPF_HEADERS drsnoop.h | |
) | |
add_core_executable( | |
NAME execsnoop | |
SRC execsnoop.c execsnoop.h | |
BPF_SRC execsnoop.bpf.c | |
BPF_HEADERS execsnoop.h | |
) | |
add_core_executable( | |
NAME opensnoop | |
SRC opensnoop.c opensnoop.h | |
BPF_SRC opensnoop.bpf.c | |
BPF_HEADERS opensnoop.h | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment