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)

另请参阅添加具有文件名称的自定义命令作为目标

其实更像是:

hello:
    echo "hello world" >hello

all: hello

随着更复杂的构建,缺乏自动变量(http://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html)是非常明显的。

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

CMake中的自动变量

这表明使用包装函数和

目标输出文件的路径

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

我有几个相关的问题:

1a)自从提出这个问题以来,cmake本身还是最佳实践?

1b)cmake是否可能提供与自动变量等价的值? 如果不是为什么不呢?

在stackoverflow和网络上的其他地方,个别问题已经很好地覆盖了,但是:

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

2b)他们是否是cmake的最佳实践指南?

这超出了“CMake中的Makefile等效”中的建议。 我逐渐发展自己的风格,但是希望避免无马车类型的错误和不必要的复杂性。


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

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

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

你的情况最好的做法是使用宏:

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)回答这个问题并不完全在Stackoverflow的范围内,但我会这样说。 最好的灵感来源是使用这个系统的开源项目。 截至2014年,已有很多高调项目迁移到CMake。 你甚至可以学习CMake自己的源代码,它使用自己作为构建系统。

链接地址: http://www.djcxy.com/p/31877.html

上一篇: cmake: migration guide/ cheat sheet for make users

下一篇: How to always run command when building regardless of any dependency?