option(PSEMEK_PACKAGE_MODE "Enable packaging mode" OFF) set(PSEMEK_PACKAGE_OUTPUT_PATH "" CACHE STRING "Packaging output path") set(PSEMEK_PACKAGE_VERSION_SUFFIX "" CACHE STRING "Packaging version suffix") if(PSEMEK_PACKAGE_MODE) if(WIN32) set(PSEMEK_PACKAGE_SUFFIX_RAW win) elseif(UNIX AND (NOT APPLE)) set(PSEMEK_PACKAGE_SUFFIX_RAW linux) elseif(UNIX AND APPLE) set(PSEMEK_PACKAGE_SUFFIX_RAW mac) else() message(FATAL "Uknown system for packaging") endif() set(PSEMEK_PACKAGE_SUFFIX ${PSEMEK_PACKAGE_SUFFIX_RAW} CACHE INTERNAL "Packaging suffix" FORCE) set(PSEMEK_PACKAGE_LINK_FLAGS_RAW) if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")) list(APPEND PSEMEK_PACKAGE_LINK_FLAGS_RAW "-static-libgcc" "-static-libstdc++") endif() set(PSEMEK_PACKAGE_LINK_FLAGS ${PSEMEK_PACKAGE_LINK_FLAGS_RAW} CACHE INTERNAL "Packaging CXX flags" FORCE) set(PSEMEK_COPY_FILES_RAW) endif() function(psemek_add_executable target) if((NOT PSEMEK_PACKAGE_MODE) OR PSEMEK_PACKAGE_TARGET) add_executable(${target} ${ARGN}) target_link_libraries(${target} PUBLIC psemek) if(PSEMEK_PACKAGE_MODE) target_link_options(${target} PUBLIC ${PSEMEK_PACKAGE_LINK_FLAGS}) if(UNIX AND (NOT APPLE)) set_target_properties(${target} PROPERTIES BUILD_RPATH "." ) endif() add_custom_command(TARGET ${target} POST_BUILD COMMAND ${CMAKE_STRIP} $ ) if(UNIX AND (NOT APPLE)) add_custom_command(TARGET ${target} POST_BUILD COMMAND chrpath -r . $ ) endif() add_custom_command(TARGET ${target} POST_BUILD COMMAND zip -v ${CMAKE_CURRENT_LIST_DIR}/${PSEMEK_PACKAGE_OUTPUT_PATH}/${target}${PSEMEK_PACKAGE_VERSION_SUFFIX}-${PSEMEK_PACKAGE_SUFFIX}.zip -j $ ${PSEMEK_PACKAGE_COPY_FILES} ) endif() endif() endfunction() function(psemek_add_build_tool target link_psemek) if((NOT PSEMEK_PACKAGE_MODE) OR PSEMEK_PACKAGE_HOST) add_executable(${target} ${ARGN}) if(${link_psemek}) target_link_libraries(${target} PUBLIC psemek) endif() if(PSEMEK_PACKAGE_MODE) install(TARGETS ${target} RUNTIME DESTINATION bin) endif() else() find_file(_LOCATION ${target} PATHS "${PSEMEK_PACKAGE_TOOLS_PATH}/bin") message(STATUS "Found ${target}: ${_LOCATION}") if(NOT _LOCATION) message(FATAL "Could not locate ${target} build tool in ${PSEMEK_PACKAGE_TOOLS_PATH}") endif() add_executable(${target} IMPORTED GLOBAL) set_target_properties(${target} PROPERTIES IMPORTED_LOCATION ${_LOCATION}) endif() endfunction() function(psemek_add_library target) add_library(${target} ${ARGN}) set(_GUARD_SOURCE_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/nosource_library_guard.cpp") target_sources(${target} PRIVATE ${_GUARD_SOURCE_LOCATION}) if(NOT (EXISTS "${_GUARD_SOURCE_LOCATION}")) file(TOUCH "${_GUARD_SOURCE_LOCATION}") endif() endfunction()