Changeset View
Changeset View
Standalone View
Standalone View
cmake/modules/NativeExecutable.cmake
# Allow to easily build native executable. | # Allow to easily build native executable. | ||||
# Useful for cross compilation. | # Useful for cross compilation. | ||||
# Check if we are in a native build or not. | |||||
set(__IS_NATIVE_BUILD 0 CACHE INTERNAL "Indicate if this is a native build") | |||||
if(__IS_NATIVE_BUILD AND CMAKE_CROSSCOMPILING) | |||||
message(FATAL_ERROR "A native build cannot be cross compiled") | |||||
endif() | |||||
# If we are cross compiling, create a directory for native build. | # If we are cross compiling, create a directory for native build. | ||||
set(NATIVE_BUILD_DIR "${CMAKE_BINARY_DIR}/native" CACHE PATH "Path to the native build directory") | set(NATIVE_BUILD_DIR "${CMAKE_BINARY_DIR}/native") | ||||
set(NATIVE_BINARY_DIR "${NATIVE_BUILD_DIR}/bin" CACHE PATH "Path to the native binary directory") | set(NATIVE_BINARY_DIR "${NATIVE_BUILD_DIR}/bin") | ||||
set(NATIVE_BUILD_TARGET "${NATIVE_BUILD_DIR}/CMakeCache.txt") | set(NATIVE_BUILD_TARGET "${NATIVE_BUILD_DIR}/CMakeCache.txt") | ||||
if(CMAKE_CROSSCOMPILING AND NOT TARGET native-cmake-build) | if(NOT __IS_NATIVE_BUILD AND NOT TARGET native-cmake-build) | ||||
file(MAKE_DIRECTORY ${NATIVE_BUILD_DIR}) | file(MAKE_DIRECTORY ${NATIVE_BUILD_DIR}) | ||||
add_custom_command( | add_custom_command( | ||||
OUTPUT ${NATIVE_BUILD_TARGET} | OUTPUT ${NATIVE_BUILD_TARGET} | ||||
COMMAND ${CMAKE_COMMAND} | COMMAND ${CMAKE_COMMAND} | ||||
-G "${CMAKE_GENERATOR}" | -G "${CMAKE_GENERATOR}" | ||||
"${CMAKE_SOURCE_DIR}" | "${CMAKE_SOURCE_DIR}" | ||||
"-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}" | "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}" | ||||
"-DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${NATIVE_BINARY_DIR}" | "-DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${NATIVE_BINARY_DIR}" | ||||
# Don't require native third party dependencies we don't need. | # Don't require native third party dependencies we don't need. | ||||
"-DBUILD_BITCOIN_WALLET=OFF" | "-DBUILD_BITCOIN_WALLET=OFF" | ||||
"-DBUILD_BITCOIN_QT=OFF" | "-DBUILD_BITCOIN_QT=OFF" | ||||
"-DBUILD_BITCOIN_ZMQ=OFF" | "-DBUILD_BITCOIN_ZMQ=OFF" | ||||
"-DENABLE_QRCODE=OFF" | "-DENABLE_QRCODE=OFF" | ||||
"-DENABLE_UPNP=OFF" | "-DENABLE_UPNP=OFF" | ||||
"-D__IS_NATIVE_BUILD=1" | |||||
WORKING_DIRECTORY ${NATIVE_BUILD_DIR} | WORKING_DIRECTORY ${NATIVE_BUILD_DIR} | ||||
VERBATIM USES_TERMINAL | VERBATIM USES_TERMINAL | ||||
) | ) | ||||
add_custom_target(native-cmake-build DEPENDS ${NATIVE_BUILD_TARGET}) | add_custom_target(native-cmake-build DEPENDS ${NATIVE_BUILD_TARGET}) | ||||
endif() | endif() | ||||
macro(add_native_executable NAME) | macro(add_native_executable NAME) | ||||
if(CMAKE_CROSSCOMPILING) | if(NOT __IS_NATIVE_BUILD) | ||||
set(NATIVE_BINARY "${NATIVE_BINARY_DIR}/${NAME}") | set(NATIVE_BINARY "${NATIVE_BINARY_DIR}/${NAME}") | ||||
add_custom_target("build-native-${NAME}" | add_custom_target("build-native-${NAME}" | ||||
COMMAND ${CMAKE_COMMAND} | COMMAND ${CMAKE_COMMAND} | ||||
--build "${NATIVE_BUILD_DIR}" | --build "${NATIVE_BUILD_DIR}" | ||||
--target "${NAME}" | --target "${NAME}" | ||||
DEPENDS ${NATIVE_BUILD_TARGET} | DEPENDS ${NATIVE_BUILD_TARGET} | ||||
BYPRODUCTS ${NATIVE_BINARY} | BYPRODUCTS ${NATIVE_BINARY} | ||||
WORKING_DIRECTORY ${NATIVE_BUILD_DIR} | WORKING_DIRECTORY ${NATIVE_BUILD_DIR} | ||||
VERBATIM USES_TERMINAL | VERBATIM USES_TERMINAL | ||||
) | ) | ||||
add_executable(${NAME} IMPORTED) | add_executable(${NAME} IMPORTED) | ||||
add_dependencies(${NAME} "build-native-${NAME}") | add_dependencies(${NAME} "build-native-${NAME}") | ||||
set_property(TARGET ${NAME} PROPERTY IMPORTED_LOCATION ${NATIVE_BINARY}) | set_property(TARGET ${NAME} PROPERTY IMPORTED_LOCATION ${NATIVE_BINARY}) | ||||
else() | else() | ||||
add_executable(${NAME} EXCLUDE_FROM_ALL ${ARGN}) | add_executable(${NAME} EXCLUDE_FROM_ALL ${ARGN}) | ||||
endif(CMAKE_CROSSCOMPILING) | endif() | ||||
endmacro(add_native_executable) | endmacro(add_native_executable) | ||||
function(native_target_include_directories) | function(native_target_include_directories) | ||||
if(NOT CMAKE_CROSSCOMPILING) | if(__IS_NATIVE_BUILD) | ||||
target_include_directories(${ARGN}) | target_include_directories(${ARGN}) | ||||
endif(NOT CMAKE_CROSSCOMPILING) | endif() | ||||
endfunction(native_target_include_directories) | endfunction(native_target_include_directories) |