是否可以从CMake命令行更改CMAKE_MODULE_PATH?

时间:2017-05-11 20:15:29

标签: cmake

我正在构建一个使用Protobuf库的(第三方)项目(但这个问题很普遍)。我的系统在系统范围内安装了比项目兼容的更新版本的Protobuf。所以我从源代码下载并编译了旧版本的Protobuf。

该项目使用CMake,在其CMakeLists.txt中有:

#include <windows.h>
#include <conio.h>

BOOL IsKeyPressed(KEY_CODE key)
{
    if (GetAsyncKeyState(key) < 0)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
} 

int select_menu(char**menus, int x, int y, int items_count)
{
    int selection = 0;
    show_menu(x, y, menus, items_count);    
    gotoxy(x, y);

    while (1)
    {
        if (IsKeyPressed(vk_Down))
        {
            int xx = wherex();
            int yy = wherey() + 1;

            if ((yy - x + 1) > items_count)
            {
                gotoxy(x, y);
            }
            else
            {
                gotoxy(xx, yy);
            }
        }
        if (IsKeyPressed(vk_Up))
        {
            int xx = wherex();
            int yy = wherey() - 1;

            if (yy < y)
            {
                gotoxy(x, y + items_count);
            }
            else
            {
                gotoxy(xx, yy);
            }
        }
        if (IsKeyPressed(vk_Return))
        {
            int xx = wherex();
            int yy = wherey();

            selection = yy - y + 1;
        }
    }

    return selection;
}
然而,

找到了(不兼容的)系统安装。当然,CMake并不了解我的Protobuf定制版本。但是我怎么说呢?

我在find_package(Protobuf REQUIRED) 中创建了一个FindProtobuf.cmake文件,并希望构建过程使用此文件来查找Protobuf。但我还没有成功迫使CMake拿起这个而不是系统。我认为原因很明显来自~/usr/share/cmake-3.0/Modules/的CMake文档:

  

该命令有两种搜索包的模式:“模块”模式和“配置”模式。使用上述简化签名调用命令时,模块模式可用。 CMake在CMAKE_MODULE_PATH中搜索名为Find&lt; package&gt; .cmake的文件,然后进行CMake安装。如果找到该文件,则由CMake读取并处理。 ...如果没有找到模块并且未给出MODULE选项,则命令进入Config模式。

因此,在我成功更改find_package之前,CMake只会选择已安装到默认系统路径的CMAKE_MODULE_PATH,并且无法继续进行“#34;配置”。模式,我可以使用FindProtobuf.cmake

对我来说,编辑CMAKE_PREFIX_PATH非常重要,因为它属于我不会维护的第三方项目。

我尝试过的(一切都没有成功):

  • 调用CMakeLists.txt(env。变量不是&#34;转移&#34;到具有相同名称的CMake变量)
  • 致电CMAKE_MODULE_PATH=~/usr/share/cmake-3.0/Modules cmake ...(可能无法正常工作?)
  • 调用cmake -DCMAKE_MODULE_PATH=~/usr/share/cmake-3.0/Modules ...(该项目不支持Protobuf的这种覆盖)

在我看来,遗憾的是,改变Protobuf_DIR=path/to/my/protobuf cmake ...使用的CMAKE_MODULE_PATH的唯一方法是在find_package内改变它,这正是我想要避免的。

对于如何不触及CMakeLists.txt并仍然说服CMakeLists.txt找到我的自定义Protobuf,您有任何想法/解决方法吗?

作为参考,该项目的CMake部分是on bitbucket

1 个答案:

答案 0 :(得分:2)

作为对您问题的直接回答,是的,您可以通过运行 CMAKE_MODULE_PATH 在命令行设置 cmake -DCMAKE_MODULE_PATH=/some/path -S /path/to/src -B /path/to/build

但这可能不会做你想要它做的事情;见下文。


您提供的 Bitbucket 链接已失效,但这里有一些建议可能会有所帮助。

  1. 避免编写自己的查找模块,尤其是当上游提供 CMake 配置模块时。
  2. 通过将 CMAKE_PREFIX_PATHProtobuf_ROOT (v3.12+) 之一设置为 Protobuf 安装根目录,您可以将 CMake 定向到您的自定义 Protobuf 安装。
  3. 您可以通过将 CMAKE_FIND_PACKAGE_PREFER_CONFIG 设置为 true (v3.15+) 来告诉 find_package 先尝试 CONFIG 模式。然后将 Protobuf_DIR 设置为包含 ProtobufConfig.cmake 的目录。
  4. 如果没有其他方法,您可以手动设置 CMake 自己的 FindProtobuf 模块中记录的变量,这里:https://cmake.org/cmake/help/latest/module/FindProtobuf.html

所有这些变量都可以在配置命令行中使用 -D 标志设置。

填充 CMake 变量以启动的环境变量很少,我会避免依赖它们。这里有一个详尽的列表:https://cmake.org/cmake/help/latest/manual/cmake-env-variables.7.htmlCMAKE_MODULE_PATH 不在其中。