詳解linux下auto工具製做Makefile源碼包(製做篇)

詳解linuxauto工具製做Makefile源碼包(製做篇)linux

水木楊bash

1、     概述工具

爲了更好的製做configureMakefile,我先把製做流程給寫在這裏,好讓大夥都有個心理準備。這裏只說流程,不作解釋。(附圖供參考)this

 

 

1autosan命令生成configure.scan文件,這只是個模板,咱們從新編輯這個文件,並把它保存爲configure.in文件。spa

2aclocal命令生成aclocal.m4文件。設計

3autoheader命令生成config.h.in。前提是aclocal.m4configure.in必須生成。orm

4autoconf命令生成configure文件(這個文件都很熟悉吧,嘎嘎)ip

5、建立並編輯Makefile.am,這個文件在根目錄與子目錄都應該有的。ci

6automake命令生成Makefile.in文檔

7./configure命令,根據Makefile.in生成Makefile文件,這個再熟悉不過了吧。

2、     製做

巧婦難作無米之炊,要想完成此次體驗,咱們還得按規矩一步一步來,源文件得有。首先建個目錄Family用來放咱們的東西,它下面的東西就多了。源代碼什麼阿c,阿h啊,都放在src下面,src這個文件夾命名通常都是約定俗成的,咱們也不破壞。固然你也能夠起其餘名字,別搞忘就好。

<Family>
|-configure.in
|-Makefile.am
|-<src>
|-wife.c
|-daughter.c                                                                   |-main.c
|-wife.h                                                                       |-daughter.h
|-Makefile.am

說明:
1. configure.in
這是最重要的文檔,整個安裝過程都靠它來主導。
2. Makefile.am
automake會根據它來生成Makefile.in,再由./configure Makefile.in變成最終的Makefile,通常來講在頂級目錄和各個子目錄都應該有一個Makefile.am
3. wife.c daughter.c main.c wife.h daughter.h
這是咱們的源程序。

不用細看,這些文件除了configure.in是用模板建立手動編輯外,其餘都是手動建立並編輯的,若是你還木有,動手吧。其實這裏邊有個小小的經驗,也不必定是對的,只是我的的經驗,也就是後綴名爲in的文件是生成的模板。

$ mkdir p Family/src

$ touch Makefile.am

$ cd src

$ touch wife.c daughter.c main.c wife.h daughter.h Makefile.am

$ cd ..  進入剛建立的Family目錄

$ autoscan 該命令產生 configure.scan  configure.log兩個文件,而後

$ mv configure.scan configure.i n這樣configure.in就建立成了。

源代碼內容:

main.c: 

#include <stdio.h>

#include "wife.h"

#include "daughter.h"

 

#ifdef HAVE_CONFIG_H

#include <config.h>

#endif

int main(void)

{

   printf( "These are my girls/n");

   daughter_say();

   wife_say();

   return 0;

}

 

  daughter.c

 

#include <stdio.h>

#include "daughter.h"

 

#ifdef HAVE_CONFIG_H

#include <config.h>

#endif

void daughter_say(void)

{

   printf("My Dad ,are you call me ?/n");

 

}

  

daughter.h

#ifndef _DAUGHTER_

#define _DAUGHTER_

 

void daughter_say(void);

 

#endif

                 

wife.c

#include <stdio.h>

#include "wife.h"

 

#ifdef HAVE_CONFIG_H

#include <config.h>

#endif

 

void wife_say(void)

{

   printf("My darling ,are you call me ?/n");

}

 

 

 

 

 

 

 

 

 

 

 

  

wife.h

 

#ifndef _WIFE_

#define _WIFE_

 

void wife_say(void);

 

#endif

 

 

 

 

 

 

 

 

 

製做流程:

1步:編輯configure.in文件。

    上面用autoscan生成的scan後綴的文件更名而成的configure.in文件,個人用autoconf版本是2.66,貌似autoscan自動生成的模板2.61以前與以後的不大同樣,這點能夠本身參照本身的版本修改,2.61之後的版本這個文件更簡單了。

打開看看: 

#                                               -*- Autoconf -*-

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

AC_PREREQ([2.66])

AC_INIT([family], [1.0], [804927399@qq.com])

AM_INIT_AUTOMAKE(family,1.0)

