Как генерировать информацию о версировании Windows DLL с помощью CMake
Я использую CMake для создания общей библиотеки, однако для Windows DLL мне нужна информация о версии, например:
- FileDescription
- FileVersion
- InternalName
- LegalCopyright
- OriginalFilename
- ProductName
- ProductVersion
До сих пор все, что у меня есть, это свойства VERSION и SOVERSION, но они, похоже, не коррелируют с информацией FileVersion, которую я ожидал.
set(LIC_TARGET MySharedLib)
add_library(${LIC_TARGET} SHARED ${SOURCES} )
SET_TARGET_PROPERTIES(${LIC_TARGET}
PROPERTIES
VERSION ${MY_PRODUCT_NUMBER}.${MY_PRODUCT_VERSION}.${MY_BUILD_NUMBER}
SOVERSION ${MY_PRODUCT_NUMBER})
Я нашел ручные методы (см. пример внизу), но предпочел бы содержать это внутри CMake.
Справка
Ответы
Ответ 1
Вы можете использовать значения переменной CMake в сочетании с файлом version.rc.in и configure_file.
// version.rc.in
#define VER_FILEVERSION @[email protected],@[email protected],@[email protected],0
#define VER_FILEVERSION_STR "@[email protected]@[email protected]@[email protected]\0"
#define VER_PRODUCTVERSION @[email protected],@[email protected],@[email protected],0
#define VER_PRODUCTVERSION_STR "@[email protected]@[email protected]@[email protected]\0"
//
// ...along with the rest of the file from your "manual methods" reference
И затем, в вашем файле CMakeLists.txt:
# CMakeLists.txt
set(MY_PRODUCT_NUMBER 3)
set(MY_PRODUCT_VERSION 5)
set(MY_BUILD_NUMBER 49)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/version.rc.in
${CMAKE_CURRENT_BINARY_DIR}/version.rc
@ONLY)
set(LIC_TARGET MySharedLib)
add_library(${LIC_TARGET} SHARED ${SOURCES}
${CMAKE_CURRENT_BINARY_DIR}/version.rc)
# Alternatively you could simply include version.rc in another rc file
# if there already is one in one of the files in ${SOURCES}
Ответ 2
У меня была такая же проблема и у меня была автоматическая генерация версий для моих проектов.
Вам нужно три файла из github:
Поместите его в подкаталог cmake вашего проекта и обязательно включите его в CMAKE_MODULE_PATH, например:
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake)
Затем перед добавлением() или add_library (SHARED) вашей цели используйте:
include(generate_product_version)
generate_product_version(
VersionFilesOutputVariable
NAME "My Great Project"
ICON ${PATH_TO_APPLICATION_ICON}
VERSION_MAJOR 1
VERSION_MINOR 3
VERSION_PATCH ${BUILD_COUNTER}
VERSION_REVISION ${BUILD_REVISION}
)
Полный список поддерживаемых строк ресурсов см. в generate_product_version.cmake.
VersionInfo.h и VersionResource.rc будут сгенерированы в папку cmake binaries. Variable VersionFilesOutputVariable будет содержать пути к этим файлам. Просто добавьте этот список в свою цель:
add_executable(MyGreatProject ${your-target-sources} ${VersionFilesOutputVariable})
UPDATE: исправлены параметры generate_product_version script из VERSION_PATH
к VERSION_PATCH.
Ответ 3
Существует еще более простой способ, чем принятый ответ. Это не связано с преобразованием входного ресурса .rc.in. Просто создайте общий файл version.rc, как описано здесь, а затем из вашего CMakeLists.txt выполните следующее:
#CMakeLists.txt
add_definitions(-DVER_COMPANYNAME_STR="MyCompany")
add_definitions(-DVER_FILEVERSION_STR="1,1,0.0")
# ...
# add all the other defines here
set(LIC_TARGET MySharedLib)
add_library(${LIC_TARGET} SHARED ${SOURCES} version.rc)
Это имеет дополнительное преимущество, что и определения доступны из вашего исходного кода, поэтому у вас есть программный доступ к вашей версии.