我这么问不只是为了我自己。我希望这个问题能成为许多像我一样的新手的参考,对于这样一个小的CMakeLists.txt文件,它的幕后到底发生了什么完全令人费解
cmake_minimum_required (VERSION 2.6)
project(Tutorial)
add_executable(Tutorial tutorial.cpp)
这样一个小教程。cpp
int main() { return 0; }
生成了这么多文件
CMakeCache.txt cmake_install.cmake Makefile
CMakeLists.txt tutorial.cpp
还有一个CMakeFiles文件夹,里面有很多文件和文件夹
CMakeCCompiler.cmake CMakeOutput.log Makefile.cmake
cmake.check_cache CMakeSystem.cmake progress.marks
CMakeCXXCompiler.cmake CMakeTmp TargetDirectories.txt
CMakeDetermineCompilerABI_C.bin CompilerIdC Tutorial.dir
CMakeDetermineCompilerABI_CXX.bin CompilerIdCXX
CMakeDirectoryInformation.cmake Makefile2
不了解幕后发生了什么(例如:为什么要生成这么多文件以及它们的目的是什么),是学习CMake的最大障碍。
如果有人知道,请为后人解释一下好吗?这些文件的目的是什么,当我输入cmake .时,cmake在构建项目之前到底配置和生成了什么?
秘诀在于,您不必理解生成的文件是做什么的。
CMake在构建系统中引入了很多复杂性,只有当您使用它构建复杂的软件项目时,这些复杂性才会得到回报。
好消息是,CMake做了一项很好的工作,使您远离这些混乱:使用外部源代码构建,您甚至不需要查看生成的文件。如果到目前为止还没有这样做(我猜情况就是这样,因为您编写了cmake .),请在继续之前检查它们。用CMake混合构建和源目录真的很痛苦,这不是系统应该使用的方式。
简而言之:而不是
cd <source_dir>
cmake .
总是使用
cd <build_dir_different_from_source_dir>
cmake <source_dir>
我通常在源目录内使用一个空子文件夹build作为build目录。
为了减轻你的痛苦,让我快速概述一下CMake生成的相关文件:
Project files/Makefiles - What you are actually interested in: The files required to build your project under the selected generator. This can be anything from a Unix Makefile to a Visual Studio solution.
CMakeCache.txt - This is a persistent key/value string storage which is used to cache value between runs. Values stored in here can be paths to library dependencies or whether an optional component is to be built at all. The list of variables is mostly identical to the one you see when running ccmake or cmake-gui. This can be useful to look at from time to time, but I would recommend to use the aforementioned tools for changing any of the values if possible.
Generated files - This can be anything from autogenerated source files to export macros that help you re-integrate your built project with other CMake projects. Most of these are only generated on demand and will not appear in a simple project such as the one from your question.
Anything else is pretty much noise to keep the build system happy. In particular, I never needed to care about anything that is going on inside the CMakeFiles subdirectory.
一般来说,你不应该乱动CMake为你生成的任何文件。所有问题都可以在CMakeLists.txt中以某种方式解决。只要结果能够按照预期构建项目,您可能就没问题了。不要太担心那些血淋淋的细节——因为这是CMake一开始就想让你避免的。
如其网站所述:
Cmake是一个跨平台、开源的构建系统,用于使用独立于编译器的方法来管理软件的构建过程
在大多数情况下,它用于生成项目/make文件-在您的示例中,它生成了用于构建软件的Makefile(主要在Linux/Unix平台上)。
Cmake允许提供跨平台的构建文件,可以为特定的编译/平台生成特定平台的项目/make文件。
例如,你可以尝试用Visual Studio在Windows上编译你的软件,然后用正确的语法在你的CMakeLists.txt文件中启动
cmake .
在Windows平台上的项目目录中,Cmake将生成所有必要的项目/解决方案文件(。sln等等)。
如果你想在Linux/Unix平台上构建你的软件,你只需要去你的CMakeLists.txt文件的源目录,并触发相同的cmake。它将生成所有必要的文件,为您构建软件通过简单的使或使所有。
这里有一些关于Cmake关键功能的非常好的演示http://www.elpauer.org/stuff/learning_cmake.pdf
EDIT
如果你想创建依赖于平台的库包含/变量定义等,你可以在CMakeLists.txt文件中使用此语法
IF(WIN32)
...do something...
ELSE(WIN32)
...do something else...
ENDIF(WIN32)
还有很多命令可以防止构建失败,Cmake会通知你,例如你的系统上没有安装boost库文件系统和regex。要做到这一点,你可以使用以下语法:
find_package(Boost 1.45.0 COMPONENTS filesystem regex)
检查它将为适当的系统/IDE/编译器生成makefile。
秘诀在于,您不必理解生成的文件是做什么的。
CMake在构建系统中引入了很多复杂性,只有当您使用它构建复杂的软件项目时,这些复杂性才会得到回报。
好消息是,CMake做了一项很好的工作,使您远离这些混乱:使用外部源代码构建,您甚至不需要查看生成的文件。如果到目前为止还没有这样做(我猜情况就是这样,因为您编写了cmake .),请在继续之前检查它们。用CMake混合构建和源目录真的很痛苦,这不是系统应该使用的方式。
简而言之:而不是
cd <source_dir>
cmake .
总是使用
cd <build_dir_different_from_source_dir>
cmake <source_dir>
我通常在源目录内使用一个空子文件夹build作为build目录。
为了减轻你的痛苦,让我快速概述一下CMake生成的相关文件:
Project files/Makefiles - What you are actually interested in: The files required to build your project under the selected generator. This can be anything from a Unix Makefile to a Visual Studio solution.
CMakeCache.txt - This is a persistent key/value string storage which is used to cache value between runs. Values stored in here can be paths to library dependencies or whether an optional component is to be built at all. The list of variables is mostly identical to the one you see when running ccmake or cmake-gui. This can be useful to look at from time to time, but I would recommend to use the aforementioned tools for changing any of the values if possible.
Generated files - This can be anything from autogenerated source files to export macros that help you re-integrate your built project with other CMake projects. Most of these are only generated on demand and will not appear in a simple project such as the one from your question.
Anything else is pretty much noise to keep the build system happy. In particular, I never needed to care about anything that is going on inside the CMakeFiles subdirectory.
一般来说,你不应该乱动CMake为你生成的任何文件。所有问题都可以在CMakeLists.txt中以某种方式解决。只要结果能够按照预期构建项目,您可能就没问题了。不要太担心那些血淋淋的细节——因为这是CMake一开始就想让你避免的。
CMake究竟是如何工作的是开发人员的一个问题,所以这个问题不能在这里回答。
然而,我们可以提供一些有用的指导,告诉你什么时候应该使用CMake,什么时候需要担心它是如何工作的。我也不喜欢“哦,它只是工作”的答案——因为,尤其是在软件领域,没有什么是“只是工作”的,你总是必须在某些时候进入到基本的细节。
CMake is an industrial-strength tool. It automates several VERY complex process and takes into account many variables of which you may not be aware, especially as a fairly new developer, probably working with limited knowledge of all the operating systems and build tools CMake can handle. The reason so many files are generated and why things seem so complex is because all of those other systems are complex and must be accounted for and automated. Additionally there are the issues of "caching" and other time-saving features of the tool To understand everything in CMake would mean understanding everything in these build tools and OS's and all the possible combinations of these variables, which as you can imagine is impossible.
需要注意的是,如果您不负责管理大型跨平台构建系统,并且您的代码库只有几KLOC,可能高达100KLOG,那么使用CMake似乎有点像使用10万美元的森林树木清除机从2英尺乘2英尺的花园中清除杂草。(顺便说一下,如果你从未见过这样的机器,你应该在youtube上找一个,他们太棒了)
如果您的构建系统较小且简单,那么最好手工编写自己的makefile或自己编写脚本。当你的makefile变得笨拙或者你需要在另一个平台上构建一个系统版本时,你可以切换到CMake。到那时,你会有很多问题要解决,你可以问一些更有针对性的问题。与此同时,请查阅一些关于CMake的优秀书籍,或者更好的是,自己编写一本!8)