cmake与autoconf+automake的对比


分类:
C++


619人阅读
评论(0)
收藏
举报

首先,拿他们对比本身没有太多的意义,他们都是产生makefile文件的工具。cmake产生的晚,解决了很多autotools工具的问题。autotools是一个工具集具有强大的灵活性,但是因为步骤太多,配置繁琐,产生了很多的替代方案,cmake是其中最优秀的之一。当然很多其他替代品不会产生makefile文件而直接具有make的功能了。看到下图,你是不是感觉有些发晕。

不过还好,它是“八股文”,所有的步骤都是如此。

  1. 运行autoscan命令

  2. 将configure.scan 文件重命名为configure.in,并修改configure.in文件

  3. 在project目录下新建Makefile.am文件,并在core和shell目录下也新建makefile.am文件

  4. 在project目录下新建NEWS、 README、 ChangeLog 、AUTHORS文件

  5. 将/usr/share/automake-1.X/目录下的depcomp和complie文件拷贝到本目录下

  6. 运行aclocal命令

  7. 运行autoconf命令

  8. 运行automake -a命令

  9. 运行./confiugre脚本

我们再看看cmake的步骤:

  1. 编写CMakeLists.txt
  2. 运行cmake命令

9比2,当然不是比分是步骤。

那我们再来看一下他们的主要工作,他们的配置文件吧:

  • atuoconfig的配置文件configure.ac我们通过autosan生成,我们只需要修改就可以、autoconfig的配置文件Makefile.am我们需要自己手工从头编写;
  • cmake的配置文件CMakeLists.txt需要手工编写,当然cmake提供了gui的配置工具供大家使用;

我们再看看他们配置文件的内容吧,这是我们的比较的重点,因为这是我们实际使用的关键步骤:

autotools cmake
变量定义 name=... set(name, "...")
环境检测 AC_INIT

测试程序

AC_PROG_CC

测试函数库

AC_CHECK_LIB([pthread], [pthread_rwlock_init])

AC_PROG_RANLIB

测试头文件

测试类型定义

测试结构

测试编译器特性

测试库函数

测试系统调用

AC_OUTPUT

find_library(lib libname pathllist)

find_package(packename)

find_path(var name pathlist)

find_program(var name pathlist)

子目录 SUBDIRS= add_subdirectory(list)
可执行文件 bin_PROGRAMS=binname

binname_SOURCES=

binname_LDADD=

binname_CFLAGS=

binname_LDFLAGS=

add_executable(binname ${sources})

target_link_libraries(binname librarylist)

动态库 lib_LIBRARIES=libname.so

libname_SOURCES=

add_library(libname shared ${source} )
静态库 lib_LIBRARIES=libname.a

libname_a_SOURCES=

add_library(libname static ${source} )
头文件 INCLUDES=

include_HEADES=

或CFLAGS=-I

include_directories(list)
源码搜索 aux_source_directories(. list)
依赖库 LIBS=

LDADD=

target_link_libraries(binname librarylist)
标志 CFLAGS=

LDFLAGS=

set(CMAKE_C_FLAGS ...)
libtool AC_PROG_LIBTOOL

lib_LTLIBRARIES=name.la

name_la_SOURCES=

安装设置
install(TARGETS targets...

[[ARCHIVE|LIBRARY|RUNTIME][DESTINATION

< dir >][PERMISSIONS permissions...]

[CONFIGURATIONS[Debug|Release|...]]

[COMPONENT < component >][OPTIONAL]] [...])

其他文件 EXTRA_DIST install(FILES files.. )

install(DIRECTORY dirs..)

条件语句 使用Make的条件语句

if()

endif

if(my)

else(my)

endif(my)

while(condition)

endwhile(condition)

执行外部命令 exec_program(commd )
子模块 include()
信息输出 messge(STATUS "messge")
项目 project(name)

我知道的就这些,大家可以帮忙指正补充。cmake相比autotool确实好用,包括KDE在内的很多大型项目也都在使用cmake。不过autotools的使用率仍旧比cmake要高。