AC_CONFIG_SRCDIR([src/wife.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_CONFIG_FILES([Makefile

                 src/Makefile])

AC_OUTPUT

 

 

 

configure.in 未修改版,簡單對上面進行說明:

AC_PREREQ([2.66])這個宏是用來檢測autoconf的版本的。

AC_INIT()是個初始化宏,括號中內容分別爲:要生成的軟件名稱,版本號,bug報告郵箱

AM_INIT_AUTOMAKE(family,1.0)這個宏是新添加的,不過好像1.8automake不用添加這個也能夠,可是我沒有添加的時候在後面make的時候會有「Makefile:15: *** 遺漏分隔符 。 中止。」的問題,而加上則有警告。如今還真有點暈呼呼滴。

AC_CONFIG_SRCDIR([src/wife.c])這個宏是用來檢測源碼目錄的有效性,srcdir就能夠看出來,括號裏邊的文件不必定非得是wife.c,也能夠改爲其餘的。

AC_CONFIG_HEADERS([config.h])這個宏用來生成標準的config.h文件。

接下來的內容就是衆多的check

AC_PROG_CC這個是檢測編譯器的宏。

咱們用的版本不用AC_OUTPUT輸出了,仍是比較省力的。

 

2步:aclocal命令生成aclocal.m4文件

    不知爲什麼,我直接用命令:

    $aclocal 命令老是出錯:aclocal

aclocal: couldn't open directory `/usr/local/share/aclocal-': 沒有那個文件或目錄。

    最後仍是加上絕對路徑/usr/bin/aclocal總算是沒這個錯誤,生成aclocal.m4了。

3步:autoconf命令生成 configure文件

    這一步沒什麼難度,輸入命令:

    $ autoconf ok了,autoconf能夠根據configure.inaclocal.m4生成大名鼎鼎的configure,這時候已經能夠運行它了,可是會報錯,由於Makefile.in還沒出現。

那麼何爲M4呢,M4的名稱取自MacroM後面跟4個字母…)。它和C預處理器裏的宏是一個概念(其實,M4C預處理器都K&R操刀設計的!!),用來處理文本替換。也就是說,M4bash裏的預處理器。

4步:autoheader命令生成config.h.in

    autoheader經過autoheader命令,咱們就能夠獲得config.h.in這個東東了。有了它,./configure纔會生成config.h這個東東,因此不可大意。

autoheader這個工具一般會從「acconfig.h」文件中複製用戶附加的符號定義,所以此處沒有附加符號定義,因此不須要建立「acconfig.h」文件。

 

 

5步:編輯Makefile.am文件

    咱們再編譯安裝源碼包的時候都知道./configure能夠生成Makefile,卻不知要生成Makefile還全仰仗Makefile.in這個老東西,而這個東西是以in結尾的 ,也是個模板,是由Makefile.am生成的,好了,知道這個前因後果了,就着手編寫Makefile.am,咱們這裏Family頂級目錄與子目錄各有一個,若是還有其餘的子目錄,理論上也是須要Makefile.am的。咱們這就來編輯它:

    Family/Makefile.am內容以下:

AUTOMAKE_OPTIONS = foreign

SUBDIRS = src

 

 

 

Family/src/Makefile.am內容以下:

AUTOMAKE_OPTIONS = foreign

bin_PROGRAMS = family

family_SOURCES = main.c wife.c daughter.c wife.h daughter.h

 

 

 

 

其中的AUTOMAKE_OPTIONS爲設置automake的選項。因爲GNU對本身發佈的軟件有嚴格的規範,好比必須附帶許可證聲明文件COPYING等,不然automake執行時會報錯。automake提供了三種軟件等級:foreigngnugnits,讓用 戶選擇採用,默認等級爲gnu。在本例使用foreign等級,它只檢測必須的文件,而不用檢查README啊什麼的。

    bin_PROGRAMS定義要產生的執行文件名。若是要產生多個執行文件,每一個文件名用空格隔開。

    family_SOURCES定義「family」這個執行程序所須要的原始文件。若是」family」這個程序是由多個原始文件所產生的,則必須把它所用到的全部原 始文件都列出來,並用空格隔開。若是源文件名字太長,能夠加上/行鏈接符換行書寫。

 

6步:automake --add-missing命令生成config.h.in

$ automake a或者 automake -add-missing,大功告成!

注意運行automake命令時必定要加參數,不然不會自動生成install.shmissing等腳本,這樣會出亂子滴。

這樣,源碼安裝包就製做成了,用tar打包就能夠了,使用的時候用三部曲./configure,make  make install安裝便可帥吧!

相關文章
相關標籤/搜索