Skip to content

Commit

Permalink
[eclipse-iceoryx#210] Enable cross compilation for FFI
Browse files Browse the repository at this point in the history
  • Loading branch information
elBoberido committed Jun 13, 2024
1 parent 4517a59 commit c312b93
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 26 deletions.
24 changes: 20 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,35 @@ project(iceoryx2 VERSION ${IOX2_VERSION_STRING})
#TODO how to handle feature flags

macro(add_option)
set(ONE_VALUE_ARGS NAME DESCRIPTION VALUE)
set(ONE_VALUE_ARGS NAME DESCRIPTION DEFAULT_VALUE)
cmake_parse_arguments(ADD_OPTION "" "${ONE_VALUE_ARGS}" "" ${ARGN})

option(${ADD_OPTION_NAME} ${ADD_OPTION_DESCRIPTION} ${ADD_OPTION_VALUE})
message(STATUS " ${ADD_OPTION_NAME}: " ${${ADD_OPTION_NAME}})
option(${ADD_OPTION_NAME} ${ADD_OPTION_DESCRIPTION} ${ADD_OPTION_DEFAULT_VALUE})
message(STATUS " ${ADD_OPTION_NAME}: ${${ADD_OPTION_NAME}} (Description: ${ADD_OPTION_DESCRIPTION})")
endmacro()

macro(add_param)
set(ONE_VALUE_ARGS NAME DESCRIPTION DEFAULT_VALUE)
cmake_parse_arguments(ADD_PARAM "" "${ONE_VALUE_ARGS}" "" ${ARGN})

if(NOT ${ADD_PARAM_NAME})
set(${ADD_PARAM_NAME} ${ADD_PARAM_DEFAULT_VALUE})
endif()
message(STATUS " ${ADD_PARAM_NAME}: ${${ADD_PARAM_NAME}} (Description: ${ADD_PARAM_DESCRIPTION})")
endmacro()

message(STATUS "iceoryx2 options:")

add_option(
NAME EXAMPLES
DESCRIPTION "Build examples"
VALUE OFF
DEFAULT_VALUE OFF
)

add_param(
NAME RUST_TARGET_TRIPLET
DESCRIPTION "The target triplet for cross compilation, e.g. 'aarch64-unknown-linux-gnu'"
DEFAULT_VALUE ""
)

add_subdirectory(iceoryx2-ffi/c)
Expand Down
44 changes: 22 additions & 22 deletions iceoryx2-ffi/c/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -26,23 +26,24 @@ if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(RUST_BUILD_TYPE_FLAG "")
endif()

set(RUST_ARCH_TRIPLET "")
set(RUST_ARCH_TRIPLET_FLAG "")
# if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i486")
# set(RUST_ARCH_TRIPLET "i686-unknown-linux-gnu")
# set(RUST_ARCH_TRIPLET_FLAG "--target=${RUST_ARCH_TRIPLET}")
# elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "armv7l")
# set(RUST_ARCH_TRIPLET "armv7-unknown-linux-gnueabihf")
# set(RUST_ARCH_TRIPLET_FLAG "--target=${RUST_ARCH_TRIPLET}")
# elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64")
# set(RUST_ARCH_TRIPLET "${CMAKE_SYSTEM_PROCESSOR}-unknown-linux-gnu")
# set(RUST_ARCH_TRIPLET_FLAG "--target=${RUST_ARCH_TRIPLET}")
# endif()

set(RUST_TARGET_DIR ${CMAKE_BINARY_DIR}/rust)
set(RUST_ARCH_TARGET_DIR ${RUST_TARGET_DIR}/${RUST_ARCH_TRIPLET})

set(ICEORYX2_C_INCLUDE_DIR ${RUST_ARCH_TARGET_DIR}/${RUST_BUILD_TYPE}/iceoryx2-ffi-cbindgen/include)
if("${RUST_TARGET_TRIPLET}" STREQUAL "")
set(RUST_TARGET_DIR ${CMAKE_BINARY_DIR}/rust/native)
set(RUST_TARGET_DIR_FULL ${CMAKE_BINARY_DIR}/rust/native/${RUST_BUILD_TYPE})
set(RUST_TARGET_TRIPLET_FLAG "")
else()
set(RUST_TARGET_DIR ${CMAKE_BINARY_DIR}/rust)
set(RUST_TARGET_DIR_FULL ${CMAKE_BINARY_DIR}/rust/${RUST_TARGET_TRIPLET}/${RUST_BUILD_TYPE})
set(RUST_TARGET_TRIPLET_FLAG "--target=${RUST_TARGET_TRIPLET}")
endif()

set(ICEORYX2_C_INCLUDE_DIR ${RUST_TARGET_DIR_FULL}/iceoryx2-ffi-cbindgen/include)

message(STATUS "#### ${RUST_TARGET_TRIPLET}")
message(STATUS "#### ${RUST_TARGET_DIR}")
message(STATUS "#### ${RUST_TARGET_DIR_FULL}")
message(STATUS "#### ${RUST_TARGET_TRIPLET_FLAG}")
message(STATUS "#### ${ICEORYX2_C_INCLUDE_DIR}")


set(ICEORYX2_C_LIB iceoryx2_ffi)
set(ICEORYX2_C_STATIC_LIB_LINK_NAME lib${ICEORYX2_C_LIB}.a)
Expand All @@ -59,21 +60,21 @@ elseif(APPLE)
set(ICEORYX2_C_SHARED_LIB_LINK_NAME lib${ICEORYX2_C_LIB}.dylib)
endif()

set(ICEORYX2_C_STATIC_LIB_LINK_FILE ${RUST_ARCH_TARGET_DIR}/${RUST_BUILD_TYPE}/${ICEORYX2_C_STATIC_LIB_LINK_NAME})
set(ICEORYX2_C_SHARED_LIB_LINK_FILE ${RUST_ARCH_TARGET_DIR}/${RUST_BUILD_TYPE}/${ICEORYX2_C_SHARED_LIB_LINK_NAME})
set(ICEORYX2_C_STATIC_LIB_LINK_FILE ${RUST_TARGET_DIR_FULL}/${ICEORYX2_C_STATIC_LIB_LINK_NAME})
set(ICEORYX2_C_SHARED_LIB_LINK_FILE ${RUST_TARGET_DIR_FULL}/${ICEORYX2_C_SHARED_LIB_LINK_NAME})
set(ICEORYX2_C_SHARED_LIB_DLL_FILE) # intentionally empty; only used on Windows

list(APPEND ICEORYX2_C_LIB_ARTIFACTS ${ICEORYX2_C_STATIC_LIB_LINK_FILE})
list(APPEND ICEORYX2_C_LIB_ARTIFACTS ${ICEORYX2_C_SHARED_LIB_LINK_FILE})
if(WIN32)
set(ICEORYX2_C_SHARED_LIB_DLL_FILE ${RUST_ARCH_TARGET_DIR}/${RUST_BUILD_TYPE}/${ICEORYX2_C_LIB}.dll)
set(ICEORYX2_C_SHARED_LIB_DLL_FILE ${RUST_TARGET_DIR_FULL}${ICEORYX2_C_LIB}.dll)
list(APPEND ICEORYX2_C_LIB_ARTIFACTS ${ICEORYX2_C_SHARED_LIB_DLL_FILE})
endif()

# run cargo
add_custom_target(
iceoryx2-build-step ALL
COMMAND cargo build ${RUST_BUILD_TYPE_FLAG} --target-dir=${RUST_TARGET_DIR} ${RUST_ARCH_TRIPLET_FLAG}
COMMAND cargo build ${RUST_BUILD_TYPE_FLAG} --target-dir=${RUST_TARGET_DIR} ${RUST_TARGET_TRIPLET_FLAG}
BYPRODUCTS
${ICEORYX2_C_INCLUDE_DIR}/iox2/iceoryx2.h
${ICEORYX2_C_STATIC_LIB_LINK_FILE}
Expand Down Expand Up @@ -109,7 +110,6 @@ add_library(iceoryx2-c::static-lib ALIAS static-lib)
add_library(shared-lib INTERFACE)
add_library(iceoryx2-c::shared-lib ALIAS shared-lib)


# NOTE the solution with specifying a 'BUILD_INTERFACE' and a 'INSTALL_INTERFACE' was the only one that worked;
# alternatively an imported library could be created, e.g. 'iceoryx2_ffi' with a corresponding alias, e.g. 'iceoryx2::ffi';
# the imported lib needs to be present here and also in 'Config.cmake.in' but they need to be named differently, e.g.
Expand Down

0 comments on commit c312b93

Please sign in to comment.