# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause cmake_minimum_required(VERSION 3.16) project(examples C) # Tell cmake where to find BpfObject module list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../tools/cmake) # Build vendored libbpf include(ExternalProject) ExternalProject_Add(libbpf PREFIX libbpf SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../libbpf/src CONFIGURE_COMMAND "" BUILD_COMMAND make CC=${CMAKE_C_COMPILER} BUILD_STATIC_ONLY=1 OBJDIR=${CMAKE_CURRENT_BINARY_DIR}/libbpf/libbpf DESTDIR=${CMAKE_CURRENT_BINARY_DIR}/libbpf INCLUDEDIR= LIBDIR= UAPIDIR= install install_uapi_headers BUILD_IN_SOURCE TRUE INSTALL_COMMAND "" STEP_TARGETS build BUILD_BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/libbpf/libbpf.a ) ExternalProject_Add(bpftool PREFIX bpftool SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../bpftool/src CONFIGURE_COMMAND "" BUILD_COMMAND make bootstrap OUTPUT=${CMAKE_CURRENT_BINARY_DIR}/bpftool/ BUILD_IN_SOURCE TRUE INSTALL_COMMAND "" STEP_TARGETS build ) find_program(CARGO_EXISTS cargo) if(CARGO_EXISTS) if(CMAKE_CROSSCOMPILING) # Determine target triple if(CMAKE_SYSTEM_NAME MATCHES "Linux") if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") set(CARGO_TARGET "x86_64-unknown-linux-gnu") elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") set(CARGO_TARGET "aarch64-unknown-linux-gnu") else() message(FATAL_ERROR "Unsupported processor for Linux: ${CMAKE_SYSTEM_PROCESSOR}") endif() if(CMAKE_CXX_COMPILER) set(RUST_LINKER ${CMAKE_CXX_COMPILER}) else() set(RUST_LINKER ${CMAKE_C_COMPILER}) endif() else() message((FATAL_ERROR "Unsupported platform: ${CMAKE_SYSTEM_NAME}")) endif() ExternalProject_Add(blazesym PREFIX blazesym SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../blazesym CONFIGURE_COMMAND "" BUILD_COMMAND ${CMAKE_COMMAND} -E env RUSTFLAGS=-C\ linker=${RUST_LINKER} cargo build --package=blazesym-c --release --target=${CARGO_TARGET} BUILD_IN_SOURCE TRUE INSTALL_COMMAND "" STEP_TARGETS build ) else() # Host ExternalProject_Add(blazesym PREFIX blazesym SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../blazesym CONFIGURE_COMMAND "" BUILD_COMMAND cargo build --package=blazesym-c --release BUILD_IN_SOURCE TRUE INSTALL_COMMAND "" STEP_TARGETS build ) endif() endif() # Set BpfObject input parameters -- note this is usually not necessary unless # you're in a highly vendored environment (like libbpf-bootstrap) if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64") set(ARCH "x86") elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm") set(ARCH "arm") elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64") set(ARCH "arm64") elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "ppc64le") set(ARCH "powerpc") elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "mips") set(ARCH "mips") elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "riscv64") set(ARCH "riscv") elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "loongarch64") set(ARCH "loongarch") endif() set(BPFOBJECT_BPFTOOL_EXE ${CMAKE_CURRENT_BINARY_DIR}/bpftool/bootstrap/bpftool) set(BPFOBJECT_VMLINUX_H ${CMAKE_CURRENT_SOURCE_DIR}/../../vmlinux.h/include/${ARCH}/vmlinux.h) set(LIBBPF_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/libbpf) set(LIBBPF_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/libbpf/libbpf.a) find_package(BpfObject REQUIRED) # Create an executable for each application file(GLOB apps *.bpf.c) if(NOT CARGO_EXISTS) list(REMOVE_ITEM apps ${CMAKE_CURRENT_SOURCE_DIR}/profile.bpf.c) endif() foreach(app ${apps}) get_filename_component(app_stem ${app} NAME_WE) # Build object skeleton and depend skeleton on libbpf build bpf_object(${app_stem} ${app_stem}.bpf.c) add_dependencies(${app_stem}_skel libbpf bpftool) add_executable(${app_stem} ${app_stem}.c) target_link_libraries(${app_stem} ${app_stem}_skel) if(${app_stem} STREQUAL profile) target_include_directories(${app_stem} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../blazesym/capi/include) target_link_libraries(${app_stem} ${CMAKE_CURRENT_SOURCE_DIR}/../../blazesym/target/${CARGO_TARGET}/release/libblazesym_c.a -lpthread -lrt -ldl) add_dependencies(${app_stem} blazesym) endif() endforeach()