【发布时间】:2016-06-06 22:53:32
【问题描述】:
考虑下面的简单 CMake 脚本,它试图找到一个虚构的 theheader.h C 头文件。据我所知,这是在FindXXX.cmake 模块中定位库的包含目录的典型方法。
cmake_minimum_required(VERSION 2.6)
project(test)
find_path(
TEST_INCLUDES
NAMES "theheader.h"
)
message(STATUS "TEST_INCLUDES: ${TEST_INCLUDES}")
现在假设,以与此 CMake 脚本无关的方式,我编辑了我的 PATH 环境变量(我正在运行 Linux)以包含自定义 bin 目录:
PATH="/home/cschreib/someapp/bin:$PATH"
原来,目录/home/cschreib/someapp/include 存在,并且包含一个名为theheader.h 的文件。此标头仅用于本地构建someapp,它从未打算被其他程序使用*。
在 CMake 3.3 之前,CMake 从未找到此自定义位置。但是,从 3.3 版开始,CMake 尝试变得更智能,并用bin 替换include 来替换$PATH 中的所有目录。因此,CMake 3.3(及更高版本)确实在此自定义目录中找到 theheader.h。因为这不是故意的,所以这会导致各种麻烦,包括标头和共享对象版本之间的不匹配。
我知道我可以通过使用find_path 中的NO_SYSTEM_ENVIRONMENT_PATH 选项告诉CMake 不要查看$PATH,但我正在寻找更通用的解决方案来解决这个问题。事实上,这个问题可能发生在任何图书馆。我可以复制我需要的所有 FindXXX.cmake 模块并系统地添加NO_SYSTEM_ENVIRONMENT_PATH 选项,但我宁愿避免这样做。
是否有一个全局开关可以用来关闭这个不需要的功能?还是有其他出路?
*:在有人对此进行讨论之前。我知道这不是一个好习惯。我也知道,在我的社区里,人们往往不太关心好的和坏的做法,这种情况很常见。由于我不打算改变社区,我希望我的 CMake 脚本能够抵御不良做法。
【问题讨论】:
标签: cmake