经过小学一年级(CMakeLists 小学-1)的勤奋学习,现在终于上小学二年级了。
上一篇文章里出现了几个变量:
- PROJECT_BINARY_DIR
- CMAKE_BINARY_DIR
- LIBRARY_OUTPUT_PATH
- EXECUTABLE_OUTPUT_PATH
这些变量(variable)名不是我起的,是cmake自带的!cmake生来就有的!
实际上,cmake变量远不止这几个,还有很多很多。
现在让我们走近这些 variable 。
在终端(terminal)中输入以下命令,查看cmake帮助文档
cmake --help
发现cmake的使用方法如下(节选):
Usage
cmake [options] <path-to-source>
cmake [options] <path-to-existing-build>
Specify a source directory to (re-)generate a build system for it in the
current working directory. Specify an existing build directory to
re-generate its build system.
[options]表示可选项。" [ ] "表示可选项,这是常识。
<path-to-source>表示CMakeLists所在的目录(directory)。这个参数是必须要有的。
用法里说:
指定一个源码目录(即,CMakeLists所在目录),在当前目录下生成一个构建系统(build system)。
指定一个已存在的构建目录会重新生成构建系统。
1.查看变量
看帮助文档,找到这么两个option,查看变量的方法:
--help-variable-list [<f>] = List variables with help available and exit.
--help-variable var [<f>] = Print help for one variable and exit.
我们可以查看cmake里个各个变量的意义了:
注意到,这里有一个in-source build,通常我们都用out-of-source 的方式构建(即,自己建立一个build目录)。
现在cmake自带的变量我们都明白了。
可有些变量不是cmake自带的,但是又很常用,我们也要了解一下。
这些变量来自哪里呢?
答:来自第三方库。
比如:Threads里的CMAKE_THREAD_LIBS_INIT,Boost里的Boost_SYSTEM_LIBRARY。
我们通过引用module(组件,模块)的方式引入第三方库。
在cmake自带的变量里,有一个CMAKE_MODULE_PATH ,这个变量是一个路径,这个路径下放着一些Modules。
CMAKE_MODULE_PATH 帮助:大致意思是,这个路径cmake modules存放的默认路径,当使用include或find_package命令的时候,就从这个路径下找对应的module。
用以下命令可以找到cmake modules所在路径,-type d 表示查找目录
sudo find / -iname "modules" -type d | grep -i "cmake"
我的路径是:
/usr/share/cmake-3.5/Modules
Threads 和Boost 都对应的module在这个路径下(FindThreads.cmake和FindBoost.cmake)。
我们通常用find_package引入module(第三方库,感觉翻译成中文不是很准确)。具体操作下一篇博客再谈。
2.查看命令
看帮助文档,找到这么两个option,查看命令的方法:
--help-command-list [<f>] = List commands with help available and exit.
--help-command <cmd> [<f>] = Print help for one command and exit.
一共一百多个命令(command),每个命令的讲解都很长、很详细。
set,find_package,add_executable,add_subdirectory,if,等等。
3.Generators 生成器
generator有很多,先了解下面两个:
Unix Makefiles = Generates standard UNIX makefiles.
Ninja = Generates build.ninja files.
Makefile我们比较熟悉了,前面我们都是cmake CMakeLists.txt生成Makefile,再make,以构建整个工程。
那么,Ninja是什么?
4.总结
Google现在都抛弃GYP,全面使用GN了。我还在学CMake,诶。。继续加油了
推荐两篇博客: