一、cmake简介
1.背景知识
cmake 是 kitware 公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍生品,最终形成体系,成为一个独立的开放源代码项目。项目的诞生时间是 2001 年。其官方网站是 www.cmake.org,可以通过访问官方网站获得更多关于 cmake 的信息。cmake的流行其实要归功于 KDE4 的开发(似乎跟当年的 svn 一样,KDE 将代码仓库从 CVS 迁移到SVN,同时证明了 SVN 管理大型项目的可用性),在 KDE 开发者使用了近 10 年 autotools之后,他们终于决定为 KDE4 选择一个新的工程构建工具,其根本原因用 KDE 开发者的话来说就是:只有少数几个“编译专家”能够掌握 KDE 现在的构建体系(admin/Makefile.common),在经历了 unsermake, scons 以及 cmake 的选型和尝试之后,KDE4 决定使用 cmake 作为自己的构建系统。在迁移过程中,进展异常的顺利,并获得了 cmake 开发者的支持。所以,目前的 KDE4 开发版本已经完全使用 cmake 来进行构建。像 kdesvn,rosegarden 等项目也开始使用 cmake,这也注定了 cmake 必然会成为一个主流的构建体系。
2.特点
a.开放源代码,使用类 BSD 许可发布。http://cmake.org/HTML/Copyright.html
b.跨平台,并可生成 native 编译配置文件,在 Linux/Unix 平台,生成 makefile,在苹果平台,可以生成 xcode,在 Windows 平台,可以生成 MSVC 的工程文件。
c.能够管理大型项目,KDE4 就是最好的证明。
d.简化编译构建过程和编译过程。Cmake 的工具链非常简单:cmake+make。
e.高效率,按照 KDE 官方说法,CMake 构建 KDE4 的 kdelibs 要比使用 autotools 来构建 KDE3.5.6 的 kdelibs 快 40%,主要是因为 Cmake 在工具链中没有 libtool。
d.可扩展,可以为 cmake 编写特定功能的模块,扩充 cmake 功能。
二、安装cmake
可以直接在命令行下载cmake:
$ sudo apt-get install cmakek
也可以从官网下载最新版本:
http://www.cmake.org/HTML/Download.html
三、初试cmake
1.首先创建工作文件夹
$ mkdir -p ./cmake/cmTest $ cd cmake/cmTest
2.编写测试代码和CMakeLists.txt
//main.c #include<stdio.h> int main() { printf("Hello world!\n"); return 0; }
//CMakeLists.txt PROJECT (HELLO) SET(SRC_LIST main.c) MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR}) MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR}) ADD_EXECUTABLE(hello ${SRC_LIST})
3.构建工程
$ cmake .
. 表示在当前目录
这里需要注意的地方:
a.CMakeLists.txt文件名的大小写
$ cmake .
CMake Error: The source directory "/home/hwade/hwade/CMake/cmTest2" does not appear to contain CMakeLists.txt.
文件名必须严格按照标题的书写,正确的文件名在书写CMakeLists.txt时关键字和变量会高亮.
b.CMakeLists.txt最后一行的 ${SRC_LIST},在官网中是直接写着SRC_LIST,这样会报错找不到SRC_LIST
$ cmake .
-- This is BINARY dir /home/hwade/hwade/CMake/cmTest -- This is SOURCE dir /home/hwade/hwade/CMake/cmTest -- Configuring done CMake Error at CMakeLists.txt:5 (ADD_EXECUTABLE): Cannot find source file: SRC_LIST Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp .hxx .in .txx -- Build files have been written to: /home/hwade/hwade/CMake/cmTest
尽管错误,同样会生成如下文件:
CMakeCache.txt CMakeFiles
但并未生成makefile文件
正确的执行结果:
$ cmake .
-- This is BINARY dir /home/hwade/hwade/CMake/cmTest -- This is SOURCE dir /home/hwade/hwade/CMake/cmTest -- Configuring done -- Generating done -- Build files have been written to: /home/hwade/hwade/CMake/cmTest
目录中的文件
CMakeCache.txt cmake_install.cmake main.c
CMakeFiles CMakeLists.txt Makefile
输入make命令
$ make
Scanning dependencies of target hello
[100%] Building C object CMakeFiles/hello.dir/main.c.o
Linking C executable hello
[100%] Built target hello
执行完make命令后就会生成可执行文件
$ ls CMakeCache.txt cmake_install.cmake hello Makefile CMakeFiles CMakeLists.txt main.c
$ ./hello Hello World!
4.CMakeLists.txt解释
我们来重新看一下 CMakeLists.txt,这个文件是 cmake 的构建定义文件,文件名是大小写相关的,如果工程存在多个目录,需要确保每个要管理的目录都存在一个
CMakeLists.txt。
a. PROJECT 指令的语法是:
PROJECT(projectname [CXX] [C] [Java])
你可以用这个指令定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的,默认情况表示支持所有语言。这个指令隐式的定义了两个 cmake 变量:
<projectname>_BINARY_DIR 以及<projectname>_SOURCE_DIR,这里就是HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR(所以 CMakeLists.txt 中两个 MESSAGE指令可以直接使用了这两个变量),因为采用的是内部编译,两个变量目前指的都是工程所在路径/home/hwade/CMake/cmTest,后面我们会讲到外部编译,两者所指代的内容会有所不同。同时 cmake 系统也帮助我们预定义了 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR变量,他们的值分别跟 HELLO_BINARY_DIR 与 HELLO_SOURCE_DIR 一致。为了统一起见,建议以后直接使用 PROJECT_BINARY_DIR,PROJECT_SOURCE_DIR,即使修改了工程名称,也不会影响这两个变量。如果使用了<projectname>_SOURCE_DIR,修改工程名称后,需要同时修改这些变量。
b. SET 指令的语法是:
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
现阶段,只需要了解 SET 指令可以用来显式地定义变量即可。比如我们用到的是 SET(SRC_LIST main.c),如果有多个源文件,也可以定义成: SET(SRC_LIST main.c t1.c t2.c)。
c. MESSAGE 指令的语法是:
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...)
这个指令用于向终端输出用户定义的信息,包含了三种类型:
SEND_ERROR,产生错误,生成过程被跳过。
SATUS,输出前缀为—的信息。
FATAL_ERROR,立即终止所有 cmake 过程.
我们在这里使用的是 STATUS 信息输出,演示了由 PROJECT 指令定义的两个隐式变量HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR。
d.ADD_EXECUTABLE指令的语法是:
ADD_EXECUTABLE(hello ${SRC_LIST})
定义了这个工程会生成一个文件名为 hello 的可执行文件,相关的源文件是 SRC_LIST 中定义的源文件列表, 本例中也可以直接写成 ADD_EXECUTABLE(hello main.c)。
原文:http://www.cnblogs.com/catmilk/p/4998053.html