Makefile Tutorial

(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
...      
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章