cmake與autoconf+automake的對比
首先,拿他們對比本身沒有太多的意義,他們都是產生makefile檔案的工具。cmake產生的晚,解決了很多autotools工具的問題。autotools是一個工具集具有強大的靈活性,但是因為步驟太多,配置繁瑣,產生了很多的替代方案,cmake是其中最優秀的之一。當然很多其他替代品不會產生makefile檔案而直接具有make的功能了。看到下圖,你是不是感覺有些發暈。
不過還好,它是“八股文”,所有的步驟都是如此。
-
執行autoscan命令
-
將configure.scan 檔案重新命名為configure.in,並修改configure.in檔案
-
在project目錄下新建Makefile.am檔案,並在core和shell目錄下也新建makefile.am檔案
-
在project目錄下新建NEWS、 README、 ChangeLog 、AUTHORS檔案
-
將/usr/share/automake-1.X/目錄下的depcomp和complie檔案拷貝到本目錄下
-
執行aclocal命令
-
執行autoconf命令
-
執行automake -a命令
-
執行./confiugre指令碼
我們再看看cmake的步驟:
- 編寫CMakeLists.txt
- 執行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的功能了。看到下圖,你是不是感覺有些發暈。
不過還好,它是“八股文”,所有的步驟都是如此。
-
執行autoscan命令
-
將configure.scan 檔案重新命名為configure.in,並修改configure.in檔案
-
在project目錄下新建Makefile.am檔案,並在core和shell目錄下也新建makefile.am檔案
-
在project目錄下新建NEWS、 README、 ChangeLog 、AUTHORS檔案
-
將/usr/share/automake-1.X/目錄下的depcomp和complie檔案拷貝到本目錄下
-
執行aclocal命令
-
執行autoconf命令
-
執行automake -a命令
-
執行./confiugre指令碼
我們再看看cmake的步驟:
- 編寫CMakeLists.txt
- 執行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要高。