WSJT-X/CMake/Modules/generate_version_info.cmake
Bill Somerville 1995d762bb
Add Version Info resources to Windows executables where needed.
Version information  and more  in the  Windows resources  for main
    applications, installer and un-installer.

    Update  CMake   policies  for  new  project()   command,  and  DEB
    dependency changes

    Support  older  libgfortran  packages,  and  other  Linux  package
    dependencies.

    Use new project description file in Debian packaging.

    Linux packaging dependency adjustments  for Debian style packages,
    including  a machine  readable  Debian  copyright format,  project
    description in separate file for  CPack compatibility, and use for
    DEB packaging.

    Configure check for need to link libm Standard C Math Library.

    CMake compatibility for <3.17.
2020-10-10 13:58:53 +01:00

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()