106 lines
2.7 KiB
CMake
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)
|