CMake模块是否需要遵循NO_SYSTEM_ENVIRONMENT_PATH等定义?
解决CMake FindTCL模块不遵守路径限制参数的问题
我太懂这种憋屈感了——明明设置了一堆参数想死死把依赖查找范围锁在指定路径里,结果自带的CMake模块偏偏不按规矩来,属实闹心。
先给你捋清楚根源:CMake 3.8.1自带的FindTCL.cmake里硬编码了不少默认搜索路径(比如你贴的TCLTK_POSSIBLE_INCLUDE_PATHS片段里的系统路径),而且这个版本的模块没做好全局参数的兼容,完全无视你设置的NO_DEFAULT_PATH、NO_CMAKE_SYSTEM_PATH这类限制,自顾自去系统目录里找TCL。
下面给你几个实打实的解决办法:
直接跳过自动搜索,手动指定变量
这是最省心的方案,不用碰任何CMake模块。在调用find_package(TCL)之前,直接把TCL的关键路径写死:# 替换成你实际的路径 set(TCL_INCLUDE_PATH "/root/of/software/that/the/build/may/use/include") set(TCL_LIBRARY "/root/of/software/that/the/build/may/use/lib/libtcl.so") set(TCL_TCLSH "/root/of/software/that/the/build/may/use/bin/tclsh") find_package(TCL REQUIRED)这样
FindTCL.cmake会直接用你指定的路径,不会再瞎搜其他地方。自定义FindTCL模块,替换系统版本
把系统自带的FindTCL.cmake复制到你项目的cmake/Modules目录下,然后修改里面的搜索逻辑:- 找到定义
TCLTK_POSSIBLE_INCLUDE_PATHS、TCLTK_POSSIBLE_LIB_PATHS的部分,删掉那些硬编码的系统路径 - 给模块里的
find_path、find_library命令加上NO_DEFAULT_PATH、NO_CMAKE_SYSTEM_PATH参数,或者让它们读取全局的开关变量
最后在CMakeLists.txt里指定自定义模块的路径:
set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/Modules" ${CMAKE_MODULE_PATH})- 找到定义
升级CMake版本
CMake在3.10及以后的版本里,优化了自带查找模块的路径逻辑,很多模块开始乖乖遵守全局的路径限制参数。如果你的项目允许升级CMake,这绝对是最一劳永逸的办法。
额外小技巧:要是只是临时测试,也可以在调用
find_package时直接传路径参数:find_package(TCL REQUIRED PATHS "/root/of/software/that/the/build/may/use")不过这种方式稳定性不如手动指定变量,毕竟不同模块对
PATHS参数的处理可能有差异。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

