Skip to content

Commit 9e7a687

Browse files
author
weipeng
committed
examples/c: Add support for cross compiling.
Signed-off-by: weipeng <[email protected]>
1 parent 7cab3cd commit 9e7a687

File tree

2 files changed

+62
-20
lines changed

2 files changed

+62
-20
lines changed

examples/c/CMakeLists.txt

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ ExternalProject_Add(libbpf
1313
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../libbpf/src
1414
CONFIGURE_COMMAND ""
1515
BUILD_COMMAND make
16+
CC=${CMAKE_C_COMPILER}
1617
BUILD_STATIC_ONLY=1
1718
OBJDIR=${CMAKE_CURRENT_BINARY_DIR}/libbpf/libbpf
1819
DESTDIR=${CMAKE_CURRENT_BINARY_DIR}/libbpf
@@ -38,15 +39,53 @@ ExternalProject_Add(bpftool
3839

3940
find_program(CARGO_EXISTS cargo)
4041
if(CARGO_EXISTS)
41-
ExternalProject_Add(blazesym
42-
PREFIX blazesym
43-
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../blazesym
44-
CONFIGURE_COMMAND ""
45-
BUILD_COMMAND cargo build --package=blazesym-c --release
46-
BUILD_IN_SOURCE TRUE
47-
INSTALL_COMMAND ""
48-
STEP_TARGETS build
49-
)
42+
if(CMAKE_CROSSCOMPILING)
43+
# Determine target triple
44+
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
45+
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
46+
set(CARGO_TARGET "x86_64-unknown-linux-gnu")
47+
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
48+
set(CARGO_TARGET "aarch64-unknown-linux-gnu")
49+
else()
50+
message(FATAL_ERROR "Unsupported processor for Linux: ${CMAKE_SYSTEM_PROCESSOR}")
51+
endif()
52+
53+
if(CMAKE_CXX_COMPILER)
54+
set(RUST_LINKER ${CMAKE_CXX_COMPILER})
55+
else()
56+
set(RUST_LINKER ${CMAKE_C_COMPILER})
57+
endif()
58+
else()
59+
message((FATAL_ERROR "Unsupported platform: ${CMAKE_SYSTEM_NAME}"))
60+
endif()
61+
62+
set(LIBBLAZESYM_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../blazesym/target/${CARGO_TARGET}/release/libblazesym_c.a)
63+
64+
ExternalProject_Add(blazesym
65+
PREFIX blazesym
66+
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../blazesym
67+
CONFIGURE_COMMAND ""
68+
BUILD_COMMAND ${CMAKE_COMMAND} -E env
69+
RUSTFLAGS=-C\ linker=${RUST_LINKER}
70+
cargo build --package=blazesym-c --release --target=${CARGO_TARGET}
71+
BUILD_IN_SOURCE TRUE
72+
INSTALL_COMMAND ""
73+
STEP_TARGETS build
74+
)
75+
else() # Host
76+
set(LIBBLAZESYM_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../blazesym/target/release/libblazesym_c.a)
77+
78+
ExternalProject_Add(blazesym
79+
PREFIX blazesym
80+
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../blazesym
81+
CONFIGURE_COMMAND ""
82+
BUILD_COMMAND
83+
cargo build --package=blazesym-c --release
84+
BUILD_IN_SOURCE TRUE
85+
INSTALL_COMMAND ""
86+
STEP_TARGETS build
87+
)
88+
endif()
5089
endif()
5190

5291
# Set BpfObject input parameters -- note this is usually not necessary unless
@@ -91,6 +130,7 @@ foreach(app ${apps})
91130
target_include_directories(${app_stem} PRIVATE
92131
${CMAKE_CURRENT_SOURCE_DIR}/../../blazesym/capi/include)
93132
target_link_libraries(${app_stem}
94-
${CMAKE_CURRENT_SOURCE_DIR}/../../blazesym/target/release/libblazesym_c.a -lpthread -lrt -ldl)
133+
${LIBBLAZESYM_PATH} -lpthread -lrt -ldl)
134+
add_dependencies(${app_stem} blazesym-build)
95135
endif()
96136
endforeach()

tools/cmake/FindBpfObject.cmake

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -139,18 +139,20 @@ else()
139139
endif()
140140

141141
# Get target arch
142-
execute_process(COMMAND uname -m
143-
COMMAND sed -e "s/x86_64/x86/" -e "s/aarch64/arm64/" -e "s/ppc64le/powerpc/" -e "s/mips.*/mips/" -e "s/riscv64/riscv/"
144-
OUTPUT_VARIABLE ARCH_output
145-
ERROR_VARIABLE ARCH_error
146-
RESULT_VARIABLE ARCH_result
147-
OUTPUT_STRIP_TRAILING_WHITESPACE)
148-
if(${ARCH_result} EQUAL 0)
149-
set(ARCH ${ARCH_output})
150-
message(STATUS "BPF target arch: ${ARCH}")
142+
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
143+
set(ARCH x86)
144+
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
145+
set(ARCH arm64)
146+
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64le")
147+
set(ARCH powerpc)
148+
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "mips")
149+
set(ARCH mips)
150+
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "riscv64")
151+
set(ARCH riscv)
151152
else()
152-
message(FATAL_ERROR "Failed to determine target architecture: ${ARCH_error}")
153+
set(ARCH ${CMAKE_SYSTEM_PROCESSOR})
153154
endif()
155+
message(STATUS "BPF target arch: ${ARCH}")
154156

155157
# Public macro
156158
macro(bpf_object name input)

0 commit comments

Comments
 (0)