我的Mercurial存储库repo1有一个名为foo
的自定义目标;不管它做什么。我还有另一个存储库repo2,我想用它作为repo1的子代码。 repo2以与repo1类似的方式开发,并且还有一个名为foo
的自定义目标,做同样的事情(当然只是针对repo2目录)。
如果我尝试在add_subdirectory(relative/path/to/repo2)
中使用CMakeLists.txt
运行CMake for repo1,我会得到:
CMake Error at CMakeLists.txt:123 (add_custom_target):
add_custom_target cannot create target "foo" because another target with
the same name already exists. The existing target is a custom target
created in source directory
我想我可以在自定义目标名称前加上存储库名称,但这似乎是解决这个问题的原始方法;我有点像make foo
在repo1和repo2中从概念上做同样的事情。那么我能做些什么更聪明的事吗?
答案 0 :(得分:1)
方法取决于您的期望
make foo
仅为当前项目构建目标。也就是说,从project1的目录运行,make foo
应该为这个项目构建目标。对于project2也是如此。
在这种情况下,请将ExternalProject_Add
代替add_subdirectory
用于绑定项目。
为两个项目构建目标。
通常这些目标是"项目范围内的行动",例如make uninstall
或make test
。
在这种情况下,在将目标添加到项目之前,您需要检查目标是否存在并采取适当的措施:
if(NOT TARGET foo)
<create target foo>
endif()
<append-new-actions-to-foo>
步骤&#34;创建&#34;并且&#34;追加&#34;取决于目标类型。
,例如,经典uninstall
目标通过阅读install_manifest.txt
文件自动处理所有子项目:
if(NOT TARGET uninstall)
add_custom_target(uninstall ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
endif()
对于一般情况,您可以创建每个项目目标并通过add_dependencies
将其附加到&#34; shared&#34;目标:
if(NOT TARGET foo)
add_custom_target(foo)
endif()
add_custom_target(foo_${CMAKE_PROJECT_NAME} <do-something>)
add_dependencies(foo foo_${CMAKE_PROJECT_NAME})