【问题标题】:Prevent CMake from looking into PATH for libraries and includes防止 CMake 查看 PATH 中的库和包含
【发布时间】: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


    【解决方案1】:

    对于具有 CMake 版本 3.6 的非 Windows 平台,再次删除了此行为。

    如果您遇到此问题,只需更新最新的 CMake 版本。请参阅 3.6 版发行说明Deprecated and Removed Features

    find_library()find_path()find_file() 命令不再搜索从非 Windows 平台上的 PATH 环境变量派生的安装前缀。在 CMake 3.3 中添加了此行为以支持 Windows 主机,但已证明在 UNIX 主机上存在问题。仅在 PATH 中为他们的工具保留一些 <prefix>/bin 目录的用户不一定希望搜索任何支持的 <prefix>/lib 目录。可以使用要搜索的前缀列表设置CMAKE_PREFIX_PATH 环境变量。

    【讨论】:

    • 很好,他们改回来了!那我就去升级了谢谢。
    【解决方案2】:

    据我所知,CMake 3.5 中不存在这样的开关。我不会尝试解决这个问题,因为即使您在 CMake 方面对其进行破解,这仍可能会使编译器或用户感到困惑。

    标题来自哪里?您可以要求其中一个项目更改标题吗?通常项目不希望与其他库发生冲突并尝试解决此类问题。

    【讨论】:

    • 这个问题发生在 FFTW,它通过我的发行版的存储库全局安装,但也附带了一个我必须自己编译的程序。当然,我可以手动删除这些标题,因为它们不再需要了。但我想我的问题的重点是避免这种手动干预,这有时是不可取的,而且总是让用户感到困惑。不过感谢您的提示!
    • 你可以离开它。 CMake 会找到一个版本并使用它。但 Florian 以正确的方式回答了您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    相关资源
    最近更新 更多