如何移除/删除CMake目标?解决第三方脚本导致uninstall目标重复创建的报错问题
解决CMake中重复创建"uninstall"目标的问题
这种第三方脚本乱创建重复目标的情况确实头疼,毕竟咱们没法直接改人家的代码。不过好在CMake有一些办法能处理这个问题,给你几个可行的方案:
方案1:用官方命令移除(CMake 3.18及以上版本)
从CMake 3.18开始,官方提供了remove_custom_target命令,专门用来删除自定义目标,这是最稳妥的方法。你只需要在调用第三方脚本的前后,先检查目标是否存在,存在就删掉:
# 先检查uninstall目标是否已经存在 if(TARGET uninstall) # 移除已存在的uninstall自定义目标 remove_custom_target(uninstall) endif() # 在这里执行你的第三方脚本,比如include或者ExternalProject_Add之类的操作 # include(third-party-script.cmake)
如果是两个第三方脚本都创建了uninstall,你可以在第一个脚本运行完之后执行一次移除,再运行第二个脚本;或者等两个都运行完之后统一移除,再根据自己的需求重新创建(如果需要的话)。
方案2:兼容旧版本CMake的hack方法(3.18以下)
如果你的CMake版本还停留在3.18之前,没有remove_custom_target命令,那可以用点“野路子”,直接修改CMake内部维护的目标列表:
if(TARGET uninstall) # 获取当前目录下的所有构建目标 get_directory_property(all_targets BUILDSYSTEM_TARGETS) # 从列表里把uninstall去掉 list(REMOVE_ITEM all_targets uninstall) # 更新目录的目标列表 set_directory_properties(PROPERTIES BUILDSYSTEM_TARGETS "${all_targets}") # 顺便清理相关的缓存变量 unset(uninstall CACHE) endif()
这个方法虽然有点hack,但在旧版本CMake里确实能生效,不过要注意不同CMake版本可能有细微差异,测试一下再用。
方案3:尝试让第三方脚本跳过创建uninstall
有些第三方CMake脚本会提供开关变量,用来控制是否生成uninstall目标。比如有些脚本会检查NO_UNINSTALL或者SKIP_UNINSTALL这类变量,如果存在就不创建uninstall。你可以在调用第三方脚本前试试设置这类变量:
# 尝试告诉第三方脚本不要创建uninstall目标 set(NO_UNINSTALL ON) # 然后调用第三方脚本 include(third-party-script.cmake)
不过这个要看第三方脚本是否支持,毕竟咱们没法控制人家的代码,只能碰运气,但万一有用呢?
内容的提问来源于stack exchange,提问作者lucasahli
相关产品推荐
相关产品推荐

