diff --git a/UnleashedRecomp/CMakeLists.txt b/UnleashedRecomp/CMakeLists.txt index de1b159..3ddcab6 100644 --- a/UnleashedRecomp/CMakeLists.txt +++ b/UnleashedRecomp/CMakeLists.txt @@ -247,11 +247,48 @@ set(UNLEASHED_RECOMP_CXX_SOURCES ${UNLEASHED_RECOMP_USER_CXX_SOURCES} ${UNLEASHED_RECOMP_MOD_CXX_SOURCES} ${UNLEASHED_RECOMP_THIRDPARTY_SOURCES} -) +) + +include("version.cmake") + +set(VERSION_TXT "${PROJECT_SOURCE_DIR}/res/version.txt") + +# Only show Git info and build type if not Release. +set(SHOW_GIT_INFO_AND_BUILD_TYPE 0) +if (NOT ${CMAKE_BUILD_TYPE} MATCHES "Release") + set(SHOW_GIT_INFO_AND_BUILD_TYPE 1) +endif() + +GenerateVersionSources( + OUTPUT_DIR ${PROJECT_SOURCE_DIR} + VERSION_TXT ${VERSION_TXT} + H_TEMPLATE "${PROJECT_SOURCE_DIR}/res/version.h.template" + CXX_TEMPLATE "${PROJECT_SOURCE_DIR}/res/version.cpp.template" + BUILD_TYPE ${CMAKE_BUILD_TYPE} + SHOW_GIT_INFO ${SHOW_GIT_INFO_AND_BUILD_TYPE} + SHOW_BUILD_TYPE ${SHOW_GIT_INFO_AND_BUILD_TYPE} +) if (WIN32) - # Set up Win32 resources for application icon. - set(ICON_PATH "${PROJECT_SOURCE_DIR}/../UnleashedRecompResources/images/game_icon.ico") + # Create binary version number for Win32 integer attributes. + CreateVersionString( + VERSION_TXT ${VERSION_TXT} + OUTPUT_CSV 1 + OUTPUT_VAR WIN32_VERSION_BINARY + ) + + # Create string version number for Win32 detailed attributes. + CreateVersionString( + VERSION_TXT ${VERSION_TXT} + BUILD_TYPE ${CMAKE_BUILD_TYPE} + SHOW_GIT_INFO ${SHOW_GIT_INFO_AND_BUILD_TYPE} + SHOW_BUILD_TYPE ${SHOW_GIT_INFO_AND_BUILD_TYPE} + OUTPUT_VAR WIN32_VERSION_STRING + ) + + # Set Win32 icon path. + set(WIN32_ICON_PATH "${PROJECT_SOURCE_DIR}/../UnleashedRecompResources/images/game_icon.ico") + configure_file("res/win32/res.rc.template" "${CMAKE_BINARY_DIR}/res.rc" @ONLY) add_executable(UnleashedRecomp ${UNLEASHED_RECOMP_CXX_SOURCES} "${CMAKE_BINARY_DIR}/res.rc") else() @@ -409,23 +446,6 @@ generate_aggregate_header( "${CMAKE_CURRENT_SOURCE_DIR}/api/SWA.h" ) -# Only show build type if not Release. -set(SHOW_GIT_INFO_AND_BUILD_TYPE 0) -if (NOT ${CMAKE_BUILD_TYPE} MATCHES "Release") - set(SHOW_GIT_INFO_AND_BUILD_TYPE 1) -endif() - -include("version.cmake") -GenerateVersionSources( - OUTPUT_DIR "${PROJECT_SOURCE_DIR}" - VERSION_TXT "${PROJECT_SOURCE_DIR}/res/version.txt" - H_TEMPLATE "${PROJECT_SOURCE_DIR}/res/version.h.template" - CXX_TEMPLATE "${PROJECT_SOURCE_DIR}/res/version.cpp.template" - BUILD_TYPE ${CMAKE_BUILD_TYPE} - SHOW_GIT_INFO ${SHOW_GIT_INFO_AND_BUILD_TYPE} - SHOW_BUILD_TYPE ${SHOW_GIT_INFO_AND_BUILD_TYPE} -) - set(RESOURCES_SOURCE_PATH "${PROJECT_SOURCE_DIR}/../UnleashedRecompResources") set(RESOURCES_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/res") diff --git a/UnleashedRecomp/res/credits.h b/UnleashedRecomp/res/credits.h index 239f6e7..fbc5952 100644 --- a/UnleashedRecomp/res/credits.h +++ b/UnleashedRecomp/res/credits.h @@ -9,6 +9,7 @@ inline const char* g_credits[] = "RadiantDerg", "PTKay", "DeaThProj", + "SuperSonic16", "NextinHKRY", "M&M", "saguinee", diff --git a/UnleashedRecomp/res/win32/res.rc.template b/UnleashedRecomp/res/win32/res.rc.template index 6e370d8..16f386a 100644 --- a/UnleashedRecomp/res/win32/res.rc.template +++ b/UnleashedRecomp/res/win32/res.rc.template @@ -1 +1,40 @@ -IDI_ICON1 ICON "@ICON_PATH@" \ No newline at end of file +#include + +#define UNLEASHED_RECOMP_VERSION_BIN @WIN32_VERSION_BINARY@ +#define UNLEASHED_RECOMP_VERSION_STR "@WIN32_VERSION_STRING@" + +#ifdef _DEBUG +#define UNLEASHED_RECOMP_FILE_FLAGS VS_FF_DEBUG +#else +#define UNLEASHED_RECOMP_FILE_FLAGS 0 +#endif + +IDI_ICON1 ICON "@WIN32_ICON_PATH@" + +VS_VERSION_INFO VERSIONINFO + FILEVERSION UNLEASHED_RECOMP_VERSION_BIN + PRODUCTVERSION UNLEASHED_RECOMP_VERSION_BIN + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS UNLEASHED_RECOMP_FILE_FLAGS + FILEOS VOS_NT_WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE VFT2_UNKNOWN +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "080904B0" // English (UK), Unicode + BEGIN + VALUE "ProductName", "Unleashed Recompiled" + VALUE "FileDescription", "Unleashed Recompiled" + VALUE "CompanyName", "hedge-dev" + VALUE "FileVersion", UNLEASHED_RECOMP_VERSION_STR + VALUE "ProductVersion", UNLEASHED_RECOMP_VERSION_STR + VALUE "InternalName", "UnleashedRecomp" + VALUE "OriginalFilename", "SWA.exe" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0809, 0x04B0 + END +END diff --git a/UnleashedRecomp/version.cmake b/UnleashedRecomp/version.cmake index 048d511..78d42d6 100644 --- a/UnleashedRecomp/version.cmake +++ b/UnleashedRecomp/version.cmake @@ -31,6 +31,113 @@ function(CheckOutputFile OUTPUT_FILE TEMPLATE_FILE) endif() endfunction() +# VERSION_TXT : the input text file containing the milestone, major, minor and revision variables. +function(ParseVersionInfo VERSION_TXT) + if (NOT VERSION_TXT) + message(FATAL_ERROR "VERSION_TXT not specified.") + endif() + + if (NOT EXISTS "${VERSION_TXT}") + message(FATAL_ERROR "No such file: ${VERSION_TXT}") + endif() + + file(READ "${VERSION_TXT}" FILE_CONTENT) + string(REGEX REPLACE "\r?\n" ";" FILE_LINES "${FILE_CONTENT}") + + foreach(LINE ${FILE_LINES}) + if (LINE STREQUAL "") + continue() + endif() + + # Find key/value pair match. + string(REGEX MATCH "([A-Za-z_]+)=\\\"?([^\"]+)\\\"?" MATCH "${LINE}") + + if (MATCH) + # Extract key/value pairs. + string(REGEX REPLACE "([A-Za-z_]+)=.*" "\\1" KEY "${MATCH}") + string(REGEX REPLACE "[A-Za-z_]+=\\\"?([^\"]+)\\\"?" "\\1" VALUE "${MATCH}") + + # Set environment variable. + set("${KEY}" "${VALUE}" CACHE INTERNAL "${KEY}") + endif() + endforeach() +endfunction() + +# VERSION_TXT : the input text file containing the milestone, major, minor and revision variables. +# OUTPUT_CSV : the output string will be formatted as #,#,# without any alphabetic characters (optional). +# BUILD_TYPE : the current build configuration (e.g. "Release", "RelWithDebInfo", "Debug") (optional). +# SHOW_GIT_INFO : the Git commit hash and branch name should be appended to the version string (optional). +# SHOW_BUILD_TYPE : the build type should be appended to the version string (optional). +# OUTPUT_VAR : the output variable to store the version string in. +function(CreateVersionString) + cmake_parse_arguments(ARGS "" "VERSION_TXT;OUTPUT_CSV;BUILD_TYPE;SHOW_GIT_INFO;SHOW_BUILD_TYPE;OUTPUT_VAR" "" ${ARGN}) + + if (NOT ARGS_VERSION_TXT) + message(FATAL_ERROR "VERSION_TXT not specified.") + endif() + + if (NOT ARGS_OUTPUT_VAR) + message(FATAL_ERROR "OUTPUT_VAR not specified.") + endif() + + ParseVersionInfo("${ARGS_VERSION_TXT}") + + if (ARGS_OUTPUT_CSV) + set(VERSION_STRING "${VERSION_MAJOR},${VERSION_MINOR},${VERSION_REVISION}") + else() + set(VERSION_STRING "v${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}") + + if (VERSION_MILESTONE) + string(PREPEND VERSION_STRING "${VERSION_MILESTONE} ") + endif() + + if (ARGS_SHOW_GIT_INFO) + find_package(Git REQUIRED) + + # Get Git branch name. + execute_process( + COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD + OUTPUT_VARIABLE BRANCH_NAME + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + set(BRANCH_NAME ${BRANCH_NAME} CACHE INTERNAL "BRANCH_NAME") + + # Get Git commit hash. + execute_process( + COMMAND ${GIT_EXECUTABLE} rev-parse HEAD + OUTPUT_VARIABLE COMMIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + set(COMMIT_HASH ${COMMIT_HASH} CACHE INTERNAL "COMMIT_HASH") + + # Get short Git commit hash. + execute_process( + COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD + OUTPUT_VARIABLE COMMIT_HASH_SHORT + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + set(COMMIT_HASH_SHORT ${COMMIT_HASH_SHORT} CACHE INTERNAL "COMMIT_HASH_SHORT") + + # Append commit hash and branch. + if (COMMIT_HASH_SHORT AND BRANCH_NAME) + string(APPEND VERSION_STRING ".${COMMIT_HASH_SHORT}-${BRANCH_NAME}") + endif() + endif() + + # Append build configuration. + if (ARGS_BUILD_TYPE AND ARGS_SHOW_BUILD_TYPE) + string(APPEND VERSION_STRING " (${ARGS_BUILD_TYPE})") + endif() + endif() + + if (ARGS_OUTPUT_VAR) + set(${ARGS_OUTPUT_VAR} ${VERSION_STRING} PARENT_SCOPE) + endif() +endfunction() + # OUTPUT_DIR : the output directory of the resulting *.h/*.cpp files. # VERSION_TXT : the input text file containing the milestone, major, minor and revision variables. # H_TEMPLATE : the input template for the header. @@ -59,70 +166,16 @@ function(GenerateVersionSources) message(FATAL_ERROR "CXX_TEMPLATE not specified.") endif() + # Required for *.cpp template. set(BUILD_TYPE ${ARGS_BUILD_TYPE}) - if (ARGS_SHOW_GIT_INFO) - find_package(Git REQUIRED) - - # Get Git branch name. - execute_process( - COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD - OUTPUT_VARIABLE BRANCH_NAME - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - - # Get Git commit hash. - execute_process( - COMMAND ${GIT_EXECUTABLE} rev-parse HEAD - OUTPUT_VARIABLE COMMIT_HASH - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - - # Get short Git commit hash. - execute_process( - COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD - OUTPUT_VARIABLE COMMIT_HASH_SHORT - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - endif() - - file(READ "${ARGS_VERSION_TXT}" FILE_CONTENT) - string(REGEX REPLACE "\r?\n" ";" FILE_LINES "${FILE_CONTENT}") - - foreach(LINE ${FILE_LINES}) - if (LINE STREQUAL "") - continue() - endif() - - # Find key/value pair match. - string(REGEX MATCH "([A-Za-z_]+)=\\\"?([^\"]+)\\\"?" MATCH "${LINE}") - - if (MATCH) - # Extract key/value pairs. - string(REGEX REPLACE "([A-Za-z_]+)=.*" "\\1" KEY "${MATCH}") - string(REGEX REPLACE "[A-Za-z_]+=\\\"?([^\"]+)\\\"?" "\\1" VALUE "${MATCH}") - - # Set environment variable. - set("${KEY}" "${VALUE}") - endif() - endforeach() - - set(VERSION_STRING "v${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}") - - # Prepend version milestone. - if (VERSION_MILESTONE) - string(PREPEND VERSION_STRING "${VERSION_MILESTONE} ") - endif() - - # Append commit hash and branch. - if (COMMIT_HASH_SHORT) - string(APPEND VERSION_STRING ".${COMMIT_HASH_SHORT}-${BRANCH_NAME}") - endif() - - # Append build configuration. - if (ARGS_BUILD_TYPE AND ARGS_SHOW_BUILD_TYPE) - string(APPEND VERSION_STRING " (${ARGS_BUILD_TYPE})") - endif() + CreateVersionString( + VERSION_TXT ${ARGS_VERSION_TXT} + BUILD_TYPE ${ARGS_BUILD_TYPE} + SHOW_GIT_INFO ${ARGS_SHOW_GIT_INFO} + SHOW_BUILD_TYPE ${ARGS_SHOW_BUILD_TYPE} + OUTPUT_VAR VERSION_STRING + ) message("-- Build: ${VERSION_STRING}")