WSJT-X/CMake/Modules/generate_version_info.cmake

168 lines
5.1 KiB
CMake

include (CMakeParseArguments)
set (_THIS_MODULE_BASE_DIR "${CMAKE_CURRENT_LIST_DIR}")
# generate_product_version() function
#
# This function uses VersionInfo.in template file and VersionResource.rc file
# to generate WIN32 resource with version information and general resource strings.
#
# Usage:
# generate_product_version(
# SomeOutputResourceVariable
# NAME MyVersinedTarget
# ICON ${PATH_TO_ICON}
# VERSION_MAJOR 2
# VERSION_MINOR 3
# VERSION_PATCH 1
# VERSION_REVISION sha1
# )
#
# You can use generated resource for your executable targets:
# add_executable(target-name ${target-files} ${SomeOutputResourceVariable})
# add_library (target-name SHARED ${target-files} ${SomeOutputResourceVariable})
#
# You can specify resource strings in arguments:
# NAME - name of executable (no defaults, ex: Microsoft Word)
# BUNDLE - bundle (${PROJECT_NAME} or ${NAME} is default, ex: Microsoft Office)
# ICON - path to application icon, default: ${CMAKE_SOURCE_DIR}/icons/windows-icons/${NAME}.ico
# VERSION_MAJOR - default: 1
# VERSION_MINOR - deafult: 0
# VERSION_PATCH - deafult: 0
# VERSION_REVISION - deafult: 0
# VENDOR_NAME - your vendor name, default: ${PROJECT_VENDOR}
# LEGAL_COPYRIGHT - default: ${PROJECT_COPYRIGHT}
# COMMENTS - default: ${PROJECT_DESCRIPTION}
# ORIGINAL_FILENAME - default: ${NAME}
# INTERNAL_NAME - default: ${NAME}
# FILE_DESCRIPTION - default: ${COMMENTS}
function(generate_version_info outfiles)
set (options)
set (oneValueArgs
NAME
BUNDLE
ICON
VERSION_MAJOR
VERSION_MINOR
VERSION_PATCH
VERSION_REVISION
VENDOR_NAME
LEGAL_COPYRIGHT
COMMENTS
ORIGINAL_FILENAME
INTERNAL_NAME
FILE_DESCRIPTION)
set (multiValueArgs)
cmake_parse_arguments(PRODUCT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if (NOT PRODUCT_BUNDLE)
if (PROJECT_NAME)
set (PRODUCT_BUNDLE "${PROJECT_NAME}")
else ()
set (PRODUCT_BUNDLE "${PRODUCT_NAME}")
endif ()
endif()
if (NOT PRODUCT_ICON)
set (PRODUCT_ICON "${CMAKE_SOURCE_DIR}/icons/windows-icons/${PRODUCT_NAME}.ico")
endif ()
if (NOT PRODUCT_VERSION_MAJOR)
if (PROJECT_VERSION_MAJOR)
set (PRODUCT_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
else ()
set (PRODUCT_VERSION_MAJOR 1)
endif ()
else ()
if (NOT ${PRODUCT_VERSION_MAJOR} MATCHES "^[0-9]+$")
message (FATAL_ERROR "Numeric major version number required")
endif ()
endif ()
if (NOT PRODUCT_VERSION_MINOR)
if (PROJECT_VERSION_MINOR)
set (PRODUCT_VERSION_MINOR ${PROJECT_VERSION_MINOR})
else ()
set (PRODUCT_VERSION_MINOR 0)
endif ()
else ()
if (NOT ${PRODUCT_VERSION_MINOR} MATCHES "^[0-9]+$")
message (FATAL_ERROR "Numeric minor version number required")
endif ()
endif()
if (NOT PRODUCT_VERSION_PATCH)
if (PROJECT_VERSION_PATCH)
set (PRODUCT_VERSION_PATCH ${PROJECT_VERSION_PATCH})
else ()
set (PRODUCT_VERSION_PATCH 0)
endif ()
else ()
if (NOT ${PRODUCT_VERSION_PATCH} MATCHES "^[0-9]+$")
message (FATAL_ERROR "Numeric patch version number required")
endif ()
endif()
if (NOT PRODUCT_VERSION_TWEAK)
if (PROJECT_VERSION_TWEAK)
set (PRODUCT_VERSION_TWEAK ${PROJECT_VERSION_TWEAK})
else ()
set (PRODUCT_VERSION_TWEAK 0)
endif ()
else()
if (NOT ${PRODUCT_VERSION_TWEAK} MATCHES "^[0-9]+$")
message (FATAL_ERROR "Numeric tweak version number required")
endif()
endif()
if (NOT PROJECT_VERSION_REVISION AND BUILD_TYPE_REVISION)
set (PRODUCT_VERSION_REVISION ${BUILD_TYPE_REVISION})
endif ()
if (NOT PRODUCT_VENDOR_NAME AND PROJECT_VENDOR)
set (PRODUCT_VENDOR_NAME ${PROJECT_VENDOR})
endif ()
if (NOT PRODUCT_LEGAL_COPYRIGHT)
if (PROJECT_COPYRIGHT)
set (PRODUCT_LEGAL_COPYRIGHT ${PROJECT_COPYRIGHT})
else ()
string(TIMESTAMP PRODUCT_CURRENT_YEAR "%Y")
set(PRODUCT_LEGAL_COPYRIGHT "${PRODUCT_VENDOR_NAME} (C) Copyright ${PRODUCT_CURRENT_YEAR}")
endif ()
endif()
if (NOT PRODUCT_COMMENTS)
if (PROJECT_DESCRIPTION)
set(PRODUCT_COMMENTS ${PROJECT_DESCRIPTION})
else ()
set(PRODUCT_COMMENTS "${PRODUCT_NAME} v${PRODUCT_VERSION_MAJOR}.${PRODUCT_VERSION_MINOR}.${PRODUCT_VERSION_PATCH}")
endif ()
endif()
if (NOT PRODUCT_ORIGINAL_FILENAME)
set(PRODUCT_ORIGINAL_FILENAME "${PRODUCT_NAME}")
endif()
if (NOT PRODUCT_INTERNAL_NAME)
set(PRODUCT_INTERNAL_NAME "${PRODUCT_NAME}")
endif()
if (NOT PRODUCT_FILE_DESCRIPTION)
set(PRODUCT_FILE_DESCRIPTION "${PRODUCT_COMMENTS}")
endif()
set (_VersionInfoFile VersionInfo_${PRODUCT_NAME}.h)
set (_VersionResourceFile VersionResource_${PRODUCT_NAME}.rc)
configure_file(
${_THIS_MODULE_BASE_DIR}/VersionInfo.h.in
${_VersionInfoFile}
@ONLY)
configure_file(
${_THIS_MODULE_BASE_DIR}/VersionResource.rc.in
${_VersionResourceFile}
@ONLY)
list(APPEND ${outfiles} ${CMAKE_CURRENT_BINARY_DIR}/${_VersionInfoFile} ${CMAKE_CURRENT_BINARY_DIR}/${_VersionResourceFile})
set (${outfiles} ${${outfiles}} PARENT_SCOPE)
endfunction()