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?