Makefile.am
一般格式
| bin_PROGRAMES = foo |
| foo_SOURCES = xxxx.c |
| foo_LDADD = |
| foo_LDFLAGS = |
| foo_DEPENDENCIES = |
| lib_LIBRARIES = libfoo.a |
| foo_a_SOURCES = |
| foo_a_LDADD = |
| foo_a_LIBADD = |
| foo_a_LDFALGS = |
| include_HEADERS = foo.h |
| data_DATA = data1 data2 |
對于可執行文件和靜態庫類型,如果只想編譯,不想安裝到系統中,可以用 noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。
全局變量
Makefile.am還提供了一些全局變量供所有的目標體使用 :
| INCLUDES | 比如鏈接時所需要的頭文件 |
| LDADD | 比如鏈接時所需要的庫文件 |
| LDFLAGS | 比如鏈接時所需要的庫文件選項標志 |
| EXTRA_DIST | 源程序和一些默認的文件將自動打入 .tar.gz 包,其他文件若要進入 .tar.gz 包可以使用這種方法,如配置文件,數據文件等。 |
| SUBDIRS | 處理本目錄前要遞歸處理哪些子目錄 |
automake 安裝路徑
automake設置了默認的安裝路徑:
標準安裝路徑
默認安裝路徑為 : $(prefix) = /usr/local可以通過 ./configure --prefix=<new_path> 的方法來覆蓋。其它的預定義目錄還包括 :bindir = $(prefix)/bin, libdir = $(prefix)/lib, datadir = $(prefix)/share, sysconfdir = $(prefix)/etc等等。定義一個新的安裝路徑
比如test, 可定義
testdir = $(prefix)/test,然后 test_DATA =test1 test2,則 test1,test2 會作為數據文件安裝到 $(prefix)/test 目錄下。
示例
我們首先需要在工程頂層目錄下創建一個 Makefile.am 來指明包 含的子目錄:
SUBDIRS=src/lib src/ModuleA/apple/shell src/ModuleA/apple/core CURRENTPATH=$(shell /bin/pwd) INCLUDES=-I$(CURRENTPATH)/src/include -I$(CURRENTPATH)/src/ModuleA/apple/include export INCLUDES由于每個源文件都會用到相同的頭文件,所以我們在最頂層的Makefile.am中包含 了編譯源文件時所用到的頭文件,并導出。
我們將 lib 目錄下的 swap.c 文件編譯成 libswap.a 文件,被 apple/shell/apple.c 文件調用,那么lib目錄下的 Makefile.am 如下所示:
noinst_LIBRARIES=libswap.a libswap_a_SOURCES=swap.c INCLUDES=-I$(top_srcdir)/src/includ這里使用 noinst_LIBRARIES , 是因為如果只想編譯,而不想安裝到系統中,就 用 noinst_LIBRARIES 代替 bin_LIBRARIES ,對于可執行文件就用 noinst_PROGRAMS 代替 bin_PROGRAMS 。對于安裝的情況,庫將會安裝到 $(prefix)/lib 目錄下,可執行文件將會安裝到 ${prefix}/bin 。如果想安裝該 庫,則 Makefile.am 示例如下:
bin_LIBRARIES=libswap.a libswap_a_SOURCES=swap.c INCLUDES=-I$(top_srcdir)/src/include swapincludedir=$(includedir)/swap swapinclude_HEADERS=$(top_srcdir)/src/include/swap.h最后兩行的意思是將 swap.h 安裝到 ${prefix}/include/swap 目錄下。
接下來,對于可執行文件類型的情況,我們將討論如何寫 Makefile.am . 對于編 譯apple/core目錄下的文件,我們寫成的Makefile.am如下所示:
noinst_PROGRAMS=test test_SOURCES=test.c test_LDADD=$(top_srcdir)/src/ModuleA/apple/shell/apple.o $(top_srcdir)/src/lib/libswap.a test_LDFLAGS=-D_GNU_SOURCE DEFS+=-D_GNU_SOURCE #LIBS=-lpthread由于我們的 test.c 文件在鏈接時,需要 apple.o 和 libswap.a 文件,所以我 們需要在 test_LDADD 中包含這兩個文件。對于 Linux 下的信號量/讀寫鎖文件 進行編譯,需要在編譯選項中指明 -D_GNU_SOURCE 。所以在 test_LDFLAGS 中指 明。而 test_LDFLAGS 只是鏈接時的選項,編譯時同樣需要指明該選項,所以需 要 DEFS 來指明編譯選項,由于 DEFS 已經有初始值,所以這里用 += 的形式指 明。從這里可以看出,Makefile.am 中的語法與 Makefile 的語法一致,也可以 采用條件表達式。如果你的程序還包含其他的庫,除了用 AC_CHECK_LIB 宏來指 明外,還可以用LIBS來指明。
如果你只想編譯某一個文件,那么 Makefile.am 如何寫呢?這個文件也很簡單, 寫法跟可執行文件的差不多,如下例所示:
noinst_PROGRAMS=apple apple_SOURCES=apple.c DEFS+=-D_GNU_SOURCE我們這里只是欺騙 automake ,假裝要生成apple文件,讓它為我們生成依賴關系 和執行命令。所以當你運行完 automake 命令后,然后修改 apple/shell/ 下的 Makefile.in 文件,直接將LINK語句刪除,即:
clean-noinstPROGRAMS:-test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)apple$(EXEEXT): $(apple_OBJECTS) $(apple_DEPENDENCIES)@rm -f apple$(EXEEXT)#$(LINK) $(apple_LDFLAGS) $(apple_OBJECTS) $(apple_LDADD) $(LIBS)總結
以上是生活随笔為你收集整理的Makefile.am的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WinCE OAL中的OEMIoCont
- 下一篇: wince6.0编译命令分析