Skip to content

Instantly share code, notes, and snippets.

@bacher09
Last active May 14, 2020 21:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bacher09/beef9131ceece01c6980908a5ca5a560 to your computer and use it in GitHub Desktop.
Save bacher09/beef9131ceece01c6980908a5ca5a560 to your computer and use it in GitHub Desktop.
cmake for CO-RE
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