Как генерировать информацию о версиях Windows DLL с помощью CMake - PullRequest
21 голосов
/ 14 июля 2011

Я использую 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.

Помощь

Ответы [ 3 ]

18 голосов
/ 14 июля 2011

Вы можете использовать значения переменных CMake вместе с файлом version.rc.in и командой configure_file .

// version.rc.in
#define VER_FILEVERSION             @MY_PRODUCT_NUMBER@,@MY_PRODUCT_VERSION@,@MY_BUILD_NUMBER@,0
#define VER_FILEVERSION_STR         "@MY_PRODUCT_NUMBER@.@MY_PRODUCT_VERSION@.@MY_BUILD_NUMBER@.0\0"

#define VER_PRODUCTVERSION          @MY_PRODUCT_NUMBER@,@MY_PRODUCT_VERSION@,@MY_BUILD_NUMBER@,0
#define VER_PRODUCTVERSION_STR      "@MY_PRODUCT_NUMBER@.@MY_PRODUCT_VERSION@.@MY_BUILD_NUMBER@\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}
13 голосов
/ 05 февраля 2015

У меня была такая же проблема, и у меня автоматическое создание версий для моих проектов. Вам нужно три файла из github:

Поместите его в подкаталог cmake вашего проекта и обязательно включите его в CMAKE_MODULE_PATH, например:

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake)

Затем перед add_executable () или 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. Переменная VersionFilesOutputVariable будет содержать пути к этим файлам. Просто добавьте этот список к своей цели:

add_executable(MyGreatProject ${your-target-sources} ${VersionFilesOutputVariable})

ОБНОВЛЕНИЕ : исправлены параметры сценария generate_product_version из VERSION_PATH в VERSION_PATCH.

6 голосов
/ 20 апреля 2016

Существует еще более простой способ, чем принятый ответ.Он не включает преобразование входного ресурса. 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)

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

...