如何使用 CMake 获取命令行输出作为参数?

Posted

技术标签:

【中文标题】如何使用 CMake 获取命令行输出作为参数?【英文标题】:How to use CMake to get command line output as an argument? 【发布时间】:2020-02-20 14:40:58 【问题描述】:

我正在使用 CMake 构建 linux 模块模式,所以我在 ubuntu 上检索头文件,目前我正在 docker 中运行 ubuntu,它有:

/lib/modules/4.15.0-76-generic

好吧,几天后如果我构建一个新图像,它将成为更新值:

/lib/modules/4.15.0-78-generic

所以这个数字在变化,但是/lib/module下只有一个目录,不是'uname -a'输出。

Linux 0a08e87c0a18 4.15.0-50-generic

所以我想知道CMake中是否有一种方便的方法,就像shellls /lib/module,然后我可以使用命令行输出作为头/库根目录的参数?

非常感谢。

【问题讨论】:

使用命令execute_process你可以运行(执行)任意shell实用程序。在OUTPUT_VARIABLE 选项中指定名称的变量将包含该执行的输出。 【参考方案1】:

您可以使用 CMake 的 file(GLOB ...) 命令列出特定目录中的内容(文件和子目录)。如果/lib/modules 目录只包含一个子目录(没有文件),你可以这样做:

file(GLOB MY_VERSIONED_DIR /lib/modules/*)

您现在可以在 CMake 代码的其他位置使用 $MY_VERSIONED_DIR 变量,因为它将填充子目录路径,例如:

/lib/modules/4.15.0-78-generic

您还可以使用 CMake 的 execute_process() 命令,该命令在 CMake 配置时在子进程中运行命令。使用 OUTPUT_VARIABLE 参数捕获命令的输出:

if(UNIX)
    execute_process(
        COMMAND ls /lib/modules
        OUTPUT_VARIABLE MY_VERSIONED_DIR 
    )
endif()

【讨论】:

以上是关于如何使用 CMake 获取命令行输出作为参数?的主要内容,如果未能解决你的问题,请参考以下文章

CMAKE 使用环境变量而不将它们作为命令行参数传递?

Ninja 构建中的 CMake 命令行参数

如何使用CMake在链接命令行的末尾添加标志?

如何在 MSVC 2019 中的 CMake 管理的 C++ 项目中将命令行启动参数添加到发布目标?

如何不使用命令行参数编译 CMakeLists.txt 的一部分?

如何在java中传递命令行参数[重复]