CMake:为用户提供的迁移指南/备忘单

时间:2014-01-02 13:45:16

标签: cmake

我正在考虑用CMake替换configure / make风格的构建过程。 CMake在复杂的东西上表现很好,但在简单的事情上它更加冗长。 例如GNU Make文件:

hello:
    echo "hello world" >$@

在CMake中它将是:

add_custom_command(OUTPUT hello
  COMMAND echo "hello world" > hello)
add_custom_target(all ALL DEPENDS hello)

另请参阅 Adding a custom command with the file name as a target

实际上更像是:

hello:
    echo "hello world" >hello

all: hello

对于更复杂的构建,automatic variables的缺失非常明显。

经过多次路由(似乎很难搜索$ @),我发现:

Automatic variables in CMake

建议使用包装函数和

Path to target output file

建议使用接近自动变量的生成器表达式, 但还不够近。

我有几个相关的问题:

1a)自从提出这个问题以来,CMake本身或最佳做法已经移动了吗?

1b)CMake是否可能提供相当于自动变量?     如果没有,为什么不呢?

Stack Overflow和互联网上的其他地方都很好地涵盖了个别问题,但是:

2a)是否有任何好的指南或备忘单可以帮助您直接从使用GNU make进行迁移。

2b)它们是CMake的最佳实践指南吗?

这超出了 Makefile equivalent in CMake 中的建议。我逐渐发展自己的风格,但我想避免无马车型错误和不必要的复杂性。

1 个答案:

答案 0 :(得分:0)

这很难回答,因为CMake不等同于make。例如,将CMake与autotools进行比较要容易得多,因为它是构建系统生成器而不是构建系统本身。

无论如何,让我们尝试提供一些答案。

1a + b)不,因为CMake的范围和哲学不在于提供这样的结构 CMake的语法通常更侧重于冗长,使用显式变量名称,例如${CMAKE_CURRENT_SOURCE_DIR}以及命名命令参数。它看起来更像是一种“经典”命令式编程语言,而不是Makefiles所依赖的依赖图的专门文本描述。
此外,CMake的输出可以是Makefile或其他任何东西,因此需要一定程度的抽象。

您的最佳做法是使用宏:

macro(build_echo_foo ${target})
    add_custom_command(OUTPUT ${target}
        COMMAND echo "hello world" > ${target})
    add_custom_target(${target}_target ALL DEPENDS ${target})
endmacro()

build_echo_foo(hello)
build_echo_foo(another_hello)

Makefiles鼓励作者尽可能通用,为了尽量减少打字,CMake尝试尽可能明确地设置内容,例如鼓励维护者明确列出源文件而不是提供通配符。

2a + b)回答这个并不完全在Stack Overflow的范围内,但我会这样说。 最好的灵感来源是使用该系统的开源项目。截至2014年,已有大量高端项目迁移到CMake。您甚至可以学习CMake自己的源代码,它将自己用作构建系统。