版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
###############################################################################
' G& g! y8 V# y8 I. _: s. p$ [#
- ^2 ~) O5 c& x# A smart Makefile template for GNU/LINUX programming' v9 y* K8 Y4 W3 k% c6 _
#
y, B7 l6 b, J0 f) D# Author: SR
: ]) ?1 [; L( W# z4 j6 |# Date: , [# @- M& T( x; {2 r: ?5 \5 D9 g0 a
#
5 r) ?1 d: @5 c+ K# Usage:
4 ~; H( g. Y k( Z4 }7 O# $ make Compile and link (or archive)" {0 m+ o( v; L V
# $ make clean Clean the objectives and target.
8 r7 ~% E- l7 G###############################################################################
* ]" O8 w6 }- Z; J) k7 Y/ U3 N9 }+ i1 i
# Z& v" b, n( [! rCROSS_COMPILE =5 I2 v5 h+ l5 b* ^$ U% [+ x+ E
OPTIMIZE := -O2
' r& u/ a4 n! _% I' E; kWARNINGS := -Wall -Wno-unused -Wno-format
/ b9 e* o+ H X1 p8 zDEFS := -DMYDEF=1 -UMYDEF2
* l* ?1 e# z( a# W& WEXTRA_CFLAGS :=
3 {+ E# j' [# s+ ~4 D x, F, p8 Z7 |% C# ?
/ [$ I# d) g' H. D/ Y2 y9 F% }
INC_DIR = include
# _4 `- M+ P- z0 [4 E9 M/ O- g/ nSRC_DIR = src1 src2/a src2/b
' A) _) K% U" y0 }! G; A+ o' tOBJ_DIR = out/target% j7 M+ s7 A d# N" B. h
EXTRA_SRC = src3/z3.c src4/z4.cpp
# H, h& R: `# k1 L2 L2 oEXCLUDE_FILES = src1/skipme1.c src2/a/skipme2.c
' V9 ]! J+ _6 X& u8 E1 P
* [1 j4 I7 ?8 G& ?1 o# a9 O. e0 K
, I# B/ N0 G; USUFFIX = c cpp cc cxx% e. \' a7 ?# W) c
TARGET := out/go.exe- F) o: Y0 e6 l a, x" v/ P. B. y- J
#TARGET_TYPE := ar
( \9 F) d" \- ]/ K& v! c8 kTARGET_TYPE := app% N% q' I# ]2 ~4 i9 |# B
#TARGET_TYPE := so1 i, V1 i* _% Y: X( @
% {2 x* ~4 p! f# X" a8 R+ W) c$ i
3 V7 @2 }0 S. Q0 l+ u. q5 K1 _/ d9 {' f3 b1 x6 P
. F5 M* z. i8 @1 X- a" y2 N+ q* s5 g+ p#####################################################################################
. f% E& e/ n/ ~9 w7 M# Do not change any part of them unless you have understood this script very well #
1 l5 m: |/ {. l7 c# This is a kind remind. #
/ S$ x6 p+ O1 w5 J* D' e#####################################################################################
, J: s- I/ ^; |& C8 d# q# W/ O1 C$ n' M% f( l# Y" K
4 p" `7 X- b3 c/ a9 Q#FUNC# Add a new line to the input stream.( P- h' `" K! f6 k1 E
define add_newline, b) l1 g* S8 w N
$1
5 {' f; g. n& m8 ^; v, R" h
* k- O# e$ }3 `$ ?- [4 A2 y; j4 G1 Q* w
endef9 F( |% ^1 l+ c# M$ \
8 K+ n' s; D! c& B
4 x0 f5 ]4 L8 N5 M! j! o4 c8 {2 o4 O#FUNC# set the variable `src-x' according to the input $1
' c/ B/ Q) Y2 G$ k' Udefine set_src_x
r l* i& Y, t& u- e8 ysrc-$1 = $(filter-out $4,$(foreach d,$2,$(wildcard $d/*.$1)) $(filter %.$1,$3))/ v; z2 c9 C3 J
7 l* n9 H( O) a. S6 J0 M. @" S
9 Z! S# J& _& B' Sendef. ]. b, a) H) R/ o9 L1 Z/ {5 G
+ m8 L. G- L- {* ^* Q% T1 ~4 b
* c( u! k# r& X/ z k5 z#FUNC# set the variable `obj-x' according to the input $19 x. Z# Y7 K9 L0 p" M
define set_obj_x% s a: n# c3 Z7 o( q
obj-$1 = $(patsubst %.$1,$3%.o,$(notdir $2))
/ o9 B* s& B# V- r4 Q5 J; \4 ~: z& `- P8 B- L* B
9 e! h4 A- w% @0 V _& R) Hendef7 s$ G0 e, I& U$ O) s
% b( o8 V6 W, ^5 s
* [- I8 N4 i% y#VAR# Get the uniform representation of the object directory path name
! F4 w4 @- |( b4 D0 _5 ^ifneq ($(OBJ_DIR),)$ L! F) x' i2 S6 D3 j2 n5 d
prefix_objdir = $(shell echo $(OBJ_DIR)|sed 's:\(\./*\)*::')- r& L/ r1 \7 J8 c7 c. g
prefix_objdir := $(filter-out /,$(prefix_objdir)/)
n$ P K0 S u. {7 iendif
' u5 z4 O: W2 ^# W
! j# L; P8 q! s8 _' U8 W( z) i2 e1 J$ [5 V: V
GCC := $(CROSS_COMPILE)gcc- e' b) `2 F e/ U
G++ := $(CROSS_COMPILE)g++: B( z! r& r* _2 \
SRC_DIR := $(sort . $(SRC_DIR))
6 r9 e9 z" Q( ninc_dir = $(foreach d,$(sort $(INC_DIR) $(SRC_DIR)),-I$d)
, v6 [) {4 M4 C I% i% o) B2 r/ L8 h
8 v" E3 C$ k" i+ S) v$ d
#--# Do smart deduction automatically
# K3 h4 s$ y w" J8 Q3 N# Z; A$(eval $(foreach i,$(SUFFIX),$(call set_src_x,$i,$(SRC_DIR),$(EXTRA_SRC),$(EXCLUDE_FILES))))" V' k4 o( n" z4 k' q8 ?3 t6 P$ I
$(eval $(foreach i,$(SUFFIX),$(call set_obj_x,$i,$(src-$i),$(prefix_objdir))))- p, G$ Z- `# J; L3 j
$(eval $(foreach f,$(EXTRA_SRC),$(call add_newline,vpath $(notdir $f) $(dir $f))))4 c) X* }' O) W( t8 f6 l
$(eval $(foreach d,$(SRC_DIR),$(foreach i,$(SUFFIX),$(call add_newline,vpath %.$i $d))))
* Y+ w/ X$ r% O8 j$ E4 Q2 `
' W- ?1 _# G: ^- P
( X" ^( k8 y+ w' oall_objs = $(foreach i,$(SUFFIX),$(obj-$i))3 Y) {7 E( D3 T7 j. B9 j3 n$ r2 y
all_srcs = $(foreach i,$(SUFFIX),$(src-$i))3 r' [& i, M+ d( L
8 Z6 g0 V/ F. D7 P: l1 X9 Z3 q) G& P
CFLAGS = $(EXTRA_CFLAGS) $(WARNINGS) $(OPTIMIZE) $(DEFS)& h0 V Z$ n" ~: A) ?
TARGET_TYPE := $(strip $(TARGET_TYPE))
- S1 a B) ~+ y. D- ~( S
: G* c' k: U j8 \) F {/ f5 _) F/ `" W e
ifeq ($(filter $(TARGET_TYPE),so ar app),)
: v' t% `$ R2 P& f1 r" d$(error Unexpected TARGET_TYPE `$(TARGET_TYPE)')* E2 }9 k" j3 l# I2 p9 J, }: w
endif( M; Z6 Z/ _* O3 z5 ^
# J! c9 ?6 c( c9 b! H8 y
# \# ^5 ~" t" h
ifeq ($(TARGET_TYPE),so)
8 a1 ^/ d+ E( k; w CFLAGS += -fpic -shared- s1 @3 r; v( ~+ E3 F
LDFLAGS += -shared
$ p8 k& O+ j \7 kendif, l, `" u2 J) {+ _ P, S
6 S. _, x9 d8 V9 {
$ A) m2 O+ F* E' S# EPHONY = all .mkdir clean4 y! v/ ?# h; G9 q" V! M0 c! W
o: ^0 x1 \6 s5 z0 L
6 a3 `, K2 d @: vall: .mkdir $(TARGET)
9 ~8 r0 p w# G9 C4 F" @
. T* q7 W( N7 q" e. s1 p' e f% k( Z) \4 `( z5 F4 G# @* T
define cmd_o1 I, k7 T, n0 z
$$(obj-$1): $2%.o: %.$1 $(MAKEFILE_LIST). ~& `0 D. B% v7 m& U3 X
$(GCC) $(inc_dir) -Wp,-MT,$$@ -Wp,-MMD,$$@.d $(CFLAGS) -c -o $$@ $$<
, x. o0 i9 h3 p% v( s, S
+ @) E; h! q5 u7 g; @5 m; S5 h% J/ B8 U& N
endef
+ ]6 A$ ?, S# `9 Y# Y$(eval $(foreach i,$(SUFFIX),$(call cmd_o,$i,$(prefix_objdir))))" C! W5 L4 G% y# N1 H8 ?; h/ }
/ Q! e j( B1 M% t5 l+ W4 j, a B m) F# ~9 O, P( n! V
ifeq ($(TARGET_TYPE),ar)
2 g( g3 j- z% I1 I* m" {$(TARGET): AR := $(CROSS_COMPILE)ar/ e. Y) ~6 n2 P5 L1 G' K2 E( t
$(TARGET): $(all_objs)3 R( Y' k5 C# `5 |9 {, {, p t
rm -f $@/ B7 ~" w0 p4 t8 W" r
$(AR) rcvs $@ $(all_objs)4 t+ |3 V+ H7 Y7 X1 {
else4 `9 a8 l( @5 H1 h
$(TARGET): LD = $(if $(strip $(src-cpp) $(src-cc) $(src-cxx)),$(G++),$(GCC))" P5 m: k3 N- M4 r6 g4 N2 e
$(TARGET): $(all_objs)/ z& W* O1 P! T2 C& X7 }3 N
$(LD) $(LDFLAGS) $(all_objs) -o $@/ k) H& `2 \9 T& I8 R- V/ W
endif; r3 ]$ T( x: ^' p# }6 s" x( Y: T
6 P. b; B0 k6 i% ?+ _6 I9 w4 {0 @% Y' b: X& _% {
.mkdir:! s# a! k$ ?$ D7 y1 {! {/ ]
@if [ ! -d $(OBJ_DIR) ]; then mkdir -p $(OBJ_DIR); fi8 V: O) R3 [3 s. a9 U) b* Z
7 j F* U5 e' J- P0 D. l
, u9 f2 z3 `& O+ C% G! ~7 eclean: h# g6 x/ l; {5 r
rm -f $(prefix_objdir)*.o $(TARGET), k6 a' C/ j5 f, i. w
1 V# `% K3 \2 R: n* F
+ n* R; K" m+ ^% m$ {) E-include $(patsubst %.o,%.o.d,$(all_objs))
/ w! @7 [ O; M" p
* z/ D {9 z& D. b5 j1 @
N; D, w, Q5 s$ a.PHONY: $(PHONY)
# f. l, m3 f6 b6 v
* L. Z/ i: w" U) s! M* o |
|