CMake提供了各种前端操作的客户端,各平台上的命令行客户端和GUI客户端。先主要看一下命令行操作的方法。
官方教程
,官方API文档
一、简单步骤
0、项目准备:项目的每个目录下都需要有CMakeLists.txt(名字区分大小写)文件
1、cd /path/to/build。#在build目录下运行cmake,因为cmake把当前目录作为build目录,存放生成文件和cache文件
2、cmake /path/to/project。
3、make。#该命令的输入项是位于/path/to/project的CMakeLists.tx文件,该文件可以通过include或add_subdirectory命令添加新的输入文件。
4、./target。#运行生成的程序
5、清理target:make clean。但是make distclean无效,无法清理构建过程文件。所以才在第一步中先进入build目录,这就是所谓的外部构建(out-of-source build)。
二、CMakeLists.txt语法
0、通用规则:
a #开头的行为注释行。
b 指令(参数1 参数2...) 参数使用括弧括起,参数之间使用空格或分号
分开,参数可使用双引号包着SET(SRC_LIST “main.c”)。指令是大小写无关的,参数和变量是大小写相关的。但,推荐指令全部使用大写。
c 变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名
d /字符用作转义字符。
e 用户可以自定义macro和function,用法同command指令
1、变量类型:Lists and Strings
a 变量的基本类型是String
b 变量也可以是list类型。list可被foreach命令枚举、list命令操作。定义list方法如下:
2、流程控制
a 条件判断:if
# some_command will be called if the variable's value is not:
# empty, 0, N, NO, OFF, FALSE, NOTFOUND, or -NOTFOUND.
if(var)
some_command(...)
elseif(var)
other_command(...)
else(var)
last_option(...)
endif(var)
b 循环:foreach
set(VAR a b c)
# loop over a, b,c with the variable f
foreach(f ${VAR})
message(${f})
endforeach(f)
c 循环:while
while(var)
message(${var})
endwhile(var)
d 过程定义:macro 和 function
函数在2.6及以上版本才支持,函数和宏的区别在于函数中可定义局部变量,而宏定义的变量都是全局变量,或者应该是函数是局部的,宏是全局的。
# define a macro hello
macro(hello MESSAGE)
message(${MESSAGE})
endmacro(hello)
# call the macro with the string "hello world"
hello("hello world")
# define a function hello
function(hello MESSAGE)
message(${MESSAGE})
endfunction(hello)
3、支持正则表达式
^ Matches at beginning of a line or string
$ Matches at end of a line or string
. Matches any single character other than a newline
[ ] Matches any character(s) inside the brackets
[^ ] Matches any character(s) not inside the brackets
[-] Matches any character in range on either side of a dash
* Matches preceding pattern zero or more times
+ Matches preceding pattern one or more times
? Matches preceding pattern zero or once only
() Saves a matched expression and uses it in a later replacement
三、命令API
虽然说Kitware有点儿不厚道的在卖Mastering CMake
这本书,而且貌似网上没有电子版,但是官方提供的文档
还是够用的。在写这篇心得时cmake是2.8版本。
文档也可以通过“cmake --help-html > help_name.html”在当前运行目录生成。
1、command api
2、variables api
四、使用技巧
1、如何在构建过程中打印debug等信息到console?
使用MESSAGE命令。message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] "message to display" ...)
2、过程文件和最终构建的目标文件的路径设置问题。
cmake有一些预定义的变量来设置各种路径。
PROJECT_BINARY_DIR:运行目录,生成过程文件的目录。运行cmake ..的工作目录。这个目录总会有些过程文件生成,因此需要外部构建。
PROJECT_SOURCE_DIR:代码目录,运行cmake ..时..指定的目录
工程组织方式:
proj +
|
+src
+bin
+build
| + bin_1
+CMakeLists.txt
一般在CMakeLists.txt文件中用ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])指定src、bin目录,可以用相对路径也可以用绝对路径。
但
是要注意,如果用相对路径的话,source_dir是相对PROJECT_SOURCE_DIR(这里是proj目录)的,binary_dir是相对
PROJECT_BINARY_DIR(这里是build)的。所以如果是add_subdirectory(src
bin)的话,bin是build下面的bin_1。
EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH 定义纯净的最终目标文件位置,可以通过下面方法修改
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
1、预定义变量
PROJECT_BINARY_DIR
PROJECT_SOURCE_DIR
EXECUTABLE_OUTPUT_PATH
LIBRARY_OUTPUT_PATH
CMAKE_INSTALL_PREFIX
2、基本指令
PROJECT(projectname [CXX] [C] [Java])
SET(VAR [VALUE [VALUE2] [VALUE3]] [CACHE TYPE DOCSTRING [FORCE]])
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)
ADD_EXECUTABLE(targetRunable ${SRC_LIST})
ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
目录的安装:INSTALL(DIRECTORY src_dirs... DESTINATION <dir>
[FILE_PERMISSIONS permissions...]
[DIRECTORY_PERMISSIONS permissions...]
[USE_SOURCE_PERMISSIONS]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[[PATTERN <pattern> | REGEX <regex>] [EXCLUDE] [PERMISSIONS permissions...]][...])
DIRECTORY 后面连接的src_dirs注意abc 和 abc/有很大的区别。如果目录名不以/结尾,那么这个目录将被安装为目标路径下的 abc,如果目录名以/结尾, 代表将这个目录中的内容安装到目标路径,但不包括这个目录本身。
3、换个地方保存目标二进制:在 ADD_EXECUTABLE 或 ADD_LIBRARY所在的CMakeLists.txt文件里面定义
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
分享到:
相关推荐
多种构建系统支持:CMake可以生成多种构建系统的脚本,包括Makefile、Ninja、Visual Studio等。这使得开发人员可以使用自己熟悉的构建系统来构建项目。 自动依赖管理:CMake可以自动检测项目的依赖关系,并在构建...
tbb, Intel r5与CMake构建系统 Intel(R) 线程生成块 这是目前基于TBB更新,并且将不时更新以跟踪最新版本的git知识库。 唯一的修改是添加基于的构建系统。因为r5可以很容易地使用git子模块和简单的add_subdirectory ...
aapt cmake构建系统,支持mac和linux(ubuntu 16.0.,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!Linux系统是一个免费使用和自由传播的类Unix...
这是在ubuntu16.04系统下,用C++通过cmake构建qt5.12的工程模板。 自动根据.ui文件生成.h和cpp文件,利用qtcreator修改.ui文件后,无需其他设置,直接make可生成修改后的界面。 使用方法一:按照普通的cmake工程...
本文介绍了一个跨平台的自动化构建系统 CMake 在 linux 上的使用方法。 CMake 是一个比 automake 更加容易使用的工具,能够使程序员从复杂的编译连接过程中解脱出来。文中通过一些例子介 绍使用 CMake 处理多源...
CPython CMake构建系统概述CPython的替代构建系统。 此构建系统具有以下优点: 在构建本身中,没有使用用于目标体系结构的已编译程序。 这使交叉编译更容易,更不易出错,并减少了手动操作。 所有平台的构建信息都...
OpenSSL-CMake:带有CMake构建系统的OpenSSL
cmake安装包,构建win10编译系统
如果你曾经维护过软件包的构建和安装过程,你将...CMake允许用户通过简单的裁剪构建出复杂的硬件和软件系统,解决了软件构件中多个方面的难题,例如跨平台构建,系统鉴别(system introspection)以及用户自定义构建。
Go 有一个经过深思熟虑的构建系统。 可以让它与 CMake 一起玩吗? 这是一个尝试。 指示 在顶级文件中,包含 : cmake_minimum_required(VERSION 3.0) include(bld/cmake/GolangSimple.cmake) add_subdirectory...
CMake必须和本地构建系统联合使用,在每个源码目录中,需要编写CMakeLists.txt文件,以声明如何生成标准的构建文件(例如GNU Make的Makefiles,或者MSVS的解决方案)。 CMake支持所有平台的内部构建(in-source ...
cmake可执行程序是CMake的命令行界面。它可以用脚本对工程进行配置。工程配置设置可以在命令行中使用-D选项指定。使用-i选项,cmake将通过...CMake产生一个适用于具体平台的构建系统,用户使用这个系统构建自己的工程。
cmake-3.23.2-windows-x86_64.msi是用于Windows操作系统的CMake构建工具的安装程序文件。CMake是一个开源跨平台的构建工具,用于自动生成针对不同编译器和操作系统的构建脚本。该安装程序为Windows x86_64架构提供了...
(admin/Makefile.common),在经历了unsermake, scons以及cmake的选型和尝试之后,KDE4决定使用cmake作为自己的构建系统。在迁移过程中,进展异常的顺利,并获得了cmake开发者的支持。所 以,目前的KDE4开发版本已经...
试之后,KDE4 决定使用 cmake 作为自己的构建系统。在迁移过程中,进展异常的顺利,并 获得了 cmake 开发者的支持。所以,目前的 KDE4 开发版本已经完全使用 cmake 来进行构 建。像 kdesvn,rosegarden 等项目也...
使用基于CMake的构建系统构建的模块示例。 这对于具有现有CMake项目结构的C ++代码库很有用。 在许多情况下,这被取代,后者使用 ,这是CMake制造商的工具,旨在允许从CMake驱动Python包。 但是,在某些情况下,您...
CMake 是一个跨平台的开源构建工具,用于生成用于各种编译器、开发环境和操作系统的构建脚本(如 Makefile、Visual Studio 解决方案等)。它提供了一种简化构建过程的方式,可以自动化构建、测试和安装软件。 以下是...
CMakeBuilder的 直接在Sublime Text 3中... 在.sublime-project中.sublime-project出新的构建系统。 按CTRL + B或⌘ + B。 按F4键跳到错误和/或警告。 有关更多选项,请参见下面的示例项目。 参考 CMake字典 所谓
CMake全称为“cross platform make”,是一个开源的跨平台自动化构建系统。使用指定名为CMakeLists.txt的配置文件可以控制软件的构建、测试和打包等流程。同时,通过编写平台无关的CMakeLists.txt文件和需要简单的...
cmake-utils为跨平台构建系统定义了额外的模块和框架。 去做 根据修改编码风格。 学分 执照 版权所有 Florian Wolters 2014 ( )。 在 Boost 软件许可下分发,版本 1.0。 (请参阅随附文件或复制到...