如何根據configure.ac和Makefile.am爲開源代碼產生當前平臺的Makefile

1
2
3
4
5
6
7
8
9
//根據configure.in和Makefile.am生成makefile的步驟,基於UBUNTU 12.04
1.autoscan (可選)
2.aclocal
3.autoconf
4.autoheader(可選)
5.libtoolize --automake --copy --debug --force(可選)
6.automake --add-missing
7.autoreconffiWall,no–obsolete(可選)
8../configure

 

簡單的方式:html

若是拿到的工程文件中,沒有Makefile文件,而只有configure.in和Makefile.am文件,咱們是不可以直接進行編譯的,必須在UBUNTU等Linux系統下,根據configure.in和Makefile.am文件生成編譯所需的Makefile文件。具體操做步驟以下:
一、執行autoscan,而後執行aclocal,產生aclocal.m4文件
aclocal是一個perl 腳本程序,它的定義是:「aclocal – create aclocal.m4 by scanning configure.ac」。 aclocal根據configure.in文件的內容,自動生成aclocal.m4文件。而aclocal.m4文件中,包含了生成configure文件所必須的宏。
二、執行autoconf,生成configure文件
autoconf會根據configure.in和aclocal.m4文件,生成configure文件。其實,autoconf就是把configure.in和aclocal.m4文件中定義的內容, 變成檢查系統特性、環境變量、軟件必須的參數的shell腳本。
三、執行automake命令,產生Makefile.in
具體命令爲:automake –add-missing
automake會根據Makefile.am文件產生一些文件,包含最重要的Makefile.in。前面所生成的configure,會根據Makefile.in文件,來生成最終的Makefile文件。
四、執行configure命令,生成Makefile文件
這樣,就產生了編譯所須要的Makefile文件。運行make,便可編譯。linux

 

 

 

複雜點的方式:git

爲一個項目源文件生成makefile並make的步驟以下:github

操做在包含源文件的項目目錄下進行。shell

  • (1)運行autoscan,生成文件configure.scan
  • (2)修改configure.scan,更名爲configure.in
  • (3)運行autoheader,生成文件configure.h.in(如今通常改成configure.ac)
  • (4)運行libtoolize,生成ltmain.sh
  • (5)運行allocal,生成aclocal.m4
  • (6)運行autoconf,生成configure
  • (7)運行automake,生成makefile.in,每一個包含makefile.am的子目錄都生成makefile.in。automake -a選項能夠補齊文件config.guess,config.sub,install-sh,missing,depcomp
  • (8)運行./configure,生成config.status,config.h,makefile
  • (9)運行make,生成中間文件對象文件,庫文件,最後生成可執行文件
  • (10)運行make install,相應的可執行文件,庫文件,頭文件拷貝到系統相應位置。

configure運行ui

configure是一個shell腳本文件,由autoconf生成,它自動爲源碼包配置編譯鏈接選項,適應不一樣的硬件平臺和POSIX操做系統,輸出所須要的Makefile。this

configure主管檢查你的系統,把結果存放到config.status中,config.status根據它的檢查結果實際執行正確的動做。spa

configure檢查與系統相關的一系列變量,這些變量存儲到文件config.status中,供makefile調用。這些變量包括編譯鏈接時須要的程序,這些程序在系統中的位置(目錄),調用這些程序的選項,好比編譯器的目錄,編譯器的選項-g是否支持等。configure能猜出它運行的系統的規範名字cpu–vendor–os,它經過運行腳本文件config.guess輸出變量uname來猜出。configure能識別不少系統名字的別名,它經過運行腳本文件config.sub把系統名字變成規範名字。操作系統

make運行debug

makefile.am對makefile的影響:它根據SUBDIRS = add sub讓make遞歸進入每一個子目錄處理子目錄的Makefile。根據main_LDADD = add/libadd.la sub/libsub.la爲main鏈接libadd.la和libsub.la庫。

configure.in對makefile的影響:

根據AC_PROG_LIBTOOL讓libtool完成編譯鏈接工做。

根據AC_CONFIG_HEADERS([config.h])只需傳遞預處理宏-DHAVE_CONFIG_H給編譯器。

makefile中不少與系統相關的信息都是經過變量獲取的,這些變量以前已經由configure檢查好存放在config.status裏面,預處理 宏存放在config.h裏面。好比咱們要用到的編譯器CC,編譯器選項CFLAGS等。makefile中的變量完成替換後,開始實際執行命令,它會遞 歸執行每個子目錄下的makefile,生成對象文件,鏈接庫文件,最後鏈接成可執行文件。

交叉編譯 Cross-compiling

Q:爲別的平臺編譯可執行程序怎麼作?

交叉編譯就是在目前的平臺上爲別的目標平臺生成可執行程序或庫。能夠在運行configure時經過–build,–host,–target參數實現交叉編譯。

例如:

 

–build=build-type :configure和compile軟件包的系統類型。默認狀況等於config.guess給出的系統類型

–host=host-type :運行軟件包的系統類型。默認狀況等於build類型

–target=target-type :不多用,默認狀況等於host類型。

交叉編譯時,若是編譯器,鏈接器,彙編器名字不是以host_type爲前綴,configure都會發出警告。

要搭建交叉變異環境,如交叉編譯用的編譯器,鏈接器,彙編器跟本地的不同,通常以host_type爲前綴,如arm-pc-linux-gcc。

安裝目錄

Q:make install時,文件都安裝到哪裏去了?

prefix:安裝目錄的前綴。默認狀況下/usr/local 。

bindir:安裝時拷貝可執行文件到此目錄。默認狀況下/usr/local/bin 。

includir:安裝時拷貝頭文件到此目錄。默認狀況下/usr/local/include 。

libdir:安裝時拷貝庫文件到此目錄。默認狀況下/usr/local/libs 。

定製本身的安裝目錄,能夠–prefix 和 –exec-prefix 給configure。

例如:./configure –prefix=/usr 。

 

Configure,Makefile.am, Makefile.in, Makefile文件之間關係

 

 

 

 

針對上面提到的 各個命令,咱們再作些詳細的介紹

//http://www.laruence.com/2009/11/18/1154.html

 

 

錯誤處理:

 

When try to configure an open source code, I get error like this :

configure: error: cannot find install-sh, install.sh, or shtool in 「.」 「./..」 「./../..」

<pre>

autoreconf Wall,noobsolete
./configure

</pre>

 

 

 

「Libtool library used but ‘LIBTOOL’ is undefined」

<pre>sudo apt-get install autoconf
sudo apt-get install automake
sudo apt-get install libtool

從新執行aclocal/autoheader</pre>

 

 

required file build/ltmain.sh' not found

$ automake --add-missing
....
configure.in:18: required file 
build/ltmain.sh’ not found
….
解決方案(libtoolize配置便可):

$libtoolize –version-libtoolize (GNU libtool) 1.4.2…..$libtoolize –automake –copy –debug –force

相關文章
相關標籤/搜索