CMake子目录安装/卸载目标
我有一个包含两个子目录项目(添加了add_subdirectory)的项目,每个项目都有自己的库、二进制文件和安装/卸载目标。因此:CMake子目录安装/卸载目标,cmake,Cmake,我有一个包含两个子目录项目(添加了add_subdirectory)的项目,每个项目都有自己的库、二进制文件和安装/卸载目标。因此: main_project | |--CMakeLists.txt |--src/ |--CMakeLists.txt (with binary target, install() | |--project_a |--CMakeLists.txt |--src/ |--CMakeLists.txt (with library, inst
main_project
|
|--CMakeLists.txt
|--src/
|--CMakeLists.txt (with binary target, install()
|
|--project_a
|--CMakeLists.txt
|--src/
|--CMakeLists.txt (with library, install())
|
|--project_b
|--CMakeLists.txt
|--src/
|--CMakeLists.txt (with library, install())
我想让顶级项目(main_项目)自动安装库a和库b(包含在target_link_libraries()的main_项目中)。因此,我希望能够:
cd main_project/build
cmake ..
make
sudo make install
并自动安装主项目二进制库和项目a/b库。我试过这个:
main_project/src/CMakeLists.txt
...
install(FILES main project_a project_b DESTINATION bin
LIBRARY DESTINATION lib)
但是cmake..
会导致
install TARGETS given target "project_a" which does not exist in this directory.
正如所料
我还尝试指定路径:
main_project/src/CMakeLists.txt
...
install(FILES main ${CMAKE_SOURCE_DIR}/project_a/ ${CMAKE_SOURCE_DIR}/project_b DESTINATION bin
LIBRARY DESTINATION lib)
它还抱怨项目a/b不在此目录中(我猜也是预期的?)
我还尝试过使用install()中的FILES选项“手动”安装库,效果很好,但考虑到子项目中有非常好的install(),这似乎非常困难
还有一个问题:由于project_a和project_b也有uninstall()自定义目标,因此我无法在没有CMake抱怨自定义目标已经存在的情况下将卸载目标添加到主_项目中。当我尝试将卸载指令添加到顶级目录列表时:
add_custom_target(uninstall
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
但是,由于我的项目有一个卸载指令,我得到:
CMake Error at CMakeLists.txt:37 (add_custom_target):
add_custom_target cannot create target "uninstall" because another
target with the same name already exists. The existing target is a
custom target created in source directory "/main_project/project_a".
See documentation for policy CMP0002 for more details.
那么,我如何从我的主项目旁边的子项目中安装和卸载必要的库文件呢?我发现了这个问题。我添加了我想要安装的子目录,其中包含EXCLUDE_FROM_,这样它就不会构建子目录中的所有内容,只构建我需要的库。该标志似乎阻止子目录install()发生。也许ExternalProject_Add确实是最好的方法
另外,重新覆盖自定义目标,这对我来说很有效:不清楚您拥有什么和想要什么。显示您尝试过的代码。编辑以包含我尝试过的代码。感谢您的帮助。由于子项目的CMakeLists.txt已经发出了
install()
命令,那么主项目就不需要再做任何关于安装它的事情了。至于“卸载”,由于子项目已经给出了目标,您不能在主项目中创建它。顺便说一句,对于3d party子项目,当您不能(或不想)更改它们的代码时,最好的方法是使用配置和构建它们。对于主项目的安装子项目,您可以使用install(SCRIPT)
或install(code)
.Hmm,当从顶级构建目录调用makeinstall
时,在子目录(添加了add\u subdirectory()
)中发出的每个install()
命令都应该生效。如果你的情况不是这样,那么试着创建触发这种行为的因素。至于覆盖自定义目标,我不知道怎么做。我发现了问题。我正在添加我要安装的子目录EXCLUDE\u FROM\u ALL
,这样它就不会构建子目录中的所有内容,只构建我需要的库。该标志似乎阻止子目录install()
发生。也许ExternalProject\u Add
确实是实现这一点的最佳方法。。。