Makefile文件生成
Makefile文件生成
(2008-04-28 19:19:01) 轉載▼標簽: linux | 分類:DoxygenMakefile |
所必須的軟件:autoconf(generate configuration script [configuration])
automake(? aclocal:automatically generateaclocal.m4 from configure.in)
m4??????perl????????libtool(其中libtool非必須)。
autoconf是一個用于生成可以自動地配置軟件源碼包,用以適應多種UNIX類系統的shell腳本工具,其中autoconf需要用到m4,便于生成腳本。automake是一個從Makefile.am文件自動生成Makefile.in的工具。為了生成Makefile.in,automake還需用到perl,由于automake創建的發布完全遵循GNU標準,所以在創建中不需要perl。libtool是一款方便生成各種程序庫的工具。
生成Makefile的操作過程如下:
1) 運行autoscan命令
2) 將configure.scan 文件重命名為configure.in,并修改configure.in文件
$sudo mv configure.scan configure.in3)在project目錄下新建Makefile.am文件,并在core和shell目錄下也新建makefile.am文件
4) 在project目錄下新建NEWS、 README、 ChangeLog 、AUTHORS文件
5) 將/usr/share/automake-1.10/目錄下的depcomp和complie文件拷貝到本目錄下
6) 運行aclocal命令(configure.in-->aclocal.m4)
7) 運行autoconf命令 (configure.in+aclocal.m4 -->configuration)
8) 運行automake -a命令(Makefile.am+configuration.in-->Makefile.in)
9) 運行./confiugre腳本
生成Makefile流程圖
| # -*- Autoconf -*-# Process this file with autoconf to produce a configure script.AC_PREREQ(2.61)#AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)AC_INIT(test, 1.0, haizi007418@sina.com)AC_CONFIG_SRCDIR([src/ModuleA/apple/core/test.c])AM_CONFIG_HEADER(config.h)# AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)AM_INIT_AUTOMAKE(test,1.0)# Checks for programs.AC_PROG_CC# Checks for libraries.# FIXME: Replace `main' with a function in `-lpthread':AC_CHECK_LIB([pthread], [pthread_rwlock_init])AC_PROG_RANLIB #Multithread# Checks for header files.# Checks for typedefs, structures, and compiler characteristics.# Checks for library functions.# 在AC_OUTPUT輸入 要創建的Makefile文件名AC_OUTPUT([Makefilesrc/lib/Makefilesrc/ModuleA/apple/core/Makefilesrc/ModuleA/apple/shell/Makefile]) |
|
表 1Makefile.am一般格式
對于可執行文件和靜態庫類型,如果只想編譯,不想安裝到系統中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。
表 2Makefile.am中可用的全局變量
在Makefile.am中盡量使用相對路徑,系統預定義了兩個基本路徑:
表3Makefile.am中可用的路徑變量
在上文中我們提到過安裝路徑,automake設置了默認的安裝路徑:
1) 標準安裝路徑
默認安裝路徑為:$(prefix) = /usr/local,可以通過./configure--prefix=<new_path>的方法來覆蓋。
其它的預定義目錄還包括:bindir = $(prefix)/bin, libdir = $(prefix)/lib,datadir = $(prefix)/share, sysconfdir = $(prefix)/etc等等。
2) 定義一個新的安裝路徑
比如test, 可定義testdir = $(prefix)/test, 然后test_DATA =test1test2,則test1,test2會作為數據文件安裝到$(prefix)/ /test目錄下。
我們首先需要在工程頂層目錄下創建一個Makefile.am來指明包含的子目錄,由于每個源文件都會用到相同的頭文件,所以我們在最頂層的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 |
| noinst_LIBRARIES=libswap.alibswap_a_SOURCES=swap.cINCLUDES=-I$(top_srcdir)/src/includ |
| bin_LIBRARIES=libswap.alibswap_a_SOURCES=swap.cINCLUDES=-I$(top_srcdir)/src/include# 將swap.h安裝到${prefix}/include /swap目錄下swapincludedir=$(includedir)/swapswapinclude_HEADERS=$(top_srcdir)/src/include/swap.h |
| noinst_PROGRAMS=testtest_SOURCES=test.c # test.c文件在鏈接時,需要apple.o和 libswap.a文件test_LDADD=$(top_srcdir)/src/ModuleA/apple/shell/apple.o $(top_srcdir)/src/lib/libswap.a # Linux下的信號量/讀寫鎖文件進行編譯,需要在編譯選項中指明- D_GNU_SOURCEtest_LDFLAGS=-D_GNU_SOURCE# test_LDFLAGS只是鏈接時的選項,編譯時同樣需要指明該選項,所以需要 DEFS來指明編譯選項# DEFS已經有初始值,所以這里用+=的形式指明。DEFS+=-D_GNU_SOURCE# 如果你的程序還包含其他的庫,除了用AC_CHECK_LIB宏來指明外,還可以用LIBS來指明#LIBS=-lpthread |
? 對于一個已有configure.in and Makefile.am的源程序包,我們只需要通過執行下述命令來生成Makefile文件: aclocal ,autoconf,automake,./configure 就可以生成Makefile文件,然后sudo make就開始編譯源程序(編譯時error),最后sudo? make install安裝。運行。。。。。。(可能有運行時error)!
總結
以上是生活随笔為你收集整理的Makefile文件生成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 这篇Nature子刊文章的蛋白组学数据P
- 下一篇: 本周开课 | 第 17 期高级转录组分析