如果你曾经维护过软件包的构建和安装过程,你将对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?的更多相关文章

  1. 使用cmake自动构建工程

    公司引擎是用cmake根据目标平台来构建工程的,刚接触的时候深深体会到cmake的方便:如果目标平台是windows,它可以帮你自动构建出vs工程:如果是安卓,自动构建出eclipse工程,如果是IO ...

  2. CMake

    使用CMake编译跨平台静态库 http://www.tuicool.com/articles/3uu2Yj cmake命令 安装.用法简介 https://fukun.org/archives/04 ...

  3. CMake学习笔记

    C++开发者必备技能CMake  先简单介绍一下,CMake是一个跨平台的编译工具,它可以根据不用的平台,不同的编译环境,生成不同的MakeFile,从而控制编译的过程. 使用CMake的步骤: 1. ...

  4. 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的版本,并且支持 ...

  5. cmake cannot find package

    cmake 找不到package,如 find_package (OpenMesh REQUIRED) 出现错误 在项目的文件夹中找到 FindOpenMesh.cmake 文件,将其所在路径添加到 ...

  6. Cmake的交叉编译

    http://www.cmake.org/Wiki/CMake_Cross_Compiling

  7. CMake命令/函数汇总(翻译自官方手册)

    查看官方文档 cmake命令 选项 CMake变量 CMake命令汇总 / add_custom_command add_custom_target/add_definitions/add_depen ...

  8. 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  9. 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  10. 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

随机推荐

  1. Windows下phpstudy配置tp5的nginx时遇到的奇葩问题

    nginx原来的配置: hosts已经配置好127.0.0.1 到tpdev1.net这个域名 最后结果 No input file specified. 解决方法: 找到原因了,竟然是root的分隔 ...

  2. linux学习笔记:关于环境变量

    (摘自https://blog.csdn.net/llzk_/article/details/53813266之后整合) 1.linux系统的条件 Linux是一个多用户的操作系统,每个用户登录系统时 ...

  3. centos查看自启动服务

    1,查看自启动服务? 2,查看某服务的开机启动状态? 3,启动(关闭,重启,查看)某个服务? 4,设置开机启动或者关闭某个服务? 1,查看自启动服务? systemctl list-unit-file ...

  4. 51-迷宫(一)- java版dfs和bfs

    一天蒜头君掉进了一个迷宫里面,蒜头君想逃出去,可怜的蒜头君连迷宫是否有能逃出去的路都不知道. 看在蒜头君这么可怜的份上,就请聪明的你告诉蒜头君是否有可以逃出去的路. 输入格式 第一行输入两个整数 nn ...

  5. JS整理--闭包

    1.闭包可以访问当前函数以外的变量 function a(){ var date="1"; function b(str){ console.log(str+date) } ret ...

  6. 安装Pygame(Python3.6,windows)

    1. 本机为python3.6的环境 2. 到pygame官网下载对应系统,对应python版本的pygame文件,下载地址:https://pypi.python.org/pypi/Pygame/1 ...

  7. devexpress总结 accordionControl 加载panelcontrol 的快捷方式

    先说保存: UserControl control; private void barButtonItem1_ItemClick(object sender, DevExpress.XtraBars. ...

  8. 数据库子查询和join的比较

    子查询进行SELECT语句嵌套查询,可以一次完成很多逻辑上需要多个步骤才能完成的SQL操作.子查询虽然很灵活,但是执行效率并不高. select goods_id,goods_name from go ...

  9. rtx tiny os

    一,简单测试步骤: 1.  license management包含两项:artx51 real time os, PK51 2. code #include "rtx51tny.h&quo ...

  10. GUI学习之三——QObject学习总结

    鉴于PyQt控件的继承关系,我们先学习PyQt控件的基类——QObject.  一.所有的QT对象的基类 我们先看一下PyQt里空间的继承关系,稍微改一下代码,显示出继承关系 from PyQt5.Q ...