如何自動生成Makefile
如何自動生成Makefile如果隻是一個很小的程序,沒有幾個文件,那麼,我們手工書寫Makefile還是可以忍受的,如果是一個超大型的工程,誰能忍受的了,光一個Makefile文件就足以是Writer頭疼了,但也沒有人說一定要手工書寫makefile文件。linux中提供了自動生成Makefile的工具,而且通過,這些工具生成的makefile還很符合GNU的習慣的。而且功能也很齊全。
自動生成makefile需要些工具來支持:autoscan,aclocal,autoconf,automake如果需要生成動態庫還需要libtool。
舉例子來說,假如我有test.c,p1.c,p2.c,myheader.h這幾個文件,而且test.c需要調用在myheader.h中聲明過的p1,p2函數,他們分別有p1.c,p2.c來實現。
首先,進入上麵幾個文件的目錄,然後執行autoscan,autoscan用來掃描源代碼目錄並生成cinfigure.scan文件,和一個日誌文件,但對我們來說有用的是前者:
$autoscan
之後就會生成autoscan.log configure.scan這兩個文件,為了簡單,我將所有的注釋(以#開頭)都刪除了,打開configure.scan:
AC_PREREQ(2.59)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([p1.c])
AC_CONFIG_HEADER([config.h])
AC_PROG_CC
AC_OUTPUT
然後修改該文件,為後來使用作準備:
AC_INIT(test.c)
AM_INIT_AUTOMAKE(test, 1.0)
AC_PROG_CC
AC_OUTPUT(Makefile)
後麵在解釋為什麼要這麼修改。做完上麵的工作之後,我們要將configure.scan改名為configure.in讓aclocal使用,他是一個perl腳本程序,他根據configure.in文件的內容生成aclocal.m4文件
$aclocal
然後就是生成configure腳本文件,
$autoconf
這樣ls後就會有一個configure的可執行的文件。當然,工作到這還沒有結束,我們還要寫一個Makefile.am文件,用來生成Makefile.in文件。
AUTOMAKE_OPTIONS= foreign
bin_PROGRAMS= test
test_SOURCES= test.c p1.c p2.c myheader.h
這樣就生成一個Makefile.in的文件,此時運行一下configure腳本就會得到Makefile,打開之後會發現,太豐富了!make一下可執行的test被編譯好了。
上麵的工作可以用下麵的圖來表示:
autuscan -> (configure.scan) -> (configure.in) | -> autoconf ->(configure) -->(Makefile)
| | -> aclocal -> (aclocal.m4) -v
---------------------------------------v
(Makefile.am) -> automake-> (Makefile.in) -^
下麵來分別解釋一下上麵的文件和命令:
autoscan : 用來掃描源代碼的目錄生成configure.scan,如果不指定掃描目錄,則他會掃描當前工作目錄,
configure.scan : 包含了係統配置的基本選項,一般用來製作configure.in文件。
configure.in : 該文件的內容都是一些宏,其中的順序沒有硬性的規定,不過建議的順序是:
AC_INIT
測試程序
測試函數
測試頭文件
測試類型定義
測試結構
測試編譯器
測試庫函數
測試係統調用
AC_OUTPOUT
更詳細的請參閱《GNU/Linux編程指南(第二版)》
aclocal: 根據configure.in的內容自動生成aclocal.m4文件,其定義為:alocal : creat alocal.m4 by scanning configure.ac
alocal.m4 : 在執行automake的時候還需要其他的一些宏,這就由alocal產生。當有了 configure.in和alocal.m4兩個宏文件後,就可以用automake來產生Makefile.in文件了。
autoconf: 用來產生configure腳本程序。
configure: 他能根據不同的係統,產生不同的Makefile,從而是我們的程序具有可移植性。他還有一些參數:
--cache-file=FILE 測試係統的特性,並將結果放到FILE中
--help 輸出幫助信息
--no-create 阻止其生成輸出文件
--quiet 執行是不做輸出
--silent 同上,若設置則不會有任何輸出到屏幕
--version 輸出automake的版本號
--prefix=PEWFIX 安裝位置設置(常用)
--exec-prefix=EPREFIX 設置結構倚賴的文件的安裝位置
--bindir=DIR 指定可執行文件的安裝位置.
--sbindir=DIR 指定超級用戶可執行的安裝位置.
--libexecdir=DIR 指定可執行支持文件的安裝位置.
--datadir=DIR 指定通用數據文件的安裝位置.
--sysconfdir=DIR 指定隻讀數據的安裝位置.
--sharedstatedir=DIR 指定共享的可寫數據的安裝位置.
--localstatedir=DIR 指定(非共享)可寫數據的安裝位置.
--libdir=DIR 指定庫文件的安裝位置.
--includedir=DIR 指定C頭文件的安裝位置.
--oldincludedir=DIR 指定為除GCC外編譯器安裝的C頭文件的安裝位置.
--infodir=DIR 指定Info格式文檔的安裝位置.
--mandir=DIR 指定手冊頁的安裝位置.
--srcdir=DIR 源碼的位置
--program-prefix=PREFIX 增加安裝程序名字前綴.
--program-suffix=SUFFIX 增加安裝程序名字後綴.
--program-transform-name=PROGRAM 產生安裝名
--build=BUILD 指定軟件包安裝的係統平台.
--host=HOST 指定軟件運行的係統平台.
--target=GARGET 指定軟件麵向的係統平台
--disable-FEATURE 提供為大型選項的編譯時配置
--enable-FEATURE[=ARG] 提供了一些默認被禁止的特性
--enable-FEATURE=no 同--disable-FEATURE
--with-PACKAGE[=ARG] 使用已有軟件包和庫
--with-PACKAGE=no --without-PACKAGE同義
--without-PACKAGE 禁止軟件包與係統已有的軟件包交互
--x-includes=DIR --with-PACKAGE的一個特例
--x-libraries=DIR 向configure腳本指明包含X11庫的目錄
makefile.am : 根據他生成makefile.in文件。
AUTOMAKE_OPTIONS = foreign 設置automake的選項,設置成foreign表示按一般軟件處理。
bin_PROGRAMS = filename1 [...] 產生的可執行文件名
filename1_SOURCES = f1.c f2.c 指明生成filename可執行文件的源碼
[...]
filename_LDADD =
filename_LDFLAGS =
filename_DEPENDENCIES =
靜態庫lib_LIBRARIES = libfilename.a
filename_a_SOURCES =
filename_a_LDADD =
filename_a_LIBADD =
filename_a_LDFALGS =
頭文件include_HEADERS = filename.h
數據文件data_DATA = data1 data2
(對於可執行文件和靜態庫類型如果隻想編譯,不想安裝到係統中,可以用:noinst_PROGRAMS代替bin_PROGRAMS
和noinst_LIBRARIES代替lib_LIBRARIES)
automake : 使用automake --add-missing來生成Makefile.in文件,後麵的選項使我們製作出來的Makfile符合GNU的習慣,
Makefile : GNU的習慣:
make 編譯,連接,生成可執行文件;
make clean 清除編譯產生的obj文件,以及可執行文件;
make install 安裝到係統中,一般是/usr/local/bin
make dist 將源碼打包,以便發布
make diskcheck 生成包,並對其進行檢查,以確保其正確性;
最後更新:2017-04-03 12:55:22
上一篇:
Oracle 取出多個字段列中的最大值和最小值
下一篇:
[C/C++基礎知識] main函數的參數argc和argv
hibernate 的主鍵生成策略小結
穀歌地圖躍居蘋果應用店第一
PHP使用Smarty模板目錄結構配置
Android開發-ScrollView嵌套GridView的解決辦法
中國光伏為何這麼牛?四家“全球領跑”企業寫著答案
C++編程規範之45:總是一起提供new和delete
在 Linux 係統下使用 PhotoRec & TestDisk 工具來恢複文件
我在華為的半打歲月
J2EE中getParameter與getAttribute以及EL表達式${requestScope}和${param[]}
Logtail技術分享(一) : Polling + Inotify 組合下的日誌保序采集方案