psemek/package/CMakeLists.txt

96 lines
3.1 KiB
CMake

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})
target_compile_definitions(${target} PUBLIC "-DPSEMEK_PACKAGE_MODE")
if(UNIX AND (NOT APPLE))
set_target_properties(${target} PROPERTIES
BUILD_RPATH "."
)
endif()
add_custom_command(TARGET ${target} POST_BUILD
COMMAND ${CMAKE_STRIP} $<TARGET_FILE:${target}>
)
if(UNIX AND (NOT APPLE))
add_custom_command(TARGET ${target} POST_BUILD
COMMAND chrpath -r . $<TARGET_FILE:${target}>
)
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 $<TARGET_FILE:${target}> ${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)
target_compile_definitions(${target} PUBLIC "-DPSEMEK_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()
if(PSEMEK_PACKAGE_MODE)
target_compile_definitions(${target} PUBLIC "-DPSEMEK_PACKAGE_MODE")
endif()
endfunction()