Automake第二篇 automake教程

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章