Files
engine/cmake/chk.cmake
2026-04-16 10:05:01 -04:00

106 lines
2.7 KiB
CMake

include_guard()
include(GenerateExportHeader)
function(chk_add)
cmake_parse_arguments(CHK "" "NAME;KIND;PREFIX;SRCBASE;BINBASE" "SRC;HDR;PUB;PRV" ${ARGN})
set(CHK_IS_LIB FALSE)
set(CHK_IS_EXE FALSE)
if(NOT CHK_NAME)
message(FATAL_ERROR "NAME is required")
endif()
if(CHK_KIND STREQUAL "lib")
set(CHK_IS_LIB TRUE)
elseif(CHK_KIND STREQUAL "exe")
set(CHK_IS_EXE TRUE)
elseif(NOT CHK_KIND)
message(FATAL_ERROR "KIND is required")
else()
message(FATAL_ERROR "KIND must be either \"lib\" or \"exe\". was \"${CHK_KIND}\"")
endif()
if(NOT CHK_PREFIX)
set(CHK_PREFIX "chk")
endif()
if(NOT CHK_SRCBASE)
set(CHK_SRCBASE "${CMAKE_CURRENT_SOURCE_DIR}")
endif()
if(NOT CHK_BINBASE)
set(CHK_BINBASE "${CMAKE_CURRENT_BINARY_DIR}")
endif()
set(CHK_TARGET "${CHK_PREFIX}_${CHK_NAME}")
string(TOUPPER "${CHK_NAME}" CHK_NAME_CAPS)
string(TOUPPER "${CHK_PREFIX}" CHK_PREFIX_CAPS)
string(TOUPPER "${CHK_TARGET}" CHK_TARGET_CAPS)
list(TRANSFORM CHK_SRC PREPEND "${CHK_SRCBASE}/src/${CHK_PREFIX}/${CHK_NAME}/")
list(TRANSFORM CHK_HDR PREPEND "${CHK_SRCBASE}/include/${CHK_PREFIX}/${CHK_NAME}/")
if(CHK_IS_LIB)
add_library(${CHK_TARGET})
add_library(${CHK_PREFIX}::${CHK_NAME} ALIAS ${CHK_TARGET})
set(CHK_EXP_EXT "hpp")
set(CHK_EXP_DIR ${CHK_BINBASE}/include/${CHK_PREFIX}/${CHK_NAME})
set(CHK_EXP_HDR ${CHK_EXP_DIR}/Api.${CHK_EXP_EXT})
generate_export_header(${CHK_TARGET}
EXPORT_FILE_NAME ${CHK_EXP_HDR}
EXPORT_MACRO_NAME ${CHK_NAME_CAPS}_API
NO_EXPORT_MACRO_NAME ${CHK_NAME_CAPS}_LOCAL
PREFIX_NAME ${CHK_PREFIX_CAPS}_
)
list(APPEND CHK_HDR ${CHK_EXP_HDR})
elseif(CHK_IS_EXE)
add_executable(${CHK_TARGET})
endif()
target_sources(${CHK_TARGET}
PUBLIC
FILE_SET "${CHK_PREFIX}_${CHK_NAME}_headers"
TYPE HEADERS
BASE_DIRS
"${CHK_SRCBASE}/include"
"${CHK_BINBASE}/include"
FILES
${CHK_HDR}
PRIVATE
${CHK_SRC}
)
target_include_directories(${CHK_TARGET}
PUBLIC
$<BUILD_INTERFACE:${CHK_SRCBASE}/include>
$<BUILD_INTERFACE:${CHK_BINBASE}/include>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(${CHK_TARGET}
PUBLIC
${CHK_PUB}
PRIVATE
${CHK_PRV}
)
target_compile_features(${CHK_TARGET} PUBLIC cxx_std_23)
# Set linker language to C++
set_target_properties(${CHK_TARGET} PROPERTIES LINKER_LANGUAGE CXX)
# Copy DLLs alongside the executable on Windows
if (WIN32 AND CHK_IS_EXE)
add_custom_command(TARGET ${CHK_TARGET} POST_BUILD
COMMAND
${CMAKE_COMMAND} -E copy_if_different
$<TARGET_RUNTIME_DLLS:${CHK_TARGET}>
$<TARGET_FILE_DIR:${CHK_TARGET}>
COMMAND_EXPAND_LISTS
)
endif()
endfunction(chk_add)