1. 程式人生 > >linux下automake用法

linux下automake用法

作為Linux下的程式開發人員,大家一定都遇到過Makefile,用make命令來編譯自己寫的程式確實是很方便。一般情況下,大家都是手工寫一個簡單Makefile,如果要想寫出一個符合自由軟體慣例的Makefile就不那麼容易了。

  在本文中,將給大家介紹如何使用 autoconfautomake兩個工具來幫助我們自動地生成符合自由軟體慣例的Makefile,這樣就可以象常見的GNU程式一樣,只要使用“./configure”,“make”,“make install”就可以把程式安裝到Linux系統中去了。這將特別適合想做開放原始碼軟體的程式開發人員,又或如果你只是自己寫些小的Toy程式,那麼這個文章對你也會有很大的幫助。

編譯一個簡單的原始檔main.c,需要自動生成一個makefile,以下是步驟:

第一步:

----------

在/root/project/main目錄下建立一個檔案main.c,其內容如下:

------------------------------------------------

#include <stdio.h>

int main(int argc, char** argv)

{

    printf("Hello, Auto Makefile!\n");

    return 0;

}

------------------------------------------------

此時狀態如下:

[[email protected] main]# pwd

/root/project/main

[[email protected] main]# ls

main.c

[[email protected] main]#

第二步:

----------

執行 autoscan , 自動建立兩個檔案 autoscan.log configure.scan

此時狀態如下:

[[email protected] main]# autoscan

[[email protected] main]# ls

autoscan.log configure.scan

 main.c

[[email protected] main]#

第三步:

----------

修改configure.scan的檔名為configure.in

檢視configure.in的內容:

------------------------------------------------

#                                               -*- Autoconf -*-

# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.61)

AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)

AC_CONFIG_SRCDIR([main.c])

AC_CONFIG_HEADER([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

------------------------------------------------

解讀以上的檔案:

------------------------------------------------

#                                               -*- Autoconf -*-

# Process this file with autoconf to produce a configure script.

# AC_PREREQ:

# 確保使用的是足夠新的Autoconf版本。如果用於建立configure的Autoconf的版

# 本比version 要早,就在標準錯誤輸出列印一條錯誤訊息並不會建立configure。

AC_PREREQ(2.61)

#

# 初始化,定義軟體的基本資訊,包括設定包的全稱,版本號以及報告BUG時需要用的郵箱地址

#

AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)

#

# 用來偵測所指定的原始碼檔案是否存在,來確定原始碼目錄的有效性

#

AC_CONFIG_SRCDIR([main.c])

#

# 用於生成config.h檔案,以便autoheader使用

#

AC_CONFIG_HEADER([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.

#

# 建立輸出檔案。在`configure.in'的末尾呼叫本巨集一次。

#

AC_OUTPUT

------------------------------------------------

修改動作:

    1.修改AC_INIT裡面的引數: AC_INIT(main,1.0, [email protected])

    2.新增巨集AM_INIT_AUTOMAKE, 它是automake所必備的巨集,也同前面一樣,PACKAGE是所要產生軟體套件的名稱,VERSION是版本編號。

    3.在AC_OUTPUT後新增輸出檔案Makefile

修改後的結果:

------------------------------------------------

#                                               -*- Autoconf -*-

# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.61)

AC_INIT(main, 1.0, [email protected]m)

AC_CONFIG_SRCDIR([main.c])

AC_CONFIG_HEADER([config.h])

AM_INIT_AUTOMAKE(main,1.0)

# 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])

------------------------------------------------

第四步:

執行 aclocal, 生成一個“aclocal.m4”檔案和一個緩衝資料夾autom4te.cache,該檔案主要處理本地的巨集定義。

此時的狀態是:

[[email protected] main]# aclocal

[[email protected] main]# ls

aclocal.m4 autom4te.cache autoscan.log configure.in configure.in~ main.c

[[email protected] main]#

第五步:

執行 autoconf, 目的是生成 configure

此時的狀態是:

[[email protected] main]# autoconf

[[email protected] main]# ls

aclocal.m4      autoscan.log configure.in   main.c

autom4te.cache configure     configure.in~

[[email protected] main]#

第六步:

執行 autoheader,它負責生成config.h.in檔案。該工具通常會從“acconfig.h”檔案中複製使用者附加的符號定義,因此此處沒有附加符號定義,所以不需要建立“acconfig.h”檔案。

此時的狀態是:

[[email protected] main]# autoheader

[[email protected] main]# ls

aclocal.m4      autoscan.log configure     configure.in~

autom4te.cache config.h.in   configure.in main.c

[[email protected] main]#

第七步:

下面即將執行 automake, 但在此之前應該做一下準備工作!

首先

建立一個 Makefile.am.這一步是建立Makefile很重要的一步,automake要用的指令碼配置檔案是Makefile.am,使用者需要自己建立相應的檔案。之後,automake工具轉換成Makefile.in。

這個Makefile.am的內容如下:

------------------------------------------------

AUTOMAKE_OPTIONS=foreign

bin_PROGRAMS=main

main_SOURCES=main.c

------------------------------------------------

下面對該指令碼檔案的對應項進行解釋。

    其中的AUTOMAKE_OPTIONS為設定automake的選項。由於GNU(在第1章中已經有所介紹)對自己釋出的軟體有嚴格的規範,比如必須附 帶許可證宣告檔案COPYING等,否則automake執行時會報錯。automake提供了三種軟體等級:foreign、gnu和gnits,讓用 戶選擇採用,預設等級為gnu。在本例使用foreign等級,它只檢測必須的檔案。

    bin_PROGRAMS定義要產生的執行檔名。如果要產生多個執行檔案,每個檔名用空格隔開。

    main_SOURCES定義“main”這個執行程式所需要的原始檔案。如果”main”這個程式是由多個原始檔案所產生的,則必須把它所用到的所有原 始檔案都列出來,並用空格隔開。例如:若目標體“main”需要“main.c”、“sunq.c”、“main.h”三個依賴檔案,則定義 main_SOURCES=main.c sunq.c main.h。要注意的是,如果要定義多個執行檔案,則對每個執行程式都要定義相應的file_SOURCES。

其次

使用automake對其生成“configure.in”檔案,在這裡使用選項“—adding-missing”可以讓automake自動新增有一些必需的指令碼檔案。

執行後的狀態是:

------------------------------------------------

[[email protected] main]# automake --add-missing

configure.in:8: installing `./missing'

configure.in:8: installing `./install-sh'

Makefile.am: installing `./depcomp'

[[email protected] main]# ls

aclocal.m4      config.h.in   configure.in~ main.c        Makefile.in

autom4te.cache configure     depcomp        Makefile.am missing

autoscan.log    configure.in install-sh     Makefile.am~

[[email protected] main]#

------------------------------------------------

第八步

執行configure,在這一步中,通過執行自動配置設定檔案configure,把Makefile.in變成了最終的Makefile。

執行的結果如下:

------------------------------------------------

[[email protected] main]# ./configure

checking for a BSD-compatible install... /usr/bin/install -c

checking whether build environment is sane... yes

checking for a thread-safe mkdir -p... /bin/mkdir -p

checking for gawk... gawk

checking whether make sets $(MAKE)... yes

checking for gcc... gcc

checking for C compiler default output file name... a.out

checking whether the C compiler works... yes

checking whether we are cross compiling... no

checking for suffix of executables...

checking for suffix of object files... o

checking whether we are using the GNU C compiler... yes

checking whether gcc accepts -g... yes

checking for gcc option to accept ISO C89... none needed

checking for style of include used by make... GNU

checking dependency style of gcc... gcc3

configure: creating ./config.status

config.status: creating Makefile

config.status: creating config.h

config.status: executing depfiles commands

[[email protected] main]# ls

aclocal.m4      config.h.in    configure.in   main.c        Makefile.in

autom4te.cache config.log     configure.in~ Makefile     missing

autoscan.log    config.status depcomp        Makefile.am  stamp-h1

config.h        configure      install-sh     Makefile.am~

[[email protected] main]#

------------------------------------------------

第九步

執行 make,對配置檔案Makefile進行測試一下

此時的狀態如下:

------------------------------------------------

[[email protected] main]# make

cd . && /bin/sh /root/project/main/missing --run aclocal-1.10

cd . && /bin/sh /root/project/main/missing --run automake-1.10 --foreign

cd . && /bin/sh /root/project/main/missing --run autoconf

/bin/sh ./config.status --recheck

running CONFIG_SHELL=/bin/sh /bin/sh ./configure   --no-create --no-recursion

checking for a BSD-compatible install... /usr/bin/install -c

checking whether build environment is sane... yes

checking for a thread-safe mkdir -p... /bin/mkdir -p

checking for gawk... gawk

checking whether make sets $(MAKE)... yes

checking for gcc... gcc

checking for C compiler default output file name... a.out

checking whether the C compiler works... yes

checking whether we are cross compiling... no

checking for suffix of executables...

checking for suffix of object files... o

checking whether we are using the GNU C compiler... yes

checking whether gcc accepts -g... yes

checking for gcc option to accept ISO C89... none needed

checking for style of include used by make... GNU

checking dependency style of gcc... gcc3

configure: creating ./config.status

/bin/sh ./config.status

config.status: creating Makefile

config.status: creating config.h

config.status: config.h is unchanged

config.status: executing depfiles commands

cd . && /bin/sh /root/project/main/missing --run autoheader

rm -f stamp-h1

touch config.h.in

make all-am

make[1]: Entering directory `/root/project/main'

gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c

mv -f .deps/main.Tpo .deps/main.Po

gcc -g -O2   -o main main.o

cd . && /bin/sh ./config.status config.h

config.status: creating config.h

config.status: config.h is unchanged

make[1]: Leaving directory `/root/project/main'

[[email protected] main]# ls

aclocal.m4      autoscan.log config.h.in config.status configure.in   depcomp    main    main.o    Makefile.am   Makefile.in stamp-h1

autom4te.cache config.h      config.log   configure      configure.in~ install-sh main.c Makefile Makefile.am~ missing

[[email protected] main]#

------------------------------------------------

第十步

執行生成的檔案 main:

------------------------------------------------

[[email protected] main]# ./main

Hello, Auto Makefile!

相關推薦

linuxautomake用法

作為Linux下的程式開發人員,大家一定都遇到過Makefile,用make命令來編譯自己寫的程式確實是很方便。一般情況下,大家都是手工寫一個簡單Makefile,如果要想寫出一個符合自由軟體慣例的Makefile就不那麼容易了。   在本文中,將給大家介紹如何使用 auto

linuxmd5sum用法 (查看文件或字符串的md5值)

一般來說 生產 ech mes warn md5算法 換行符 tab鍵 bin MD5算法常常被用來驗證網絡文件傳輸的完整性,防止文件被人篡改。MD5 全稱是報文摘要算法(Message-Digest Algorithm 5),此算法對任意長度的信息逐位進行計算,產生一

linuxmd5sum用法 (檢視檔案或字串的md5值)

  MD5演算法常常被用來驗證網路檔案傳輸的完整性,防止檔案被人篡改。MD5 全稱是報文摘要演算法(Message-Digest Algorithm 5),此演算法對任意長度的資訊逐位進行計算,產生一個二進位制長度為128位(十六進位制長度就是32位)的“指紋”(或稱“報文摘要”),不同的檔案產生

linuxrename用法--批量重新命名 轉

原文地址:https://www.cnblogs.com/hester/p/5615871.html Linux的rename 命令有兩個版本,一個是C語言版本的,一個是Perl語言版本的,早期的Linux發行版基本上使用的是C語言版本的,現在已經很難見到C語言版本的了, 由於歷史原因,在Perl語言大紅大

Linux cut用法總結

CUT cut 顧名思義,就是切~~是一個選取命令,其功能是將檔案中的每一行,“位元組” “字元” “欄位” 進行剪下,選取我們需要的,並將這些選取好的資料輸出至標準輸出。 create two new document to display #ca

linuxrdesktop用法

我自己用的引數rdesktop -g workarea -D -r clipboard:PRIMARYCLIPBOARD -a 16 -x lan 192.168.1.2 rdesktop是Linux下一個好用的用來連線Windows遠端桌面(當然不僅僅在於此,只要是基於R

linuxgrep用法

linux grep命令 不定時更新中。。。 一、作用 百度 二、格式 grep [options] ‘pattern’ filename 三、option主要引數 下面所列的引數主要是一些常

(轉)Linux內存映射文件的用法簡介

target 共享 文件 知識 i/o 共享數據 log 需要 使用 簡介: 內存映射文件與虛擬內存有些類似,通過內存映射文件可以保留一個地址空間的區域,同時將物理存儲器提交給此區域,只是內存文件映射的物理存儲器來自一個已經存在於磁盤上的文件,而非系統的頁文

LinuxGoAccess的安裝與全部用法

3.4 百分號 最終 單獨 一個 用戶id 概述 src 月份 GoAccess用戶文檔 一、 GoAccess概述 1.1 GoAccess概述 goaccess是一個實時的web日誌分析器,以及交互式查看器,在類Unix系統的終端(terminal)上

Linux的fdlisk - l 用法解析-入門篇

com png gen 結束 文件系統 解析 大小 bubuko 引導 fdlisk - l 的含義是查看linux下面的磁盤分區大小。這個大小包含了很多信息。 我們來看度娘的一則介紹: FDISK進行硬盤分區從實質上說就是對硬盤的一種格式化。當我們創建分區時,就已經

linuxcrontab的原理和用法

amp %d 檢查 pos 時間 運行時間 tor mman body linux 系統則是由 cron (crond) 這個系統服務來控制的。Linux 系統上面原本就有非常多的計劃性工作,因此這個系統服務是默認啟動的。另 外, 由於使用者自己也可以設置計劃任務,所以,

linux shell中if的“-e,-d,-f”的用法

符號鏈接 符號 字符串變量 -s 長度 目錄 != filename bsp 文件表達式-e filename 如果 filename存在,則為真-d filename 如果 filename為目錄,則為真 -f filename 如果 filename為常規文件,則為真-

LinuxRIAD的實現及mdadm命令的基本用法

一、RAID簡述 磁碟陣列(Redundant Arrays of Independent Disks,RAID),是把多個物理磁碟組成一個陣列,當作一個邏輯磁碟使用,它將資料以分段或條帶的方式儲存在不同的磁碟中,這樣可以通過在多個磁碟上同時儲存和讀取資料來大幅提高儲存系統的資料吞吐量 二、RAID分類

Linux實現客戶端兩連跳ping百度,修改dns和nmcil的用法

1.客戶端跳兩次路由器ping百度 rht vmctl reset 重置虛擬機器 真機和虛擬機器開啟火牆策略 用在配置網路單元學的修改兩機閘道器 設定server為雙網絡卡路由端接觸客戶端Desktop閘道器為1.1.1.100 路由器端設定GATEWAY為真機,記得syste

linux主從同步和redis的用法

mariadb其實就是mysql mysql已經被oracle收購,它即將閉源,馬上要開始收費了因此還想免費試用開源的資料庫mysql,就在centos7上,將mysql分支為mariadb 安裝mariadb,在centos7底下:linux軟體包的格式 mysql.rpm 1.通過yum去安裝 1

Linuxshell命令用法和例項總結:du

完整的Linux下Shell命令總結歸檔於IT老兵部落格。 命令格式 du [選項] [檔案] 命令功能 du(disk usage 的簡稱)命令用於檢查計算機上檔案和目錄的磁碟使用情況,可以遞迴顯示檔案和目錄。顯示每個檔案和目錄的磁碟使用空間。 命令引數

Linux ls 命令的高階用法8例

在Linux下,ls這個命令大家肯定太熟悉了,良許相信只要是Linux工程師,每天都會離不開這個命令,而且一天會使用個幾百次。但是,除了 ls -l 以外,你還知 ls 的哪些高階用法呢?良許今天為大家介紹 ls 命令的8種高階用法。 假如我們有這樣的一個資料夾,我們用tree命令檢視它的目錄結構:

LinuxMakefile的automake生成全攻略

作為Linux下的程式開發人員,大家一定都遇到過Makefile,用make命令來編譯自己寫的程式確實是很方便。一般情況下,大家都是手工寫一個簡單Makefile,如果要想寫出一個符合自由軟體慣例的Makefile就不那麼容易了。          在本文中,將給大家介紹如

8 個 Linux ls 命令的高階用法!個個驚豔!

作者 | 良許 責編 | 胡巍巍 在Linux下,ls這個命令大家肯定太熟悉了,筆者相信只要是Linux工程師,每天都會離不開這個命令,而且一天會使用個幾百次。 但是,除了ls -l以外,你還知ls的哪些高階用法呢?筆者今天為大家介紹ls命令的8種高階用法。

linux常用命令與常用操作用法及解釋(初學者必備)

1、環境變數      (1)列印環境變數:ehco  $PATH      (2)新增到環境變數(一般放在當前使用者的宿主目錄~/下的.bashrc檔案裡):export PATH=/usr/local/bin:$PATH                 解釋:每一次