如何根據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

 

簡單的方式:

如果拿到的工程文件中,沒有Makefile文件,而只有configure.in和Makefile.am文件,我們是不能夠直接進行編譯的,必須在UBUNTU等Linux系統下,根據configure.in和Makefile.am文件生成編譯所需的Makefile文件。具體操作步驟如下:
1、執行autoscan,然后執行aclocal,產生aclocal.m4文件
aclocal是一個perl 腳本程序,它的定義是:“aclocal – create aclocal.m4 by scanning configure.ac”。 aclocal根據configure.in文件的內容,自動生成aclocal.m4文件。而aclocal.m4文件中,包含了生成configure文件所必須的宏。
2、執行autoconf,生成configure文件
autoconf會根據configure.in和aclocal.m4文件,生成configure文件。其實,autoconf就是把configure.in和aclocal.m4文件中定義的內容, 變成檢查系統特性、環境變量、軟件必須的參數的shell腳本。
3、執行automake命令,產生Makefile.in
具體命令為:automake –add-missing
automake會根據Makefile.am文件產生一些文件,包含最重要的Makefile.in。前面所生成的configure,會根據Makefile.in文件,來生成最終的Makefile文件。
4、執行configure命令,生成Makefile文件
這樣,就產生了編譯所需要的Makefile文件。運行make,即可編譯。

 

 

 

復雜點的方式:

為一個項目源文件生成makefile並make的步驟如下:

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

  • (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運行

configure是一個shell腳本文件,由autoconf生成,它自動為源碼包配置編譯連接選項,適應不同的硬件平台和POSIX操作系統,輸出所需要的Makefile。

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

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

make運行

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM