使用适当的自动生成的配置cmake创建可重定位的包

时间:2017-08-17 09:11:50

标签: cmake

我创建了cmake目标,比如说A,并想要安装它并创建一个Config文件,这样安装的软件包就可以重定位了。我的代码是:

install(EXPORT ${PROJECT_NAME}Targets
    FILE ${PROJECT_NAME}Targets.cmake
    NAMESPACE ${PROJECT_NAME}::
    DESTINATION ??? )

在这里,我遇到了正确目的地的问题。我希望在${CMAKE_INSTALL_PREFIX}指向的位置安装Config文件。但是当我将${CMAKE_INSTALL_PREFIX}放在???时,生成的ATargets.cmake文件包含以下行:

set(_IMPORT_PREFIX "C:/Libraries/...")

这是${CMAKE_INSTALL_PREFIX}的实际值。稍后将_IMPORT_PREFIX添加到自动生成的set_target_properties()内的ATargets.cmake命令的参数之前,从而生成硬编码路径,仅在安装系统上有效。

我尝试使用<$IMPORT_PREFIX>之类的某些生成器表达式来代替???,但这在cmake生成时给了我一个错误。我还试图省略DESTINATION,我认为应该将文件放在相对于${CMAKE_INSTALL_PREFIX}的位置,但是cmake也抱怨它。

你可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

这是一个老问题,所以您可能已经解决了(或放弃了)。

我认为关键是导出DESTINATION匹配给INSTALL_DESTINATION到configure_package_config_file()的那个。

我们正在使用的是:

  install(TARGETS
    foobar
    EXPORT foobarLibTargets
    LIBRARY DESTINATION lib)
  set(ConfigFileInstallDir lib/cmake/foobar)
  set(INCLUDE_INSTALL_DIR include)
  set(LIBRARY_INSTALL_DIR lib)
  configure_package_config_file(src/main/cmake/foobarConfig.cmake.in
    "${CMAKE_CURRENT_BINARY_DIR}/foobarConfig.cmake"
    INSTALL_DESTINATION "${ConfigFileInstallDir}"
    PATH_VARS INCLUDE_INSTALL_DIR LIBRARY_INSTALL_DIR)
  write_basic_package_version_file(
    "${CMAKE_CURRENT_BINARY_DIR}/foobarConfigVersion.cmake"
    VERSION "${VERSION}"
    COMPATIBILITY ExactVersion)
  export(EXPORT foobarLibTargets
    FILE "${CMAKE_CURRENT_BINARY_DIR}/foobarLibTargets.cmake")
  install(EXPORT foobarLibTargets
    FILE foobarLibTargets.cmake
    DESTINATION "${ConfigFileInstallDir}")
  install(FILES
    "${CMAKE_CURRENT_BINARY_DIR}/foobarConfig.cmake"
    "${CMAKE_CURRENT_BINARY_DIR}/foobarConfigVersion.cmake"
    "${CMAKE_CURRENT_BINARY_DIR}/foobarLibTargets.cmake"
    DESTINATION "${ConfigFileInstallDir}")

$ {ConfigFileInstallDir}被_IMPORT_PREFIX自动替换 这样生成的foobarLibTargets.cmake包含以下内容:

set_property(TARGET foobar APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
set_target_properties(foobar PROPERTIES
  IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/foobar.so.2.0.0"
  IMPORTED_SONAME_RELEASE "libfoobar.so.2"
)

使此功能工作可能会遇到麻烦。看到我的问题:

在不久的将来在病房里见到您,您将发现与cmake相关的神经疾病...