現在google Makefile 和 automake就能找到一些文章。以一個Hello 程序描述為一個project生成Makefile的過程。
這個例子其實在 Info automake 里能看到。大家把它翻成中文的,不錯。
但實際上按照這個例子來做的話,步驟都對,就是太簡單,一些常用的設置需要寫進去,但是沒有提到,還是要自己info , google ,try .
下面是我對Automake一個小總結。
現在google Makefile 和 automake就能找到一些文章。以一個Hello 程序描述為一個project生成Makefile的過程。
這個例子其實在 Info automake 里能看到。大家把它翻成中文的,不錯。
但實際上按照這個例子來做的話,步驟都對,就是太簡單,一些常用的設置需要寫進去,但是沒有提到,還是要自己info , google ,try .
下面是我對Automake一個小總結。
1 步驟總述
(1) autoscan 生成configure.scan .
(2) 在configure.scan基礎上手動編輯,主要要添加的 :
AM_INIT_AUTOMAKE(myprojectname , version)
AC_OUTPUT( 最后要生成的Makefile , 包括 子目錄中的,中間用空格隔開) , 例如 AC_OUTPUT(Makefile subdir/Makefile
subdir1/Makefile)
AC_PROG_RANLIB (意義見第四條末尾)
(3) aclocal
autoconf
生成configure腳本。
(4) 這步我基本靠手,呵呵,有沒有腳本來完成這個的?就是在每個最后需要生成Makefile的目錄中,寫一個Makefile.am .
最上層的要寫明
AUTOMAKE_OPTIONS = foreign
如果這個目錄沒有要編譯的文件 ,只包含了子目錄,則只寫個
SUBDIRS = dir1
就ok了。
例如我的工程,最上層只是包含了源碼目錄,于是就寫了
AUTOMAKE_OPTIONS=foreign
SUBDIRS=src
如果有文件要編譯,則要指明target 先。比如我的src目錄底下既有文件,又有目錄,而src的這層目錄中的文件最后是要編譯成一個
可執行文件,則src目錄下的Makefile.am這么寫。
bin_PROGRAMS= myprogram
SUBDIRS= sub1
myprogram_SOURCES=
a.cpp
b.cpp
# 要編譯的源文件。這兒的_SOURCES是關鍵字
EXTRA_DIST=
a.h
b.h
# 不用編成.o,但生成target myprogram也需要給編譯器處理的頭文件放這里
myprogram_LDADD = libsub1.a 這個_LDADD是關鍵字,
# 最后生成myprogram這個執行文件,還要link src/sub1這個目錄中的內容編成的一個lib :libsub1.a,
myprogram_LDFLAGS = -lpthread -lglib-2.0 -L/usr/bin $(all_libraries)
# myprogram還要link系統中的動態so,以此類推,需要連自編譯的so,也寫到這個關鍵字 _LDFLAGS后面就好了。
AM_CXXFLAGS = -D_LINUX
# 傳遞給g++編譯器的一些編譯宏定義,選項,
INCLUDES=-IPassport -Isub1/ -I/usr/include/glib-2.0
-I/usr/lib/glib-2.0/include $(all_includes)
# 傳遞給編譯器的頭文件路徑。
下面是sub1種生成lib的Makefile.am
noinst_LIBRARIES = libprotocol.a
# 不是生成可執行文件,而是靜態庫,target用noinst_LIBRARIES
libprotocol_a_SOURCES =
alib.cpp
EXTRA_DIST = mylib.h
alib.h
INCLUDES= -I../ $(all_includes)
AM_CXXFLAGS = -D_LINUX -DONLY_EPOLL -D_SERVER
ok ,最后補上AC_PROG_RANLIB涵義,如果要自己生成lib,然后link到最終的可執行文件中,則要加上這個宏,否則不用。
2 一點討論
每個目錄至少都要有一個target,或者是可執行文件或者是lib,似乎對目錄的劃分帶來點局限。
比如我的目錄結構如果是這樣
./Src
./Src/sub1
./Src/sub2
而我想這樣,sub1,sub2都沒有target,目錄劃分只是為了區別代碼的不同模塊,然后把兩個目錄中編譯出的中間文件一起link
,得到最后需要的 myprogram 。
似乎在Src/Makefile.am中要這么寫
myprogram_SOURCES = sub1/a.cpp
sub2/b.cpp
可以實現,但我沒試,:P
當然和設成先編譯出libsub1.a libsub2.a 最后Link得到myprogram 沒有本質區別了。
3 剩下的就是
automake --add-missing
Ok , Makefile.in應該放到各個目錄下了。
最后,運行configure腳本,生成 各個目錄下的Makefile .......
再最后 ,make .......