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 $ $ $ ) 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 $ $ COMMAND_EXPAND_LISTS ) endif() endfunction(chk_add)