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. | ||||
if(NOT DEFINED __IS_NATIVE_BUILD) | if(NOT DEFINED __IS_NATIVE_BUILD) | ||||
# Check if we are in a native build or not. | # Check if we are in a native build or not. | ||||
set(__IS_NATIVE_BUILD 0 CACHE INTERNAL "Indicate if this is a native build") | set(__IS_NATIVE_BUILD 0 CACHE INTERNAL "Indicate if this is a native build") | ||||
endif() | endif() | ||||
if(__IS_NATIVE_BUILD AND CMAKE_CROSSCOMPILING) | if(__IS_NATIVE_BUILD AND CMAKE_CROSSCOMPILING) | ||||
message(FATAL_ERROR "A native build cannot be cross compiled") | message(FATAL_ERROR "A native build cannot be cross compiled") | ||||
endif() | endif() | ||||
# It is imperative that NATIVE_BUILD_DIR be in the cache. | # It is imperative that NATIVE_BUILD_DIR be in the cache. | ||||
set(NATIVE_BUILD_DIR "${CMAKE_BINARY_DIR}/native" CACHE PATH "The path of the native build directory") | set(NATIVE_BUILD_DIR "${CMAKE_BINARY_DIR}/native" CACHE PATH "The path of the native build directory" FORCE) | ||||
function(add_native_executable NAME) | function(add_native_executable NAME) | ||||
if(__IS_NATIVE_BUILD) | if(__IS_NATIVE_BUILD) | ||||
add_executable(${NAME} EXCLUDE_FROM_ALL ${ARGN}) | add_executable(${NAME} EXCLUDE_FROM_ALL ${ARGN}) | ||||
# Multi-configuration generators (VS, Xcode) append a per-configuration | # Multi-configuration generators (VS, Xcode) append a per-configuration | ||||
# subdirectory to the specified directory unless the | # subdirectory to the specified directory unless the | ||||
# `RUNTIME_OUTPUT_DIRECTORY` property is defined using a generator | # `RUNTIME_OUTPUT_DIRECTORY` property is defined using a generator | ||||
# expression. | # expression. | ||||
▲ Show 20 Lines • Show All 68 Lines • ▼ Show 20 Lines | if("${VAR}" STREQUAL "CMAKE_CURRENT_LIST_DIR" AND | ||||
_gen_native_cmake_target() | _gen_native_cmake_target() | ||||
endif() | endif() | ||||
endfunction(_gen_native_cmake_hook) | endfunction(_gen_native_cmake_hook) | ||||
if(NOT __IS_NATIVE_BUILD AND NOT TARGET native-cmake-build) | if(NOT __IS_NATIVE_BUILD AND NOT TARGET native-cmake-build) | ||||
# Set a hook to execute when everything is set. | # Set a hook to execute when everything is set. | ||||
variable_watch(CMAKE_CURRENT_LIST_DIR _gen_native_cmake_hook) | variable_watch(CMAKE_CURRENT_LIST_DIR _gen_native_cmake_hook) | ||||
if("${CMAKE_GENERATOR}" MATCHES "Ninja") | |||||
set(cmake_cache_dep_file DEPFILE "${NATIVE_BUILD_DIR}/CMakeFiles/CMakeCache.txt.d") | |||||
endif() | |||||
add_custom_command( | add_custom_command( | ||||
OUTPUT "${NATIVE_BUILD_DIR}/CMakeCache.txt" | OUTPUT "${NATIVE_BUILD_DIR}/CMakeCache.txt" | ||||
COMMENT "Preparing native build..." | |||||
COMMAND "${CMAKE_BINARY_DIR}/config/run_native_cmake.sh" | COMMAND "${CMAKE_BINARY_DIR}/config/run_native_cmake.sh" | ||||
DEPENDS "${CMAKE_BINARY_DIR}/config/run_native_cmake.sh" | DEPENDS "${CMAKE_BINARY_DIR}/config/run_native_cmake.sh" | ||||
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" | WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" | ||||
${cmake_cache_dep_file} | |||||
VERBATIM USES_TERMINAL | VERBATIM USES_TERMINAL | ||||
) | ) | ||||
add_custom_target(native-cmake-build DEPENDS "${NATIVE_BUILD_DIR}/CMakeCache.txt") | add_custom_target(native-cmake-build DEPENDS "${NATIVE_BUILD_DIR}/CMakeCache.txt") | ||||
# Add the native directory to the list of file to cleanup. | # Add the native directory to the list of file to cleanup. | ||||
set_property(DIRECTORY "${CMAKE_SOURCE_DIR}" APPEND PROPERTY ADDITIONAL_CLEAN_FILES "${NATIVE_BUILD_DIR}") | set_property(DIRECTORY "${CMAKE_SOURCE_DIR}" APPEND PROPERTY ADDITIONAL_CLEAN_FILES "${NATIVE_BUILD_DIR}") | ||||
endif() | endif() |