`

系统构建之CMake

 
阅读更多

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新版构建工具

    多种构建系统支持:CMake可以生成多种构建系统的脚本,包括Makefile、Ninja、Visual Studio等。这使得开发人员可以使用自己熟悉的构建系统来构建项目。 自动依赖管理:CMake可以自动检测项目的依赖关系,并在构建...

    tbb, Intel r5与CMake构建系统.zip

    tbb, Intel r5与CMake构建系统 Intel(R) 线程生成块 这是目前基于TBB更新,并且将不时更新以跟踪最新版本的git知识库。 唯一的修改是添加基于的构建系统。因为r5可以很容易地使用git子模块和简单的add_subdirectory ...

    Linux系统设计-aapt cmake构建系统

    aapt cmake构建系统,支持mac和linux(ubuntu 16.0.,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!Linux系统是一个免费使用和自由传播的类Unix...

    C++通过CMake构建QT 5.12的工程模板

    这是在ubuntu16.04系统下,用C++通过cmake构建qt5.12的工程模板。 自动根据.ui文件生成.h和cpp文件,利用qtcreator修改.ui文件后,无需其他设置,直接make可生成修改后的界面。 使用方法一:按照普通的cmake工程...

    在Linux下使用CMake构建应用程序.pdf

    本文介绍了一个跨平台的自动化构建系统 CMake 在 linux 上的使用方法。 CMake 是一个比 automake 更加容易使用的工具,能够使程序员从复杂的编译连接过程中解脱出来。文中通过一些例子介 绍使用 CMake 处理多源...

    python-cmake-buildsystem:一个用于编译Python的cmake构建系统

    CPython CMake构建系统概述CPython的替代构建系统。 此构建系统具有以下优点: 在构建本身中,没有使用用于目标体系结构的已编译程序。 这使交叉编译更容易,更不易出错,并减少了手动操作。 所有平台的构建信息都...

    OpenSSL-CMake:带有CMake构建系统的OpenSSL

    OpenSSL-CMake:带有CMake构建系统的OpenSSL

    cmake安装包,构建win10编译系统

    cmake安装包,构建win10编译系统

    mastering-cmake.zip

    如果你曾经维护过软件包的构建和安装过程,你将...CMake允许用户通过简单的裁剪构建出复杂的硬件和软件系统,解决了软件构件中多个方面的难题,例如跨平台构建,系统鉴别(system introspection)以及用户自定义构建。

    go_cmake:使用 cmake 构建一个 go 项目

    Go 有一个经过深思熟虑的构建系统。 可以让它与 CMake 一起玩吗? 这是一个尝试。 指示 在顶级文件中,包含 : cmake_minimum_required(VERSION 3.0) include(bld/cmake/GolangSimple.cmake) add_subdirectory...

    cmake-3.10.2.tar.gz

    CMake必须和本地构建系统联合使用,在每个源码目录中,需要编写CMakeLists.txt文件,以声明如何生成标准的构建文件(例如GNU Make的Makefiles,或者MSVS的解决方案)。 CMake支持所有平台的内部构建(in-source ...

    CMake中文手册

    cmake可执行程序是CMake的命令行界面。它可以用脚本对工程进行配置。工程配置设置可以在命令行中使用-D选项指定。使用-i选项,cmake将通过...CMake产生一个适用于具体平台的构建系统,用户使用这个系统构建自己的工程。

    cmake-3.23.2-windows-x86-64.msi

    cmake-3.23.2-windows-x86_64.msi是用于Windows操作系统的CMake构建工具的安装程序文件。CMake是一个开源跨平台的构建工具,用于自动生成针对不同编译器和操作系统的构建脚本。该安装程序为Windows x86_64架构提供了...

    cmake 基础教程 多平台工程构建工具

    (admin/Makefile.common),在经历了unsermake, scons以及cmake的选型和尝试之后,KDE4决定使用cmake作为自己的构建系统。在迁移过程中,进展异常的顺利,并获得了cmake开发者的支持。所 以,目前的KDE4开发版本已经...

    CMake Practice中文版

    试之后,KDE4 决定使用 cmake 作为自己的构建系统。在迁移过程中,进展异常的顺利,并 获得了 cmake 开发者的支持。所以,目前的 KDE4 开发版本已经完全使用 cmake 来进行构 建。像 kdesvn,rosegarden 等项目也...

    cmake_example:使用基于CMake的构建系统构建的示例pybind11模块

    使用基于CMake的构建系统构建的模块示例。 这对于具有现有CMake项目结构的C ++代码库很有用。 在许多情况下,这被取代,后者使用 ,这是CMake制造商的工具,旨在允许从CMake驱动Python包。 但是,在某些情况下,您...

    Cmake 3.27版本

    CMake 是一个跨平台的开源构建工具,用于生成用于各种编译器、开发环境和操作系统的构建脚本(如 Makefile、Visual Studio 解决方案等)。它提供了一种简化构建过程的方式,可以自动化构建、测试和安装软件。 以下是...

    CMakeBuilder:直接在Sublime Text 3中配置,构建和测试CMake项目

    CMakeBuilder的 直接在Sublime Text 3中... 在.sublime-project中.sublime-project出新的构建系统。 按CTRL + B或⌘ + B。 按F4键跳到错误和/或警告。 有关更多选项,请参见下面的示例项目。 参考 CMake字典 所谓

    cmake安装包

    CMake全称为“cross platform make”,是一个开源的跨平台自动化构建系统。使用指定名为CMakeLists.txt的配置文件可以控制软件的构建、测试和打包等流程。同时,通过编写平台无关的CMakeLists.txt文件和需要简单的...

    cmake-utils:跨平台构建系统 CMake 的实用程序

    cmake-utils为跨平台构建系统定义了额外的模块和框架。 去做 根据修改编码风格。 学分 执照 版权所有 Florian Wolters 2014 ( )。 在 Boost 软件许可下分发,版本 1.0。 (请参阅随附文件或复制到...

Global site tag (gtag.js) - Google Analytics