CPack使用来自不同源树的可执行文件创建包

时间:2014-09-26 21:05:31

标签: cmake package cpack

问题如下:

项目结构:

ProjectDir
- CMakeLists.txt
- src
-- CMakeLists.txt
-- FirstApp
--- CMakeLists.txt
--- ... sources ...
-- SecondApp
--- CMakeLists.txt
--- ... sources ...
- tools
-- CMakeLists.txt
-- SomeTool
--- CMakeLists.txt
--- ... sources ...
-- SomeOtherTool
--- CMakeLists.txt
--- ... sources ...

我想要达到的目标是:

    使用 SomeTool 二进制文件
  • 包(让它为 rpm deb );
  • 包含 FirstApp SecondApp SomeOtherTool 二进制文件;

据我所知:

  • CPack将包含在安装命令中定义的内容的包内容放入;
  • 无法在同一个树中调用CPack(include(CPack))两次(例如,无法在src级别和SecondApp级别的CMakeLists.txt中调用它;

我有什么

ProjectDir/tools/SomeTool/CMakeLists.txt我(它的pseado代码):

PROJECT( SomeTool )

SET(TARGET SomeTool)

SET(CPACK_GENERATOR "RPM")
SET(CPACK_PACKAGE_NAME "SomeTool")
# ...
# all the other CPACK_* stuff
# ...

include(CPack)
add_custom_target(${TARGET}-package 
                  COMMAND cpack --config "${CMAKE_CURRENT_BINARY_DIR}/CPack${PROJECT_NAME}Config.cmake")

SET(SOURCES ...)
SET(HEADERS ...)
add_executable(${TARGET} ${SOURCES} ${HEADERS})
install(TARGETS ${TARGET}
        RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/usr/bin)

这样我就可以致电make SomeTool-package,然后创建内容为SomeTool.rpm的包(/usr/bin/SomeTool)。太好了!


我可以在CMakeLists.txt目录中使用非常相似的ProjectDir/src/

# src/CMakeLists.txt
PROJECT( MainProject )

SET(CPACK_GENERATOR "RPM")
SET(CPACK_PACKAGE_NAME "MainProject")
# ...
# all the other CPACK_* stuff
# ...

include(CPack)
add_custom_target(MainProject-package 
                  COMMAND cpack --config "${CMAKE_CURRENT_BINARY_DIR}/CPack${PROJECT_NAME}Config.cmake")

add_subdirectory(FirstApp)
add_subdirectory(SecondApp)

# src/FirstApp/CMakeLists.txt
SET(TARGET FirstApp)
SET(SOURCES ...)
SET(HEADERS ...)
add_executable(${TARGET} ${SOURCES} ${HEADERS})
install(TARGETS ${TARGET}
        RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/usr/bin)

# src/SecondApp/CMakeLists.txt
SET(TARGET SecondApp)
SET(SOURCES ...)
SET(HEADERS ...)
add_executable(${TARGET} ${SOURCES} ${HEADERS})
install(TARGETS ${TARGET}
        RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/usr/bin)

这样我就可以致电make MainProject-package,然后创建内容为MainProject.rpm/usr/bin/FirstApp的包(/usr/bin/SecondApp)。太好了!

SomeOtherTool CMakeLists.txt也与 FirstApp SecondApp CMakeLists.txt相同,我可以致电make SomeOtherTool并且它会生成SomeOtherTool个二进制文件。

问题

由于CPack正在加入与install命令相关联的软件包,如何将 SomeOtherTool MainProject-package 连接?

我的解决方案是在install末尾添加另一个src/CMakeLists.txt条款,它看起来像是:

add_dependency(MainProject SomeOtherTool)
install(FILES ${CMAKE_BINARY_DIR}/SomeOtherTool DESTINATION ${CMAKE_INSTALL_PREFIX}/usr/bin )

还有其他方法吗?这个解决方案看起来并不干净。如果我更改了 SomeOtherTool 可执行文件名,我也必须在这里更改它。安装路径也是如此。

0 个答案:

没有答案
相关问题