Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake:make用户的迁移指南/备忘单_Cmake - Fatal编程技术网

CMake:make用户的迁移指南/备忘单

CMake:make用户的迁移指南/备忘单,cmake,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

我正在考虑用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 world”>hello) 添加\u自定义\u目标(全部取决于hello) 另见

这实际上更像是:

hello: echo "hello world" >hello all: hello 你好: 回声“你好世界”>你好 大家好 对于更复杂的构建,缺少数据是非常明显的

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

建议使用包装函数和

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

我有几个相关的问题:

1a)自提出该问题以来,CMake自身或最佳实践是否有进展

1b)CMake是否可能提供与自动变量等效的变量? 若否,原因为何

StackOverflow和Internet上的其他地方都很好地涵盖了个别问题,但是:

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

2b)是否有针对CMake的最佳实践指南


这超出了本文的建议。我正在逐渐发展自己的风格,但我希望避免无马马车类型错误和不必要的复杂性。

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

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

1a+b)不,因为提供此类结构不在CMake的范围和理念之内。
CMake的语法通常更为冗长,带有明确的变量名,如
${CMake\u CURRENT\u SOURCE\u DIR}
,以及命名的命令参数。它看起来更像是一种“经典”命令式编程语言,而不是对makefile所在的依赖关系图的专门文本描述。
此外,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)回答这个问题并不完全在堆栈溢出的范围内,但我会这样说。
最好的灵感来源是使用这个系统的开源项目。截至2014年,有大量引人注目的项目已迁移到CMake。您甚至可以学习CMake自己的源代码,它将自身用作构建系统。

我绝对不想强制编写构建文件。然而,cmake仍然尝试声明性(大部分)。add_executable()等只是您尝试执行的更高级别的声明。所以我不同意cmake在风格上是必须的。@BruceAdams是真的,毕竟它们被命名为cmake列表是有原因的。严格地说,cmake的必要性在于它能够指定自定义命令,因为我们告诉它如何构建目标,而不是依赖于它的默认机制。如果我有指定的输出值,我不希望重复它们。在宏或函数中换行并不理想,因为不同的命令可能引用不同的输出文件集和依赖项。我最终可能会得到许多这样的函数,可能名称不清。因此,我认为这既是CGED语法的问题,也可能是一些无法通过采用一些好的规则来避免的问题。对于2A+B,我真的在寻找一些编译后的事后,比如你可以从一个有效的C++中得到。你得到的不仅仅是一组规则,还有这些规则背后的推理。我发现了以下cmake反模式列表: