版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
###############################################################################
. n( q4 T% T& i( {#
! E6 a: p, n) V' m1 @# A smart Makefile template for GNU/LINUX programming$ p9 p F% T2 P' W! h2 x) r% O# D
#
; U8 J u6 ^' D! v$ G9 k( y# Author: SR
- D: X- a4 z7 h# Date:
$ e" r$ L" m( @) Y#" J: t4 G+ ?9 X( y" Q2 B1 d' ?
# Usage:& ^/ M7 U4 n( k' W& @
# $ make Compile and link (or archive)
- o6 ? x$ u; ~$ m8 _0 r4 a# $ make clean Clean the objectives and target.1 {; J) W4 x5 S$ G y4 d, a
###############################################################################
. q; W0 q9 y8 U0 u: T. X* r) F: {0 X& g
3 g) o. ?7 M" ]; _
CROSS_COMPILE =6 a' K$ }& h2 y
OPTIMIZE := -O21 j' T0 T, r2 Y
WARNINGS := -Wall -Wno-unused -Wno-format
% s, n+ O- F( C1 X+ P6 kDEFS := -DMYDEF=1 -UMYDEF2
( @; D) W% P, KEXTRA_CFLAGS := ' ?8 Y/ O$ g" u# p! i; }0 n; M
5 }8 C0 e$ u, ]' L a/ {2 v* N
8 j3 p9 e1 j6 @INC_DIR = include! R7 Z! }* D, x w) E F0 i
SRC_DIR = src1 src2/a src2/b/ W! K h0 w; V# ^2 F% d" i) A
OBJ_DIR = out/target
2 Z) J; H+ p0 m4 ~. bEXTRA_SRC = src3/z3.c src4/z4.cpp
! J+ }/ b& U, n- H. g& f1 D' v( w* O8 dEXCLUDE_FILES = src1/skipme1.c src2/a/skipme2.c
9 ]0 _6 y" p8 G- Y( \. i
3 r% I8 y* Y$ o# X) T
' y5 B% `$ }# W, kSUFFIX = c cpp cc cxx
9 I8 s$ V$ l6 T/ m$ fTARGET := out/go.exe
9 R1 a5 ] m0 M3 |8 `) d5 _4 h C% X$ {#TARGET_TYPE := ar# S2 M3 R' o# Z9 W+ H
TARGET_TYPE := app- E5 s& j, `+ Y4 C* ?3 t1 N% N
#TARGET_TYPE := so
8 k7 }8 l2 V9 N3 h( Y4 W
0 m# D: ~( E- z7 c# E% Y3 w8 |, B, V4 c/ C" p' Y$ c
! f0 V. j' K/ B3 F
1 e6 e/ B; f: C5 B" l
#####################################################################################
/ c# h3 e0 a# h+ ]1 G# Do not change any part of them unless you have understood this script very well #2 m( S" ~1 D, S
# This is a kind remind. # o3 ?5 z9 k8 _" v P2 \& K% u
#####################################################################################
" l. G8 ^. W4 i. v* K" \% C% w1 Q# o' E+ ^6 c1 w B9 i1 W$ E
" {9 g# r, I7 K% E: @2 U# Z8 H
#FUNC# Add a new line to the input stream.
7 P0 v5 C# K: r* y8 adefine add_newline1 C- {: U' f% Y y# ]7 Q8 I5 x% E
$1
# o; X Y' B# z8 d: q5 K2 Q9 C9 G# q: @5 l
7 M2 z) |/ n" f9 i- ~- S
endef
9 w1 D! m$ {' H9 F6 ~" m4 {+ u" V. \: G) _ d3 e
; o2 `* f9 S& ~; n' w
#FUNC# set the variable `src-x' according to the input $1( Q. x" g! n! P
define set_src_x
3 |$ f/ b$ A" f3 x) ?src-$1 = $(filter-out $4,$(foreach d,$2,$(wildcard $d/*.$1)) $(filter %.$1,$3))
0 a. F7 ]! \ ?. x
' }* a7 w0 y) }2 e/ k5 \: a- z/ {1 j. l! _" y
endef
]4 e0 F. v4 g( Z
/ E) n& u' V( o' f! k B2 l* J5 N% M) C7 R9 R2 L& I' t
#FUNC# set the variable `obj-x' according to the input $1
& K9 |0 G& H# j# L4 o. M" M/ j- Odefine set_obj_x
3 t" b) s- l* c4 robj-$1 = $(patsubst %.$1,$3%.o,$(notdir $2))
! H! {+ |+ K8 X4 @& }, v4 c
& J2 m, \. s) Z2 f( _2 m/ ]) l" v+ t$ w8 M
endef7 }+ _! e1 h$ I& ?
# v% R8 M# \ s2 {0 Z+ b$ P ]
- }) r/ g% N8 {; ~6 o1 q
#VAR# Get the uniform representation of the object directory path name
4 ]1 P I8 r8 Jifneq ($(OBJ_DIR),)
3 k2 y: s" ]% X8 mprefix_objdir = $(shell echo $(OBJ_DIR)|sed 's:\(\./*\)*::')
: ]" A+ v, E% ]& @+ A, n O4 gprefix_objdir := $(filter-out /,$(prefix_objdir)/)
6 |/ ?2 q( r7 I$ M9 Xendif: @. G* @* B0 X+ s) K
7 t8 T1 S+ m( c4 c; b8 w$ X
+ \# O3 l* W6 ~
GCC := $(CROSS_COMPILE)gcc' _7 a4 U( i4 W6 I3 y* n
G++ := $(CROSS_COMPILE)g++" l- a0 N% c% O# P: U0 F
SRC_DIR := $(sort . $(SRC_DIR))
4 G! ^" |( h% M1 `5 i) O) finc_dir = $(foreach d,$(sort $(INC_DIR) $(SRC_DIR)),-I$d)8 G6 p4 V2 Y0 m% j X$ T/ |* K! @2 |
I8 ^" x0 Y5 n! d
; i$ }; o |9 t$ E# V$ D#--# Do smart deduction automatically9 D3 P3 G) p: h _; @+ @, p, J1 d" L
$(eval $(foreach i,$(SUFFIX),$(call set_src_x,$i,$(SRC_DIR),$(EXTRA_SRC),$(EXCLUDE_FILES))))
7 y$ T- L3 W1 J* h2 A i% k$(eval $(foreach i,$(SUFFIX),$(call set_obj_x,$i,$(src-$i),$(prefix_objdir)))). d( c2 V2 P0 n" _+ v: d+ @
$(eval $(foreach f,$(EXTRA_SRC),$(call add_newline,vpath $(notdir $f) $(dir $f))))
3 `8 D7 d6 ^- n' n1 P( V/ h$(eval $(foreach d,$(SRC_DIR),$(foreach i,$(SUFFIX),$(call add_newline,vpath %.$i $d))))
9 n/ X5 l, {, ^; G; S" z ^5 T- r) {# i
* h& v; K0 o5 I7 K" C
all_objs = $(foreach i,$(SUFFIX),$(obj-$i))
* m+ n ^4 H$ u8 r/ Vall_srcs = $(foreach i,$(SUFFIX),$(src-$i))9 }7 I% |# B0 x$ @" f1 [
- d* L, |- U+ B* j$ [
; V Z% N: V) j3 U0 {; _1 kCFLAGS = $(EXTRA_CFLAGS) $(WARNINGS) $(OPTIMIZE) $(DEFS)
0 K, ?+ s p+ yTARGET_TYPE := $(strip $(TARGET_TYPE))/ L& @& P1 _" a2 U( a
* q3 C1 V c7 s R& D
% w* x& y2 l* z/ U3 f8 p6 j9 M: K5 Eifeq ($(filter $(TARGET_TYPE),so ar app),)
. ~$ E' B2 T$ ^0 a U$(error Unexpected TARGET_TYPE `$(TARGET_TYPE)')
0 l+ ^: @1 t, U3 A2 P9 eendif E8 A. K) l0 R# R4 }
* ^2 r1 r' `- E. S0 S5 r/ t" |, k7 S) P3 P
ifeq ($(TARGET_TYPE),so)
% c' _4 p7 u4 ^" @( H7 o CFLAGS += -fpic -shared
8 n: |, ~1 K( ^+ W+ I LDFLAGS += -shared& |- A. P4 K' w5 j% g% G% z
endif0 y5 U; h! a8 P$ `8 v0 I5 \
5 {9 `/ y; y) C! {
4 v! C- h" e8 i. E/ F2 `: q7 z3 D* x pPHONY = all .mkdir clean) t! ~ G* D+ i9 l/ S
/ I# g+ @ p* E; d* i+ `% p. I% r
1 P" M5 i+ K; I- v) { [all: .mkdir $(TARGET)! J4 H! e r# g) z# s7 b6 [
, S7 u5 D+ p7 O7 x& R6 C2 d
6 _. D7 D' k# j% U( x2 E
define cmd_o
# P, @ p+ G# w0 Q" D% S$$(obj-$1): $2%.o: %.$1 $(MAKEFILE_LIST)
6 d7 X& w; K( D+ V$(GCC) $(inc_dir) -Wp,-MT,$$@ -Wp,-MMD,$$@.d $(CFLAGS) -c -o $$@ $$<
! B$ q# j$ C2 T# Q G0 U O
" ~! v& ]% l/ P6 D
7 D6 C5 t- [0 y8 L5 j4 c5 J# Q6 lendef# S \( R7 i9 s2 v" I) l0 z4 n
$(eval $(foreach i,$(SUFFIX),$(call cmd_o,$i,$(prefix_objdir))))
8 ~; n) o/ `* ~: z2 `
" Z; V; z0 r' k, C! K1 d
) W; i& x2 b0 e/ x3 s, |ifeq ($(TARGET_TYPE),ar) k5 E5 W, B: C$ D! o& |
$(TARGET): AR := $(CROSS_COMPILE)ar2 t) {; F! ~! _8 P
$(TARGET): $(all_objs)+ S0 Y) J* h# K+ Q" C
rm -f $@
$ Z0 ~# \; M7 `( j) G6 K# d4 f& l$ N: t$(AR) rcvs $@ $(all_objs)+ L. N/ N: j6 ^- l8 d! o9 R5 j0 E
else0 B4 ]# |9 Q( Z/ j+ J. [
$(TARGET): LD = $(if $(strip $(src-cpp) $(src-cc) $(src-cxx)),$(G++),$(GCC))# r3 b: z& z2 b7 y% L
$(TARGET): $(all_objs)
( S0 U5 j; t2 @( R( F5 q$(LD) $(LDFLAGS) $(all_objs) -o $@
' z b2 D4 w) s+ ?- hendif
1 S7 [( H; L! _2 N3 D( d) d' X, `) u: w8 B- B
' a+ c% q! V& I) T- d8 h9 y7 S
.mkdir: K1 y# w, C/ r
@if [ ! -d $(OBJ_DIR) ]; then mkdir -p $(OBJ_DIR); fi) G* l* s2 m0 V6 s6 E- o
$ f" P/ Z$ G; ]6 X' t' O/ @- v
; s" |- q' {" k4 R$ vclean:
+ ^, M( ?& z9 ?! e7 U' g8 _rm -f $(prefix_objdir)*.o $(TARGET)
`" s6 |8 X) W4 i+ t3 f+ Q$ k6 c# O# i l
/ |1 p4 {, Z U& r$ w7 o V-include $(patsubst %.o,%.o.d,$(all_objs))
" x+ U2 \/ R5 }& U* u
9 `6 g3 Z6 h$ Q" I
% h3 E0 i# N$ ?0 R+ i" ?+ v.PHONY: $(PHONY)
; f# N) \, k: E B0 B
3 |4 v% E" o8 A; s# p4 R y |
|