我正在考虑用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的缺失非常明显。
经过多次路由(似乎很难搜索$ @),我发现:
建议使用包装函数和
建议使用接近自动变量的生成器表达式, 但还不够近。
我有几个相关的问题:
1a)自从提出这个问题以来,CMake本身或最佳做法已经移动了吗?
1b)CMake是否可能提供相当于自动变量? 如果没有,为什么不呢?
Stack Overflow和互联网上的其他地方都很好地涵盖了个别问题,但是:
2a)是否有任何好的指南或备忘单可以帮助您直接从使用GNU make进行迁移。
2b)它们是CMake的最佳实践指南吗?
这超出了 Makefile equivalent in CMake 中的建议。我逐渐发展自己的风格,但我想避免无马车型错误和不必要的复杂性。
答案 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自己的源代码,它将自己用作构建系统。