版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
############################################################################### a; U( A! |5 k9 p/ b8 i
#
5 j. e% z8 ]( T2 f* c3 j0 j# A smart Makefile template for GNU/LINUX programming; N _0 n" A0 L3 [. {2 P9 ^
#6 {- g! i9 s# B% h; I
# Author: SR
1 x p! u4 G+ N# Q, I' A0 K7 Y# Date:
, H$ z& w* z% q% P#) P& ~$ N5 c8 k" T
# Usage:
) L4 K5 X' E" @# $ make Compile and link (or archive)" G k1 o6 x: z9 S& y8 y8 ]/ k6 \/ l6 g/ F
# $ make clean Clean the objectives and target.5 |9 I8 I! R5 ]% v+ H9 m) i9 S- D
###############################################################################5 M: I) t6 v+ F, u- w3 A$ s9 t
# R* S u: @& u& P( g
( D# }7 x, A: {( ?4 s' M
CROSS_COMPILE =1 f u5 Q/ s- z3 T1 a* L
OPTIMIZE := -O2
* u* Y% m' J8 X9 l8 V# ^& NWARNINGS := -Wall -Wno-unused -Wno-format
3 O5 w. v0 Q6 n6 \/ A, Q6 i. Q) R, ?8 ODEFS := -DMYDEF=1 -UMYDEF2
# {% Z, N1 s( T5 B# fEXTRA_CFLAGS := % U) B; G7 o `) u# y% O
+ Q f/ {5 H7 k6 p9 v7 X! ]' ^+ X) z* @
1 ]" q; a, W( XINC_DIR = include
4 a2 `$ L: M5 lSRC_DIR = src1 src2/a src2/b* R- I7 P ^1 a
OBJ_DIR = out/target
6 D8 ~0 F1 G( G8 A' L& P! S7 j; ?EXTRA_SRC = src3/z3.c src4/z4.cpp
1 T e: @0 `6 q7 ~0 IEXCLUDE_FILES = src1/skipme1.c src2/a/skipme2.c
3 L X3 h! J* a- |4 ^- ?
4 `! x! `$ K1 K2 y
7 y' Y, G3 V! s: x) USUFFIX = c cpp cc cxx6 T9 B2 G: d/ `& V& u& ~
TARGET := out/go.exe2 w0 W u$ d7 q& g( t( ^
#TARGET_TYPE := ar
$ l& |" z* I' k7 x3 B! FTARGET_TYPE := app) I6 t! A0 A: |( c9 j6 [: ~
#TARGET_TYPE := so. Q+ d1 Y% j* m1 e H3 k# g
% I8 f* A. }3 O% Q8 f4 w O& z: o# |6 x6 P9 w+ c& p
1 I, L/ i. w6 I1 Z2 o: c/ v) y& |/ I: l. X
#####################################################################################
# V0 v3 \. c3 u7 o; C( `# Do not change any part of them unless you have understood this script very well #
8 d* F' k3 b. k( {, C4 e6 L# This is a kind remind. #
6 r# N4 f7 \1 L: _" g: w4 Y#####################################################################################7 Z. l3 h$ \2 |: c8 k. @$ f
6 N# u S- t" z4 G
( b- W! C, o/ o$ R#FUNC# Add a new line to the input stream.
" ]: v" Y& e5 n" b7 g( V3 r$ qdefine add_newline
8 _+ B7 e% o9 [# {! [# W4 d6 Z$1$ v. v) y. E$ C w4 c1 u% v" K6 s# Q
0 v3 z0 _% a! q8 f7 w5 o4 \6 r0 m; s' U1 G9 ~
endef
8 O+ _# f5 b- ~$ z- d" I ]
9 _ w. Q0 V# Q1 [7 l, D% g' f8 q, V/ O
#FUNC# set the variable `src-x' according to the input $1
3 B* @4 G. Z. q+ {, P4 @. `! Edefine set_src_x6 W' o4 V3 `! Z5 J. r7 |
src-$1 = $(filter-out $4,$(foreach d,$2,$(wildcard $d/*.$1)) $(filter %.$1,$3))
' {, E! o# I1 B% \2 p* A9 S) V; {! L ^' Y
1 G# @ \2 m5 xendef
8 D% i2 G9 s& M9 w1 S6 h' u3 |. u' s' r& j6 E
& E1 [. J. K5 ?3 d" Z7 o#FUNC# set the variable `obj-x' according to the input $17 f2 S* b1 f2 k: |& k$ c
define set_obj_x
% \5 c) V( ~! E5 m9 Y# xobj-$1 = $(patsubst %.$1,$3%.o,$(notdir $2)). X Q$ D! E* @' @6 h0 ?6 h' I5 l% L
+ V1 N0 `9 t; X& ^$ V- F5 k; @0 m2 {8 C
endef
) M$ c# a% y8 C7 c# _5 E- B8 ^# d3 x& S6 j# f2 E1 Z
& g E9 c r9 j( s4 O#VAR# Get the uniform representation of the object directory path name9 _+ g) b. |8 i% Q; r
ifneq ($(OBJ_DIR),)
- f% ?% d2 |) \8 m/ W- sprefix_objdir = $(shell echo $(OBJ_DIR)|sed 's:\(\./*\)*::')' Z7 u0 o T5 h; q9 p+ K B
prefix_objdir := $(filter-out /,$(prefix_objdir)/)
' p) `( H2 l( t9 i, Q$ H; wendif
2 v8 T5 z. S$ K5 k; _9 b/ P. i" ~# e _1 V
0 j% n: N8 @$ }8 \GCC := $(CROSS_COMPILE)gcc9 v: J+ ^9 d [4 l( J
G++ := $(CROSS_COMPILE)g++& B* b0 v' l# O* _% w. d
SRC_DIR := $(sort . $(SRC_DIR))
/ h1 F2 y# w8 s7 T* G6 z- @inc_dir = $(foreach d,$(sort $(INC_DIR) $(SRC_DIR)),-I$d)% r, [+ n, z+ e) J2 P
9 D. c4 I3 ]& Y! y
- u" ~7 G) r3 I7 m' R/ w) ^
#--# Do smart deduction automatically. \/ ?% w, Z! U% T
$(eval $(foreach i,$(SUFFIX),$(call set_src_x,$i,$(SRC_DIR),$(EXTRA_SRC),$(EXCLUDE_FILES))))
& K7 m4 J, }+ D" q" [# c$(eval $(foreach i,$(SUFFIX),$(call set_obj_x,$i,$(src-$i),$(prefix_objdir))))2 ?) M5 M* f: [! ~
$(eval $(foreach f,$(EXTRA_SRC),$(call add_newline,vpath $(notdir $f) $(dir $f))))
# v) c( B! k6 U* {% L" _$(eval $(foreach d,$(SRC_DIR),$(foreach i,$(SUFFIX),$(call add_newline,vpath %.$i $d))))
8 H$ `- D3 l2 P$ F0 o
1 A/ ~4 q- `8 U9 c' t" S
* u+ w& `9 i1 Mall_objs = $(foreach i,$(SUFFIX),$(obj-$i))
3 v, ^# i. M6 kall_srcs = $(foreach i,$(SUFFIX),$(src-$i))0 ~' N5 }, v, H
T2 z+ o) w; d2 U+ R8 i
; Y3 q' G" X6 K* X6 l8 W4 v
CFLAGS = $(EXTRA_CFLAGS) $(WARNINGS) $(OPTIMIZE) $(DEFS)5 K" a3 n9 I' F- I
TARGET_TYPE := $(strip $(TARGET_TYPE))
% a+ H0 ]8 r# b) ^1 H5 Q6 S9 q3 I4 |( [1 S& g. d I9 O& |
. V1 [0 D5 c/ Q
ifeq ($(filter $(TARGET_TYPE),so ar app),)0 T7 R0 ~5 h' A! j' p4 L7 p. u4 k2 Z
$(error Unexpected TARGET_TYPE `$(TARGET_TYPE)')& w5 A# u+ y# H) K
endif
1 P+ `* \* {3 S. Q
# ~1 `. F! j! Z: c. D; j7 i% H
% n# y9 Z0 k% G+ h! @6 x- i3 jifeq ($(TARGET_TYPE),so)8 a: m' w7 ^; K3 D$ {
CFLAGS += -fpic -shared
& V& m1 L2 {' }3 ]: \5 o LDFLAGS += -shared
; i* l, ^' P) n4 ^& K% c' ^0 {/ Rendif( y& O3 z( Z: G: q' x1 H- W
. L+ r1 u2 ~; l( V( t
& G( a7 O" o9 |
PHONY = all .mkdir clean* \- t q/ C7 P! w
9 A. I& ~, z |- g; h- J- S3 \; K/ U5 V3 y% x7 k5 W) q
all: .mkdir $(TARGET)
. U, T2 B+ K/ S5 i! J" V6 u# D# [% j1 J% B" d: Q( I* E: ]
% z" c9 Z6 g3 h+ G2 [define cmd_o- }3 P& m2 a/ _# k0 k' O) I5 O
$$(obj-$1): $2%.o: %.$1 $(MAKEFILE_LIST)
, A' ^/ L# V$ j. D7 Q; g7 ?$(GCC) $(inc_dir) -Wp,-MT,$$@ -Wp,-MMD,$$@.d $(CFLAGS) -c -o $$@ $$<' \' K2 ?2 O4 w
/ S5 i: Z5 d* F
4 Q7 c4 m& i' |" r) }6 p, `1 |
endef
8 v2 [& y' o1 v$(eval $(foreach i,$(SUFFIX),$(call cmd_o,$i,$(prefix_objdir))))
9 A* D6 \- [. ^. t4 [& \7 e$ Y- F3 }6 X8 S! \
$ M; F/ \; q. z' ?% S4 K$ {2 }ifeq ($(TARGET_TYPE),ar)5 s; v# {# F& |0 {1 ]% r# K" A9 `9 m
$(TARGET): AR := $(CROSS_COMPILE)ar6 s+ O7 f. d, _- h
$(TARGET): $(all_objs)
; ? G. \ c5 T4 hrm -f $@
. Q2 ~8 Y8 Q* `1 N% D( O: X$(AR) rcvs $@ $(all_objs)7 h% g3 R! M' i! G0 F# f
else. O0 X Y) R _% r& z
$(TARGET): LD = $(if $(strip $(src-cpp) $(src-cc) $(src-cxx)),$(G++),$(GCC))9 I$ k2 h5 l2 P4 {, E
$(TARGET): $(all_objs)
% u: b& ?" N6 w& N# }# X" }$(LD) $(LDFLAGS) $(all_objs) -o $@4 K! I6 x1 [& L( f2 q3 F+ M: k
endif
$ g) n' \' s& d9 A8 y5 {; D2 L
( X- v( G9 P1 F( f* q
7 c, Z* D- R5 A5 D4 ^.mkdir:
. V i/ x) d' `3 f6 \@if [ ! -d $(OBJ_DIR) ]; then mkdir -p $(OBJ_DIR); fi
: B" z# \4 e3 z, \& x4 M$ @0 o7 _& w6 m2 v, ^' F* N, C* O# [: _6 D
, c s$ [! I' D/ P+ O6 }; B8 r7 dclean:
/ g1 z/ F$ l( V& |2 Z2 Brm -f $(prefix_objdir)*.o $(TARGET)
1 ^) O- c" Z5 b* G# C* p, b3 V4 t# X# r$ Y) @& p' j
. l2 o8 Y; E* A H$ A
-include $(patsubst %.o,%.o.d,$(all_objs))
/ `: [$ S. X# h _4 K; |4 {) a* u
/ z+ b) y; W% X
.PHONY: $(PHONY)
) O/ v) k+ b9 U- i C, W! G/ s/ M( H4 o Y; R: V6 n; h4 R; K, u% A
|
|