版主
主题
帖子
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
###############################################################################2 l7 Q9 a: l) g
#
0 J0 ]: w2 R6 w! y# A smart Makefile template for GNU/LINUX programming# p% B1 {/ L) F
#
* f4 x, j/ S$ I& ~# Author: SR- J3 r1 i# I: K5 Y
# Date: 7 o5 G' v ^% {
#
, A$ b8 j- e4 l# Usage:
% o3 v: @- e% |3 L0 l' f' e# $ make Compile and link (or archive)
% u! T: i; ]/ u; B8 r' {# $ make clean Clean the objectives and target.
/ _7 I3 ?4 x( W6 ]+ r###############################################################################8 k/ ]3 g; |' Q9 j
" X1 C! s! Y) Z' n ^) ?2 S/ s7 {2 E; m
CROSS_COMPILE =
8 \! _. b! a# F2 e" GOPTIMIZE := -O2
! [. [4 W0 u1 q2 h- YWARNINGS := -Wall -Wno-unused -Wno-format
N. X1 j: m B. WDEFS := -DMYDEF=1 -UMYDEF2
+ v2 c% ^0 Z _: p' J. x& xEXTRA_CFLAGS := 9 n- P3 R `5 S; k% r1 O |
4 J, \( k# v8 k/ D! N/ X$ m7 b
( f5 X) l% C2 s% D2 D! Z7 dINC_DIR = include, O4 t- W# h- Z6 g, P
SRC_DIR = src1 src2/a src2/b
9 H8 v4 o6 s" X' X) b+ W/ [; WOBJ_DIR = out/target
5 ~: E0 I" E% o: G) pEXTRA_SRC = src3/z3.c src4/z4.cpp
+ a& Q& B: S6 f; f' fEXCLUDE_FILES = src1/skipme1.c src2/a/skipme2.c: m$ B6 T( [3 }) C
% w* R/ `% T2 w: H2 e
1 y3 ]* x5 O! }+ GSUFFIX = c cpp cc cxx& A! G0 X$ J( k/ s' W
TARGET := out/go.exe
# R- W- {7 G1 E1 K6 M B#TARGET_TYPE := ar8 t$ v9 M' e# I5 }% A
TARGET_TYPE := app* \8 E \( Z( g; G6 Z1 g+ Y
#TARGET_TYPE := so [, T* z' J, i2 R$ k& f
( j* W8 \( }* t% t; r8 s
% ~- e n( X2 c9 @0 m) S: p
: p8 W4 ]- @; i J- }7 I
0 d1 ?2 r2 Y3 z: {#####################################################################################
6 @/ T1 x* M# F9 q' L# Do not change any part of them unless you have understood this script very well #& Z, G# ~# {% j% p5 K4 I' R
# This is a kind remind. #, i( {- z6 N9 {0 g) m l% V" [
#####################################################################################4 Y" N, {0 C! ~6 u1 k. Z
5 O" Y1 T4 [* K0 w9 F
n: A: o1 d4 L8 s I#FUNC# Add a new line to the input stream.
3 y& K- S/ f! X$ ]define add_newline) j5 E* b" w7 D! d9 D4 e6 [
$1" ]' k- R9 N4 |0 \7 Z/ E
# I3 b/ A, e; C3 g
: ?! I$ \! N. O' ~. d$ ]2 y' xendef3 S: E% Q; s% W: j# u+ [/ V6 f8 O
+ I3 j5 _! ^7 X5 s4 r! E; @/ o2 u
#FUNC# set the variable `src-x' according to the input $1
% H( T; y2 [0 A4 S% G+ Q( Udefine set_src_x
2 q5 Q+ R- x0 zsrc-$1 = $(filter-out $4,$(foreach d,$2,$(wildcard $d/*.$1)) $(filter %.$1,$3))/ `! o' ?+ ?1 h g
0 Y* S7 m% c3 e
+ T2 A1 m# g6 y/ t: iendef3 G% Q+ P; w& _9 T0 y( F0 S
" v% s! C. A6 D2 x, n9 E8 D
8 O9 _: q {+ |8 R+ q) l0 P) S' J#FUNC# set the variable `obj-x' according to the input $1
7 {! }" k" y2 G5 _3 l+ S7 h. vdefine set_obj_x
8 K4 a4 U2 @5 o1 Wobj-$1 = $(patsubst %.$1,$3%.o,$(notdir $2))
9 x! n2 t( w* u2 Q$ R" J$ H: m$ S% |) d* g2 n# a$ T- `# W
7 U0 w( f7 E6 q) dendef
+ t( s. Q9 d; @# d' g0 L" u9 N- I: e) ~3 I( S
* u& M/ b4 @/ K7 @' J+ A2 I#VAR# Get the uniform representation of the object directory path name
9 @5 x' l) _/ |ifneq ($(OBJ_DIR),)
7 I1 J6 C* m+ Q/ M- Zprefix_objdir = $(shell echo $(OBJ_DIR)|sed 's:\(\./*\)*::')! `; X9 u; ^( A- p& i3 j. X# k
prefix_objdir := $(filter-out /,$(prefix_objdir)/)9 i/ d( Y3 ~$ W; m4 Q0 o
endif
1 n4 P6 q+ A% b( b2 N" ]
3 z6 ^, f& \/ |& d% j: S7 V1 E1 o$ V! G# v1 j- W: y5 ?% Y* F
GCC := $(CROSS_COMPILE)gcc
6 R2 O1 P1 n: s$ gG++ := $(CROSS_COMPILE)g++6 w \) O+ b7 N* x( u% T$ F& S
SRC_DIR := $(sort . $(SRC_DIR))
! o2 v$ W' m9 G6 a6 Kinc_dir = $(foreach d,$(sort $(INC_DIR) $(SRC_DIR)),-I$d)8 `( _, H9 A# w/ Z
; H4 z! k; \2 v& w2 D6 e7 P: K: H2 s/ A5 L6 [( N
#--# Do smart deduction automatically3 ^! z$ \6 A; w0 w. q7 I
$(eval $(foreach i,$(SUFFIX),$(call set_src_x,$i,$(SRC_DIR),$(EXTRA_SRC),$(EXCLUDE_FILES))))
( X' O/ E. A% \6 v$(eval $(foreach i,$(SUFFIX),$(call set_obj_x,$i,$(src-$i),$(prefix_objdir))))6 E( |) U: M7 F1 Z/ Y! i
$(eval $(foreach f,$(EXTRA_SRC),$(call add_newline,vpath $(notdir $f) $(dir $f))))' \8 y# T& A' ?5 f* n/ G2 _1 r
$(eval $(foreach d,$(SRC_DIR),$(foreach i,$(SUFFIX),$(call add_newline,vpath %.$i $d)))). `. d- z8 h) |( q* F4 |% {
) x( K) r. v: V* n+ l0 o2 D7 r5 E: s. C
all_objs = $(foreach i,$(SUFFIX),$(obj-$i))7 {- l, d& j# V; U! o) V L& o
all_srcs = $(foreach i,$(SUFFIX),$(src-$i))
* ]5 a! `9 o! e4 j! t5 R" o, W$ ]! |& P
) i- F; b# `0 J2 a. ^+ H2 RCFLAGS = $(EXTRA_CFLAGS) $(WARNINGS) $(OPTIMIZE) $(DEFS)1 z* q. l. [2 O6 O8 w- N1 O( D& Z: D
TARGET_TYPE := $(strip $(TARGET_TYPE))5 Z* h8 S) M' N$ q% ^+ C
8 v5 M1 `+ n( I/ P
2 G/ F. x5 t$ W' D* J% e& Uifeq ($(filter $(TARGET_TYPE),so ar app),)
6 }* ~' q+ `/ ]' s6 f$(error Unexpected TARGET_TYPE `$(TARGET_TYPE)')' ]: S; t4 h$ B5 e6 v X
endif& ^% E0 e7 a) c) F: _- t
* \1 ~9 e7 E4 [/ \) \( d2 R
k" j/ e0 F7 C
ifeq ($(TARGET_TYPE),so)0 O% B1 J; {9 P3 C- p* Z$ m3 y! u
CFLAGS += -fpic -shared
' z* r2 X; A7 S7 ?. B* ~ LDFLAGS += -shared% b3 i9 V2 m' S' G: X1 K
endif' j& G l; a; M- k1 ~9 V" }
2 K* }" d- ?5 c5 K- L5 V2 B9 o
/ D" n4 N0 _7 ]" R& _! s: mPHONY = all .mkdir clean
; a' f, f* Y! A" {
5 ?! S1 Y$ m+ x, t/ K" H! }% w; \! B: l' {' d: B* |- O# E
all: .mkdir $(TARGET)
* \6 E6 p' Y. _7 [5 V5 w& i! L c9 a) D# ?
5 @6 q( [+ k& [( Z
define cmd_o4 f/ o" r* t. [
$$(obj-$1): $2%.o: %.$1 $(MAKEFILE_LIST)
( T, z/ ]; @6 V a$(GCC) $(inc_dir) -Wp,-MT,$$@ -Wp,-MMD,$$@.d $(CFLAGS) -c -o $$@ $$<
3 J6 R" \; [1 S, c' I9 H# I6 o9 r7 ^
8 d9 p! V& n4 l1 n) B% m' X
+ V7 X9 a V3 w- ?8 b2 T( rendef
3 z2 N1 @2 l+ I1 c9 Q5 A$(eval $(foreach i,$(SUFFIX),$(call cmd_o,$i,$(prefix_objdir)))); j7 H$ Z4 W8 X0 |' j0 Z' u* ^; ]- Y1 ?
( e$ a' g: v: s1 F; c9 j
+ C0 _- ?) @' a8 }7 Z8 N( sifeq ($(TARGET_TYPE),ar)# I% z% ]; }8 ^' m6 g
$(TARGET): AR := $(CROSS_COMPILE)ar
! a/ Y" r! {; N0 O) G+ h$(TARGET): $(all_objs)2 \% g7 ~6 C6 L1 P5 a4 U+ @
rm -f $@) X W2 j0 F2 W' y$ z
$(AR) rcvs $@ $(all_objs)
8 I. ^. T7 T" t( C' W* g0 t# velse
, k$ U- z8 ]/ }$ ]4 q6 G$(TARGET): LD = $(if $(strip $(src-cpp) $(src-cc) $(src-cxx)),$(G++),$(GCC))9 ^3 A7 w$ G* n+ p
$(TARGET): $(all_objs)
9 R0 o' }3 X* b, Z+ q" O$(LD) $(LDFLAGS) $(all_objs) -o $@
|5 Y% n0 r! M5 R6 v8 vendif
@2 {* P/ Y+ A6 ?$ S3 ?2 s) v0 Q+ s$ N! \3 A4 G0 N* s: h& N( s# o+ A
# V% J5 I( E5 w* u# T) q1 n.mkdir:! n1 u! R; Y# F
@if [ ! -d $(OBJ_DIR) ]; then mkdir -p $(OBJ_DIR); fi
! G( ~0 C! v# W- O" s% I
3 Z4 J5 K1 ?4 m6 C; V( F3 q% w) M1 R9 W' p; A$ C7 Q
clean:8 S0 h3 }1 @9 E" f& W. t8 Q
rm -f $(prefix_objdir)*.o $(TARGET)
0 I( b) N2 C8 Q8 [9 ^1 T$ W6 k* f5 u" J, C) V3 X9 t' Q6 L
7 ]: w3 f. o8 m# `
-include $(patsubst %.o,%.o.d,$(all_objs))
/ J& I7 ]# h" m/ C1 K1 @: A0 V$ ~2 ?3 X( P1 }
% v6 i/ H4 F3 X. K- Q5 r% Z.PHONY: $(PHONY)
2 }( O8 p6 ~7 M! E
6 ~ }7 k! T& D/ L8 n3 f |
|