1. 程式人生 > >Makefile自動生成

Makefile自動生成

1、首先,新建一個測試專案的目錄——hello:mkdir hello
然後,cd hello;編輯一個hello.c的程式碼檔案:
#include <stdio.h>
int main()
{
     printf("hello automake!\n");
}
儲存退出;

2、執行autoscan命令,在當前路徑中生成了autoscan.log  configure.scan兩個新檔案。其中configure.scan檔案的內容如下:
AC_PREREQ(2.57)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([test.c])
AC_CONFIG_HEADER([config.h])
AC_PROG_CC
AC_OUTPUT

3、重新命名configure.scan  為configure.in,編輯它的內容,修改後的內容為:
AC_PREREQ(2.57)
AC_INIT(hello)

AC_CONFIG_SRCDIR([hello.c])
#AC_CONFIG_HEADER([config.h])
AM_INIT_AUTOMAKE(hello, 1.0)
AC_PROG_CC
AC_OUTPUT([Makefile])

說明:Autoconf 是用來產生 'configure'檔案的工具。'configure' 是一個 shell script,它可以自動設定符合各種不同平臺上Unix 系統的特性,並且根據系統引數及環境產生合適的Makefile檔案或C 的標頭檔案(header file),讓原始程式可以很方便地在不同的平臺上進行編譯。Autoconf會讀取 configure.in 檔案然後產生'configure' 這個 shell script。configure.in 檔案內容是一系列GNU m4 的巨集,這些巨集經autoconf處理後會變成檢查系統特性的shell scripts。 configure.in 內巨集的順序並沒有特別的規定,但是每一個configure.in 檔案必須在所有巨集前加入 AC_INIT 巨集,然後在所有巨集的最後加上 AC_OUTPUT巨集。可先用 autoscan 掃描原始檔案以產生一個 configure.scan 檔案,再對 configure.scan 做些修改成 configure.in 檔案。
AC_INIT(FILE) 
該巨集用來檢查原始碼所在路徑,autoscan 會自動產生,一般無須修改它。
AM_INIT_AUTOMAKE(PACKAGE,VERSION) 
這個是使用 Automake 所必備的巨集,PACKAGE 是所要產生軟體套件的名稱,VERSION 是版本編號。 
AC_PROG_CC 
檢查系統可用的C編譯器,若原始碼是用C寫的就需要這個巨集。
AC_OUTPUT(FILE) 
設定 configure 所要產生的檔案,若是Makefile ,configure 便會把它檢查出來的結果帶入 Makefile.in 檔案後產生合適的 Makefile。 

4、執行aclocal
命令,生成了aclocal.m4檔案,一般無需修改這個檔案。
5、新建Makefile.am檔案,編輯內容如下:
            bin_PROGRAMS=test   
            test_SOURCES=test.c
說明:
Automake 會根據 configure.in 中的巨集把Makefile.am 轉成 Makefile.in 檔案。 Makefile.am 檔案定義所要產生的目標: 
AUTOMAKE_OPTIONS
設定 automake 的選項。Automake 主要是幫助開發 GNU 軟體的人員來維護軟體,所以在執行 automake 時,會檢查目錄下是否存在標準 GNU 軟體中應具備的檔案,例如 'NEWS'、'AUTHOR'、'ChangeLog' 等檔案。設定 foreign 時,automake 會改用一般軟體的標準來檢查。 
bin_PROGRAMS 
定義要產生的執行檔名。如果要產生多個執行檔案,每個檔名用空白符隔開
hello_SOURCES 
定義 'hello' 這個執行程式所需要的原始檔案。如果 'hello'這個程式是由多個原始檔案所產生,必須把它所用到的所有原始檔案都列出來,以空白符隔開。假設 'hello' 還需要 'hello.c'、'main.c'、'hello.h' 三個檔案的話,則定義 
hello_SOURCES= hello.c main.c hello.h 
如果定義多個執行檔案,則對每個執行程式都要定義相對的filename_SOURCES

6、 執行autoconf
命令,生成autom4te.cache和configure檔案;
7、執行automake -a命令,生成depcomp  ,install-sh,mkinstalldirs,COPYING,INSTALL, missing檔案;
說明:
編輯好 Makefile.am 檔案,就可以用 automake --add-missing來產生 Makefile.in。加上 --add-missing 選項來告訴 automake順便假如包裝一個軟體所必須的檔案。Automake產生生出來的 Makefile.in 檔案是完全符合 GNU Makefile 的慣例,只要執行 configure這個shell script 便可以產生合適的 Makefile 檔案了。 
在執行automake -a命令時可能會出現以下資訊:
Makefile.am: required file `./NEWS' not found
Makefile.am: required file `./README' not found
Makefile.am: required file `./AUTHORS' not found
Makefile.am: required file `./ChangeLog' not found
這些對結果影響不大,如果不想產生這些讓人誤解的資訊,可以手動建立這些檔案:
>NEWS   
>README   
>AUTHORS   
>ChangeLog   

8、執行./configure,生成了Makefile檔案
9、執行make,生成目標檔案。