mirror of
https://github.com/silverqx/TinyORM.git
synced 2026-05-03 15:09:26 -05:00
122 lines
4.2 KiB
CMake
122 lines
4.2 KiB
CMake
# Configure Windows resource and manifest files
|
|
function(tiny_resource_and_manifest target)
|
|
|
|
set(options TEST)
|
|
set(oneValueArgs OUTPUT_DIR RESOURCES_DIR RESOURCE_BASENAME MANIFEST_BASENAME)
|
|
cmake_parse_arguments(PARSE_ARGV 1 TINY ${options} "${oneValueArgs}" "")
|
|
|
|
if(DEFINED TINY_UNPARSED_ARGUMENTS)
|
|
message(FATAL_ERROR "${CMAKE_CURRENT_FUNCTION} was passed extra arguments: \
|
|
${TINY_UNPARSED_ARGUMENTS}")
|
|
endif()
|
|
|
|
# Include Windows RC and manifest file for a shared library or executable
|
|
get_target_property(target_type ${target} TYPE)
|
|
|
|
# The static archive doesn't need an RC or manifest file
|
|
if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows" OR
|
|
(NOT target_type STREQUAL "EXECUTABLE" AND
|
|
NOT target_type STREQUAL "SHARED_LIBRARY")
|
|
)
|
|
return()
|
|
endif()
|
|
|
|
# Initialize variables
|
|
set(tiny_original_extension)
|
|
if(NOT TINY_OUTPUT_DIR)
|
|
set(TINY_OUTPUT_DIR "tmp/")
|
|
endif()
|
|
|
|
if(NOT DEFINED TINY_RESOURCES_DIR)
|
|
set(TINY_RESOURCES_DIR "resources")
|
|
endif()
|
|
|
|
# Absolute paths will not be touched
|
|
file(REAL_PATH "${TINY_OUTPUT_DIR}" TINY_OUTPUT_DIR
|
|
BASE_DIRECTORY "${PROJECT_BINARY_DIR}"
|
|
)
|
|
file(REAL_PATH "${TINY_RESOURCES_DIR}" TINY_RESOURCES_DIR
|
|
BASE_DIRECTORY "${PROJECT_SOURCE_DIR}"
|
|
)
|
|
|
|
# Modify the Tom_target variable for substitution (original exe and icon filename)
|
|
# This is special logic because Tom_target is used in 3 CMake projects
|
|
# Used only in the tom.rc.in, I'm not going to wrap it in the if()
|
|
set(Tom_target ${target})
|
|
|
|
# Allow to pass a custom RC basename
|
|
if(DEFINED TINY_RESOURCE_BASENAME)
|
|
set(rcBasename ${TINY_RESOURCE_BASENAME})
|
|
|
|
# All tests use the same TinyTest.rc.in file
|
|
elseif(TINY_TEST)
|
|
set(rcBasename TinyTest)
|
|
|
|
# Used for icon basename
|
|
set(TinyTest_icon ${rcBasename})
|
|
# Test's RC file has a common substitution token for all tests
|
|
set(TinyTest_target ${target})
|
|
else()
|
|
set(rcBasename ${target})
|
|
endif()
|
|
|
|
# Allow to pass a custom manifest basename
|
|
if(DEFINED TINY_MANIFEST_BASENAME)
|
|
set(tiny_manifest_basename ${TINY_MANIFEST_BASENAME})
|
|
# For MinGW (used only in the tom.rc.in)
|
|
set(Tom_manifest ${TINY_MANIFEST_BASENAME})
|
|
else()
|
|
set(tiny_manifest_basename ${rcBasename})
|
|
# For MinGW (used only in the tom.rc.in)
|
|
set(Tom_manifest ${rcBasename})
|
|
endif()
|
|
|
|
# CMake doesn't have problem with UTF-8 encoded files
|
|
set(pragma_codepage "65001")
|
|
|
|
# Start configuring
|
|
configure_file(
|
|
"${TINY_RESOURCES_DIR}/${rcBasename}.rc.in"
|
|
"${TINY_OUTPUT_DIR}/${rcBasename}_genexp.rc.in"
|
|
@ONLY NEWLINE_STYLE LF
|
|
)
|
|
|
|
# To support an OriginalFilename in Windows RC file for multi-config generators
|
|
file(GENERATE OUTPUT "${TINY_OUTPUT_DIR}/${rcBasename}-$<CONFIG>.rc"
|
|
INPUT "${TINY_OUTPUT_DIR}/${rcBasename}_genexp.rc.in"
|
|
NEWLINE_STYLE UNIX
|
|
)
|
|
|
|
# Needed in the RC file, MinGW does not define the _DEBUG macro
|
|
if(MINGW)
|
|
# TODO ask if is planned support for genex in the filepath silverqx
|
|
set_source_files_properties("${TINY_OUTPUT_DIR}/${rcBasename}-Debug.rc"
|
|
TARGET_DIRECTORY ${target}
|
|
PROPERTIES COMPILE_DEFINITIONS $<$<CONFIG:Debug>:_DEBUG>
|
|
)
|
|
endif()
|
|
|
|
# TODO multi-config and empty $<CONFIG>, why silverqx
|
|
# Windows Resource file
|
|
target_sources(${target} PRIVATE
|
|
"${TINY_RESOURCES_DIR}/${rcBasename}.rc.in"
|
|
"${TINY_OUTPUT_DIR}/${rcBasename}_genexp.rc.in"
|
|
"$<$<BOOL:$<CONFIG>>:${TINY_OUTPUT_DIR}/${rcBasename}-$<CONFIG>.rc>"
|
|
)
|
|
|
|
# Manifest file (injected through the RC file on MinGW)
|
|
if(NOT MINGW)
|
|
# Obtain extension by target type - .exe or .dll
|
|
if(target_type STREQUAL "SHARED_LIBRARY")
|
|
set(tiny_original_extension "${CMAKE_SHARED_LIBRARY_SUFFIX}")
|
|
elseif(target_type STREQUAL "EXECUTABLE")
|
|
set(tiny_original_extension "${CMAKE_EXECUTABLE_SUFFIX}")
|
|
endif()
|
|
|
|
target_sources(${target} PRIVATE
|
|
"${TINY_RESOURCES_DIR}/${tiny_manifest_basename}${tiny_original_extension}.manifest"
|
|
)
|
|
endif()
|
|
|
|
endfunction()
|