1. 程式人生 > >cmake與autoconf+automake的對比

cmake與autoconf+automake的對比

      首先,拿他們對比本身沒有太多的意義,他們都是產生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要高。


      首先,拿他們對比本身沒有太多的意義,他們都是產生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要高。