为什么要使用CMake?
如果你曾经维护过软件包的构建和安装过程,你将对CMake感兴趣。CMake是软件项目的一个开源生成管理器,它允许开发人员以简单的可移植文本文件格式指定生成参数。然后,CMake 使用此文件为本机开发工具(包括Microsoft Visual Studio 、 Apple's Xcode)生成项目文件,以及unix、linux、nmake 和 borland各种类型的Makefiles文件。CMake处理构建软件的困难方面,如跨平台构建、系统内省以及用户自定义生产,使用户能够轻松地为复杂的硬件和软件系统量身定制构建。
对于任何项目,特别是跨平台项目,一般需要一个统一的构建系统。许多项目都带有UNIX makefile和Microsoft Visual Studio工作区。这要求开发人员不断尝试保持两个构建系统的最新和一致。要将其他生成系统(如:Bordand和Xcode)作为目标,需要更多的自定义文件副本,从而造成更大的问题。如果你尝试支持可选组件 (如系统上有 libjpeg 可用的 jpeg 支持), 则会加剧此问题。cmake 通过将这些不同的操作合并成一个简单易懂的文件格式来解决这一难题。
如果你有许多开发人员在一个项目或多个平台上工作,则该软件不得不构建在多台计算机上。考虑到安装一台现代计算机所涉及的软件和自定义选项的范围很广,有可能两台运行相同操作系统的两台计算机有可能略有不同。CMake为单平台多机开发环境提供了许多好处,其中包括:
1、能够自动搜索正在构建的软件所需的程序、库和头文件。其中包括在搜索程序所需的环境变量以及Windows的注册表设置能力。
2、在源文件树之外的目录树中构建的能力。这是许多UNIX平台上一个非常有用的特点。CMake将这一特点移植到了windows上,允许开发人员删除整个构建目录,而不用担心删除源文件。
3、能够为自动生成的文件创建复杂的自定义命令,例如Qt的moc(qt.nokia.com), Insight Toolkit的CABLE封装生成器。这些命令用于在构建过程中生产的源文件,然后再编译到软件中。
4、在配置时能够选择可选组件。例如,VTk的几个库是可选的,并且CMake为用户提供了一个简单的方法来选择生成的库。
5、能够从简单的文本文件中自动生成工作区和项目。这对于具有许多程序或测试用例的系统来说非常方便,每个程序或测试用例都需要单独的项目文件,通常采用IDE手段创建是一个非常繁琐的过程。
6、能够轻松地在静态和共享构建之间切换。CMake知道如何在支持的所有平台上创建共享库和模块。处理复杂的特定于平台的链接器标志,许多UNIX系统都支持诸如内置的运行时搜索的路径的共享释放器等高级功能。
7、自动生成文件依赖关系,并支持大多数平台上的并行构建。
在开发跨平台软件时,CMake提供了许多附加功能:
1、测试机器字节顺序和其他硬件具体特性的能力。
2、一组在所有平台上工作的构建配置文件。这避免了开发人员必须在项目中以几种不同格式维护相同信息的问题。
3、支持在所有平台上构建共享库。
4、使用系统相关信息配置文件的能力,例如数据文件的位置和其他信息。 CMake可以创建包含诸如数据文件的路径和其他信息的头文件,其格式为#define宏。 系统特定的标志也可以放置在配置的头文件中。 这比编译器的命令行-D选项有优势,因为它允许其他构建系统使用CMake构建的库,而不必指定在构建期间使用的完全相同的命令行选项。
1.1 CMake历史
CMake开发于1999年开始,作为由美国国家医学图书馆资助的Insight Toolkit(ITK,www.itk.org)的一部分。 ITK是一个大型软件项目,可在许多平台上运行,并可与许多其他软件包进行交互。 为了支持这一点,需要一个功能强大但易于使用的构建工具。 过去与大型项目的构建系统合作,开发人员设计了CMake来满足这些需求。 此后,CMake不断增长并受到广泛的喜爱,许多项目和开发人员采用它的易用性和灵活性。 自1999年以来,CMake一直处于积极的发展之中,已经成熟,成为广泛构建问题的经过验证的解决方案。 最明显的例子就是成功应用了CMake作为K桌面环境(KDE)的构建系统,可以说是现有的最大的开源软件项目。
CMake最近增加的其中之一是以CTest的形式包含软件测试支持。 测试软件的一部分过程涉及构建软件,可能安装软件,并确定软件的哪些部分适用于当前系统。 这使得CTest成为CMake的逻辑扩展,因为它已经拥有大部分信息。 类似地,一个新的CMake功能是CPack,它旨在支持软件的跨平台分发。 它为您的软件创建本机安装提供了跨平台的方法,利用现有的流行软件包,如NSIS,RPM,Cygwin和PackageMaker。
其他最近添加到 cmake 包括支持苹果的 xcode ide 和支持微软的 visual studio 10。使用 cmake, 一旦您编写了输入文件, 您就可以获得对新编译器的支持, 并免费构建系统, 因为对它们的支持是建立在新的 relaeases 中的 cmake, 而不是与您的软件分发有关。另一个最近添加到 cmake 是支持交叉编译到其他操作系统或嵌入式设备。cmake 中的许多命令现在都能正确处理主机系统和目标平台在交叉 compling 时的差异。
1.2 为什么不使用Autoconf?
在开发CMake之前,CMake的作者对现有的一些可用工具有经验。Autoconf与automake结合提供了与CMake相同的功能,但是在Windows平台上使用这些工具需要安装许多其他工具,而这些工具本来不属于Windows系统内。除了需要大量的工具外,autoconf 可能难以使用或扩展, 而且对于一些容易 cmake 的任务来说是不可能的。即使你在系统上运行了 autoconf 及其所需的环境, 它也会生成Makefiles, 迫使用户使用命令行。另一方面, cmake 提供了一个选择, 允许开发人员生成可以直接从 ide 中使用的项目文件, windows 和 xcode 开发人员都习惯于此。
虽然autoconf支持用户制定的选项,但它不支持依赖选项。其中一个选项依赖于某些其他属性或选择。例如,在CMake中,你可以使用用户选项来启用多线程处理,这取决于首先确定用户的系统是否具有多线程支持。CMake提供了一个交互式的用户界面,使用户可以方便地查看可用的选项以及如何设置它们。
对于UNIX用户,CMake还提供了自动依赖生成,而autoconf无法直接完成。CMake的简单输入格式也比Makefile.in和configure.in文件的最和更容易阅读和维护。CMake具有记忆和链接库依赖信息的能力,这在autoconf/automake中也是没有等价性的。
1.3为什么不使用JAM,qmake,SCons,or ANT?
其他工具,如:ANT, qmake, SCons 以及 JAM分别采用不同的方法来解决这些问题。他们帮助我们构建CMake。在这四个工具中,qmake与CMake最相识,但是它缺少CMake提供的大量的系统询问。qmake的输入格式与传统的Makefile更为密切相关。ANT,JAM和SCons也是跨平台的,但是它们不支持生成本地项目文件。ANT使用XML、JAM使用自己的语言,SCons使用python来摆脱传统的面向文件的输入。许多这些工具直接运行编译器,而不是让系统构建程序执行该任务。许多这些工具都需要其它工具,如python、java的安装才能工作。
1.4为什么不自己写脚本?
一些项目使用现有的脚本语言(如Perl或Python)来配置构建过程。 尽管类似的功能可以通过这样的系统来实现,但过度使用工具可以使构建过程更像复活节彩蛋,而不是简单易用的构建系统。 在构建软件包时,用户被迫找到并安装版本4.3.2,并且3.2.4之前甚至可以启动构建过程。 为了避免这个问题,决定使用CMake不需要比用于构建的软件更多的工具。 至少使用CMake需要一个C编译器,该编译器的本机构建工具和一个CMake可执行文件,CMake是用C ++编写的,只需要一个C ++编译器来构建并且预编译的二进制文件可用于大多数系统。 脚本自己也通常意味着您不会生成本机Xcode或Visual Studio工作区,使Mac和Windows构建有限。
1.5 CMake可以在哪些平台上运行?
CMake可以在各种平台上运行,包括Microsoft Windows,Apple Mac OS X以及大多数UNIX或类UNIX平台。 在撰写本书时,CMake在以下平台上进行了夜间测试:Windows 98/2000 / XP / Vista / 7,AIX,HPUX,IPIX,Linux,Mac OS X,Solaris,OSF,QNX,CYGWIN,MinGW ,和FreeBSD。 您可以查看www.cmake.org获取当前测试平台列表。
同样,CMake支持大多数常见的编译器。 它支持所有CMake支持的平台上的GNU编译器。 其他测试编译器包括Visual Studio 6,10,Intel C,SGI CC,Mips Pro,Borland,Sun CC和HP aCC。 CMake应该适用于开箱即用的大多数UNIX样式编译器。
为什么要使用CMake?的更多相关文章
- 使用cmake自动构建工程
公司引擎是用cmake根据目标平台来构建工程的,刚接触的时候深深体会到cmake的方便:如果目标平台是windows,它可以帮你自动构建出vs工程:如果是安卓,自动构建出eclipse工程,如果是IO ...
- CMake
使用CMake编译跨平台静态库 http://www.tuicool.com/articles/3uu2Yj cmake命令 安装.用法简介 https://fukun.org/archives/04 ...
- CMake学习笔记
C++开发者必备技能CMake 先简单介绍一下,CMake是一个跨平台的编译工具,它可以根据不用的平台,不同的编译环境,生成不同的MakeFile,从而控制编译的过程. 使用CMake的步骤: 1. ...
- VS 2013编译64位版本QT 4.8.6及使用cmake为依赖QT生成VS项目时Could NOT find Qt4
对于一些已经解决的问题,本博客不再讨论.只将本人遇到的问题做简单的说明. 一.VS 2013编译64位版本QT 4.8.6 QT项目官网中,对于QT4,其只提供了windows X86的版本,并且支持 ...
- cmake cannot find package
cmake 找不到package,如 find_package (OpenMesh REQUIRED) 出现错误 在项目的文件夹中找到 FindOpenMesh.cmake 文件,将其所在路径添加到 ...
- Cmake的交叉编译
http://www.cmake.org/Wiki/CMake_Cross_Compiling
- CMake命令/函数汇总(翻译自官方手册)
查看官方文档 cmake命令 选项 CMake变量 CMake命令汇总 / add_custom_command add_custom_target/add_definitions/add_depen ...
- 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
随机推荐
- mysql判断表里面一个逗号分隔的字符串是否包含单个字符串、查询结果用逗号分隔
1.mysql判断表里面一个逗号分隔的字符串是否包含单个字符串 : FIND_IN_SET select * from tablename where FIND_IN_SET(传的参数,匹配字段) 例 ...
- supervisorctl安装使用文档
1.apt-get install supervisor下载或者pip install supervisor(因为supervisor是python写的)supervisor和python项目没有关系 ...
- spring boot 常见的第三方集成
spring boot基于1.x. 一 集成redis 1.1 配置 spring.redis.host = localhost spring.redis.port = 6379 spring.red ...
- ucos中需要注意的全局变量
首先聊一聊全局变量: 在慕课上学习浙大老师的C语言课程的时候,翁恺老师一直在强调在程序中我们要避免使用全局变量,C语言的程序员(尤其像我这样的野生程序员)为了方便,经常会不顾这个编码规范.全局变量有一 ...
- LAB8 android
妈的,标签名字能改成自己的名字,我也是个神人嘞. 明明是去掉两个括号,怎么变成3个了,醉了. 点组件,attribute,可以修改对应的值.非常直观?. content_mail.XML要设置ID才能 ...
- linux systemctl 命令学习
转载:http://www.cnblogs.com/sparkdev/p/8472711.html systemctl 命令有两大类功能: 控制 systemd 系统 管理系统上运行的服务 在介绍这些 ...
- 内置函数-fliter
def is_odd(x): return x % 2 == 1 ret = filter(is_odd, [1,4,6,7,9]) print(ret) for i in ret: print(i) ...
- java实现单例模式
1.饿汉模式 public class Singleton{ private static Singleton instance = new Singleton(); private Singleto ...
- android中ScrollView嵌套ListView或GridView显示位置问题
Android中ScrollView中嵌套ListView或GridView时在开始进入界面时总是显示中间位置,开头的位置显示不出来.这种情况下只需要在ScrollView的父控件中添加以下两行代码即 ...
- web自动化上传附件 2
当我们进行某一项web自动化脚本编写时,有上传附件操作,点击附件直接打开了windows窗口,而有的点击添加附件打开一个小窗体,再点击‘浏览’才打开windows窗口, 中间多了这么一个小窗体的操作, ...