(Makefile Tutorial)
http://mrbook.org/tutorials/make/
(Write Makefile with me)
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=408225
Makefile 特殊變量:VPATH
告訴 make
在當前目錄找不到的情況下,到所指定的目錄中去找尋文件,目錄用冒號隔開
include
類似 C
語言當中的 #include
@echo
加上“@”號之後隱藏運行時顯示命令
命令執行
如果希望第二條命令在第一條命令的基礎上執行,加冒號分隔
命令前加“-”忽略出錯
-rm -rf *.o
export LD_LIB_DIR
傳遞變量到下級 Makefile
自動化變量
$@ 目標文件集
$< 符合模式的一系列文件集
$^ 所有的依賴目標的集合,如果有重複的則去除重複目標
後綴規則
.SUFFIXES: # 刪除默認的後綴
.SUFFIXES: .c .o .h # 定義自己的後綴
Makefile
僞目標
.PHONY: clean
clean:
-rm -rf *.o
Examples
Makefile-1
all:
g++ main.cpp hello.cpp factorial.cpp -o hello
Makefile-2
all: hello
hello: main.o factorial.o hello.o
g++ main.o factorial.o hello.o -o hello
main.o: main.cpp
g++ -c main.cpp
factorial.o: factorial.cpp
g++ -c factorial.cpp
hello.o: hello.cpp
g++ -c hello.cpp
clean:
rm -rf *o hello
Makefile-3
# I am a comment, and I want to say that the variable CC will be
# the compiler to use.
CC=g++
# Hey!, I am comment number 2. I want to say that CFLAGS will be the
# options I'll pass to the compiler.
CFLAGS=-c -Wall
all: hello
hello: main.o factorial.o hello.o
$(CC) main.o factorial.o hello.o -o hello
main.o: main.cpp
$(CC) $(CFLAGS) main.cpp
factorial.o: factorial.cpp
$(CC) $(CFLAGS) factorial.cpp
hello.o: hello.cpp
$(CC) $(CFLAGS) hello.cpp
clean:
rm -rf *o hello
看完這些,我想說的是,以上全部都是理論知識,僅僅也就用在測試項目中可以稍微用上,在實際項目中極少機會需要自己手動來編寫 Makefile 文件.因爲有autoconf, automake
這些強大的工具,比如 sqlite 源代碼項目的 Makefile 頭兩句就是
# Makefile.in generated by automake 1.9.6 from Makfile.am.
# Makefile. Generated from Makefile.in by configure.
所以最後真正需要編寫的文件是 Makefile.am
或者是 Makefile.in
文件,然後通過automake
工具或者項目configure
可執行文件自動生成Makefile
,另外configure
文件也是通過autoconf
工具自動生成的。 So in the end, let's take a look at the Makefile
of subversion project.
#
# Makefile.in: template Makefile for Subversion
#
...
VPATH = ../subversion
...
CC = gcc
CXX = g++
...
INCLUDES = -I$(top_srcdir)/subversion/include -I$(top_builddir)/subversion \
-I/usr/include/apr-1.0 -I/usr/include/apr-1.0 \
\
\
\
CFLAGS = -g3 -fno-omit-frame-pointer -fno-inline -pthread -DSVN_DEBUG -DAP_DEBUG $(EXTRA_CFLAGS)
CXXFLAGS = -g3 -fno-omit-frame-pointer -fno-inline -DSVN_DEBUG -DAP_DEBUG $(EXTRA_CXXFLAGS)
CMODEFLAGS = -std=c90
CPPFLAGS = -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE $(EXTRA_CPPFLAGS)
CMAINTAINERFLAGS = -Wall -Wpointer-arith -Wwrite-strings -Wshadow -Wformat=2 -Wunused -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wno-multichar -Wredundant-decls -Wnested-externs -Winline -Wno-long-long -Wno-string-plus-int -Wno-format-nonliteral -Wno-system-headers -Wold-style-definition -Werror=declaration-after-statement -Werror=implicit-function-declaration
COMPILE = $(CC) $(CMODEFLAGS) $(CPPFLAGS) $(CMAINTAINERFLAGS) $(CFLAGS) $(INCLUDES)
...
all: mkdir-init local-all
clean: local-clean
distclean: local-distclean
extraclean: local-extraclean
install: local-install revision-install
include $(top_srcdir)/build-outputs.mk
local-all: fsmod-lib ramod-lib lib bin test sub-test tools
...
#
# Implicit rules for creating outputs from input files
#
.SUFFIXES:
.SUFFIXES: .c .cpp .lo .o .la-a .la \
.po .spo .mo .rnc .rng .dtd .xsd .sql .h
.sql.h:
$(PYTHON) $(top_srcdir)/build/transform_sql.py $< $(top_srcdir)/$@
.c.o:
$(COMPILE) -o $@ -c $<
.cpp.o:
$(COMPILE_CXX) -o $@ -c $<
.c.lo:
$(LT_COMPILE) -o $@ -c $<
.cpp.lo:
$(LT_COMPILE_CXX) -o $@ -c $<
.la.la-a:
sed "/library_names/s/'.*'/''/" $< > $@
...
clean-swig: clean-swig-headers clean-swig-py clean-swig-rb clean-swig-pl
@rm -f .swig_checked
...