Automake UsersGuide
1. 創建Demo工作空間
mkdir automake_demo
cd automake_demo/
touch hello.c
vim hello.c
2. 插入基本C語言代碼
#include <stdio.h>
int main(int argc, char** argv)
{
printf("Hello, Linux World!\n");
return 0;
}
3. 使用autoscan命令生成configure.scan文件
查看configure.scan內容 cat configure.scan
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT
- AC_PREREQQ宏聲明本文件要求的autoconf版本,這裏是2.69
- AC_INIT定義軟件的名稱和信息。(DULL-PACKAGE-NAME爲軟件名,VERSION爲軟件的版本號,BUG-REPORT-ADDRESS爲bug的報告地址,一般爲軟件作者的郵箱)
- AC_CONFIG_SRCDIR用來偵測指定的源碼文件是否存在,確定源碼目錄的有效性。此處爲當前目錄下hello.c
- AC_CONFIG_HEADER用於生成config.h文件,以便autoheader使用
- AC_PROG_CC用來指定編譯器,以便不指定的時候默認爲gcc
- AC_OUTPUT用來設定config要產生的文件。如果是Makefile,config會把它檢查出來的結果帶入Makefile.in文件產生合適的Makefile.
4. 獲得並且修改configure.ac(或configure.in)
cp configure.scan configure.ac
vim configure.ac
view code
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT(hello, 1.0, [email protected])
AM_INIT_AUTOMAKE(hello,1.0)
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT(Makefile)
5.使用aclocal工具生成aclocal.m4
ubuntu@ubuntu-MS-7C88:~/SambaFolder/automake_demo$ aclocal
6.使用autoconf工具生成configure文件
ubuntu@ubuntu-MS-7C88:~/SambaFolder/automake_demo$ autoconf
7.使用autoheader工具生成config.h.in文件
ubuntu@ubuntu-MS-7C88:~/SambaFolder/automake_demo$ autoheader
8. 手動添加必要的文件 NEWS,README,AUTHORS,ChangeLog
touch NEWS README ChangeLog AUTHORS
9.創建Makefile.am文件
Automake工具會根據config.in中的參量把Makefile.am轉換成Makefile.in文件。在使用Automake之前,要先手動建立Makefile.am文件。
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=hello.c
- AUTOMAKE_OPTIONS爲設置的Automake選項。它有三種等級提供給用戶選擇:foreign,gnu,gnits,默認等級爲gnu.在此使用foreign,它只檢測必須的文件。
- bin_PROGRAMS定義要產生的執行文件名。如果要產生多個可執行文件,則每個文件名用空格隔開。
- hello_SOURCES定義爲hello這個程序所需要的原始文件。如果其中由多個文件組成的,則必須用空格進行隔開。
- 多個源文件處理方式如下
AUTOMAKE_OPTIONS=foreign bin_PROGRAMS=test test_SOURCES=max.h max.c min.h min.c test.c
10.使用Automake生成Makefile.in文件
要使用選項“--add-missing”可以讓Automake自動添加一些必要的腳本文件。
ubuntu@ubuntu-MS-7C88:~/SambaFolder/automake_demo$ automake --add-missing
11.配置 & Cross Compile Configure
-
本地運行自動配置設置文件configure,把Makefile.in編程最終的Makefile.
ubuntu@ubuntu-MS-7C88:~/SambaFolder/automake_demo$ ./configure
-
交叉編譯自動配置設置文件configure,把Makefile.in編程最終的Makefile.
ubuntu@ubuntu-MS-7C88:~/SambaFolder/automake_demo$ ./configure --prefix=/home/ubuntu/SambaFolder/temp --host=aarch64-linux-gnu
12.測試make
ubuntu@ubuntu-MS-7C88:~/SambaFolder/automake_demo$ make
13.運行hello
ubuntu@ubuntu-MS-7C88:~/SambaFolder/automake_demo$ ./hello
流程圖
總結
針對上面提到的各個命令,我們再做些詳細的介紹。
1、autoscan
autoscan是用來掃描源代碼目錄生成configure.scan文件的。autoscan可以用目錄名做爲參數,但如果你不使用參數的話,那麼autoscan將認爲使用的是當前目錄。autoscan將掃描你所指定目錄中的源文件,並創建configure.scan文件。
2、configure.scan
configure.scan包含了系統配置的基本選項,裏面都是一些宏定義。我們需要將它改名爲configure.in
3、aclocal
aclocal是一個perl 腳本程序。aclocal根據configure.in文件的內容,自動生成aclocal.m4文件。
aclocal的定義是:“aclocal - create aclocal.m4 by scanning configure.ac”
m4是 一個宏處理器.將輸入拷貝到輸出,同時將宏展開.宏可以是內嵌的,也可以是用戶定義的.
除了可以展開宏,m4還有一些內建的函數,用來引用文件,執行命令,整數運算,文本操作,循環等.m4既可以作爲編譯器的前端,也可以單獨作爲一個宏處理器.
4、autoconf
autoconf是用來產生configure文件的。configure是一個腳本,它能設置源程序來適應各種不同的操作系統平臺,並且根據不同的系統來產生合適的Makefile,從而可以使你的源代碼能在不同的操作系統平臺上被編譯出來。
在configure.ini中:
#號表示註釋,這個宏後面的內容將被忽略。
-
AC_INIT(FILE)
這個宏用來檢查源代碼所在的路徑
-
AM_INIT_AUTOMAKE(PACKAGE, VERSION)
這個宏是必須的,它描述了我們將要生成的軟件包的名字及其版本號:PACKAGE是軟件包的名字,VERSION是版本號。
當你使用make dist命令時,它會給你生成一個類似helloworld-1.0.tar.gz的軟件發行包,其中就有對應的軟件包的名字和版本號。 -
AC_PROG_CC
這個宏將檢查系統所用的C編譯器。
-
AC_OUTPUT(FILE)
這個宏是我們要輸出的Makefile的名字,我們在使用automake時,實際上還需要用到其他的一些宏,但我們可以用aclocal 來幫我們自動產生。
執行aclocal後我們會得到aclocal.m4文件。
產生了configure.in和aclocal.m4 兩個宏文件後,我們就可以使用autoconf來產生configure文件了。
5、Makefile.am
Makefile.am是用來生成Makefile.in的,需要你手工書寫。Makefile.am中定義了一些內容:
-
AUTOMAKE_OPTIONS
這個是automake的選項。在執行automake時,它會檢查目錄下是否存在標準GNU軟件包中應具備的各種文件,例如AUTHORS、ChangeLog、NEWS等文件。我們將其設置成foreign時,automake會改用一般軟件包的標準來檢查
-
bin_PROGRAMS
這個是指定我們所要產生的可執行文件的文件名。如果你要產生多個可執行文件,那麼在各個名字間用空格隔開。
-
helloworld_SOURCES
這個是指定產生“helloworld”時所需要的源代碼。如果它用到了多個源文件,那麼請使用空格符號將它們隔開。
比如需要helloworld.h,helloworld.c那麼請寫成helloworld_SOURCES= helloworld.h helloworld.c
如果你在bin_PROGRAMS定義了多個可執行文件,則對應每個可執行文件都要定義相對的filename_SOURCES。
6、 automake
我們使用automake --add-missing來產生Makefile.in。
選項--add-missing的定義是“add missing standard files to package”,它會讓automake加入一個標準的軟件包所必須的一些文件。
我們用automake產生出來的Makefile.in文件是符合GNU Makefile慣例的,接下來我們只要執行configure這個shell 腳本就可以產生合適的 Makefile 文件了。
7、 Makefile
在符合GNU Makefiel慣例的Makefile中,包含了一些基本的預先定義的操作:
-
make
根據Makefile編譯源代碼,連接,生成目標文件,可執行文件。
-
make clean
清除上次的make命令所產生的object文件(後綴爲“.o”的文件)及可執行文件。
-
make install
將編譯成功的可執行文件安裝到系統目錄中,一般爲/usr/local/bin目錄。
-
make dist
產生髮布軟件包文件(即distribution package)。這個命令將會將可執行文件及相關文件打包成一個tar.gz壓縮的文件用來作爲發佈軟件的軟件包。
它會在當前目錄下生成一個名字類似“PACKAGE-VERSION.tar.gz”的文件。
PACKAGE和VERSION,是我們在configure.in中定義的AM_INIT_AUTOMAKE(PACKAGE, VERSION)。 -
make distcheck
生成發佈軟件包並對其進行測試檢查,以確定發佈包的正確性。
這個操作將自動把壓縮包文件解開,然後執行configure命令,並且執行make,來確認編譯不出現錯誤,最後提示你軟件包已經準備好,可以發佈了。 -
make distclean
類似make clean,但同時也將configure生成的文件全部刪除掉,包括Makefile。view code
test -z "hello" || rm -f hello rm -f *.o rm -f *.tab.c test -z "" || rm -f test . = "." || test -z "" || rm -f rm -f config.h stamp-h1 rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags rm -f cscope.out cscope.in.out cscope.po.out cscope.files rm -f config.status config.cache config.log configure.lineno config.status.lineno rm -rf ./.deps rm -f Makefile
Notice
如果運行automake --add-missing後出現如下提示
Makefile.am: error: required file './NEWS' not found
Makefile.am: error: required file './README' not found
Makefile.am: error: required file './AUTHORS' not found
Makefile.am: error: required file './ChangeLog' not found
則運行即可
touch NEWS README ChangeLog AUTHORS
Reference
Automake官網
Automake使用說明
Automake-Autoconf使用詳解
附錄
configure.ac宏定義說明
宏 | 作用 | 示例 |
---|---|---|
AC_PREREQ | autoconf最低版本 | AC_PREREQ([2.69]) |
AC_INIT | 初始化包信息,將會自動生成PACKAGE_NAME、PACKAGE_VERSION、PACKAGE_BUGREPORT宏 | AC_INIT([Porject], [1.0], [[email protected]]) |
AC_CONFIG_SRCDIR | 通過檢測目錄中必定存在的文件來判斷目錄是否存在 | AC_CONFIG_SRCDIR([src/main.cpp]) |
AC_CONFIG_HEADERS | 生成config.h文件保存configure.ac定義的宏,此文件可被源文件包含 | AC_CONFIG_HEADERS([config.h]) |
AC_CONFIG_MACRO_DIRS | 指定本地宏文件的存放目錄,.m4後綴的文件都將被保存進此目錄,acloacl命令會自動創建此目錄 | AC_CONFIG_MACRO_DIRS([m4]) |
AC_CONFIG_AUX_DIR | 指定輔助腳本文件的存放目錄 | AC_CONFIG_AUX_DIR([build-aux]) |
AC_MSG_CHECKING | 打印"checking XXX ..." | AC_MSG_CHECKING([for native Win32]) |
AC_MSG_RESULT | 打印checking結果並另起新行 | AC_MSG_RESULT([$os_win32]) |
AC_PROG_INSTALL | 生成安裝腳本 install-sh | AC_PROG_INSTALL |
AC_PROG_LIBTOOL | 使得configure能夠支持--enable-shared、--disable-shared、--enable-static、--disable-static、--with-pic和--without-pic參數 | AC_PROG_LIBTOOL |
AC_PROG_CXX | 自動檢測要使用的C++編譯器 | AC_PROG_CXX |
AC_PROG_CC | 自動檢測要使用的C編譯器 | AC_PROG_CC |
AC_CHECK_HEADERS | 檢測系統頭文件是否存在 | AC_CHECK_HEADERS([sys/socket.h netinet/in.h arpa/inet.h]) |
AC_SUBST | 輸出能夠被Makefile.am使用的變量 | AC_SUBST(GLIB2_CFLAGS) |
AC_CONFIG_SUBDIRS | configure子目錄 | AC_CONFIG_SUBDIRS([spice-common]) |
PKG_CHECK_MODULES | 檢測對應模塊是否存在 | PKG_CHECK_MODULES([SPICE_PROTOCOL], [spice-protocol >= 0.12.11]) |
AC_CHECK_FUNCS | 檢測對應函數是否可用 | AC_CHECK_FUNCS([setlocale]) |
AC_ARG_ENABLE | 爲configure添加--XX選項 | AC_ARG_ENABLE([gstaudio],AS_HELP_STRING([--enable-gstaudio=@<:@yes/auto/no@:>@], [Enable the GStreamer 1.0 audio backend @<:@default=auto@:>@]),[],[enable_gstaudio="auto"]) |
AC_OUTPUT | 運行configure後生成的config腳本需要處理的文件,將Makefile.in變成Makefile | AC_OUTPUT([Makefile]) |
AM_INIT_AUTOMAKE | 初始化automake | AM_INIT_AUTOMAKE([subdir-objects -Wno-portability]) |
AM_GNU_GETTEXT | 初始化gettext | AM_GNU_GETTEXT([external]) |
AM_GNU_GETTEXT_VERSION | 指定gettext最低版本 | AM_GNU_GETTEXT_VERSION([0.19.7]) |
IT_PROG_INTLTOOL | 初始化並指定libtool最低版本 | IT_PROG_INTLTOOL([0.35.0]) |
AM_CONDITIONAL | 根據條件來定義宏 | AM_CONDITIONAL([OS_WIN32],[test "\(os_win32" = "yes"]) #如果\)os_win32的值爲yes則#define OS_WIN32宏 |
Makefile.am宏定義說明
宏 | 作用 | 示例 |
---|---|---|
ACLOCAL_AMFLAGS | 指定宏文件的存放目錄,與AC_CONFIG_MACRO_DIRS成配合使用 | ACLOCAL_AMFLAGS = -I m4 |
SUBDIRS | 指定需要遞歸automake的子文件夾,即存在Makefile.am的子文件夾 | SUBDIRS = spice-common src man po doc data |
EXTRA_DIST | 指定要被打包的額外文件,即執行make dist時需要被放入壓縮包的文件,一般是不需要參與編譯但是又需要被使用的文件,比如圖片目錄裏的圖片 | EXTRA_DIST = $(PACKAGE).spec |
DISTCLEAN_FILES | 執行make distclean時候需要刪除的文件,一般是EXTRA_DIST中的.in文件生成的不需要打包的中間文件 | DISTCLEAN_FILES = $(PACKAGE).spec |
MAINTAINERCLEANFILES | 執行make maintainer-clean時候需要刪除的文件,即執行autoreconf -vfi、intltoolize --force以及configure或執行autogen.sh後能夠重新生成的文件都要放入其中 | MAINTAINERCLEANFILES = $(srcdir)/AUTHORS |
dist-hook | 執行make dist時需要執行的腳本 | dist-hook: gen-ChangeLog gen-AUTHORS |
bin_PROGRAMS | 要生成的可執行文件 | bin_PROGRAMS = spicy |
XX_SOURCES | 編譯可執行文件所需的源文件 | spicy_SOURCES = spicy.c |
XX_LIBADD | 鏈接參數,即pkg-config --libs的結果 | spicy_stats_LDADD = libspice-client-glib-2.0.la |
XX_CFLAGS | 編譯參數,即pkg-config --cflags的結果和-D之類的宏定義 | libvirt_viewer_la_CFLAGS = -DLOCALE_DIR=""./../share/locale"" $(GLIB2_CFLAGS) |
nodist_XX_SOURCES | 執行make dist時不需要被打包的源文件,一般是根據其他源文件通過腳本臨時生成的中間源文件,比如使用glib-genmarshal生成的文件 | nodist_libspice_client_glib_2_0_la_SOURCES = spice-marshal.c spice-marshal.h |
LDADD | 無法被configure找到但是又需要鏈接的庫或資源文件,例如臨時生成的windows下使用的rc文件 | LDADD += virt-viewer_rc.$(OBJEXT) |
dist_XX_DATA | 程序運行需要的數據文件,比如圖標、配置文件等 | dist_cfg_DATA = xx.cfg |
dist_bin_SCRIPTS | 程序的腳本文件,將被安裝到bin目錄 | dist_bin_SCRIPTS = xx.sh |