Как генерировать информацию о версировании 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)

Это имеет дополнительное преимущество, что и определения доступны из вашего исходного кода, поэтому у вас есть программный доступ к вашей версии.