版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
###############################################################################
6 ^& r! ? N) `4 G [#
$ t" R. L+ Y7 R* G0 d0 i2 }/ a9 J- [# A smart Makefile template for GNU/LINUX programming8 |# G9 Z8 T2 i( A
#
+ r+ l/ X( \1 u9 c+ k# Author: SR
+ L$ \6 g$ [. E- M) \. O+ ?. Y# Date: : e4 {3 }2 Y: h6 x6 j* p2 Z: x
#
+ W! |$ E. t1 E$ H, m. S# Usage:- T) E* @% N1 W% f2 R) a
# $ make Compile and link (or archive)
& K, i/ j2 o2 u0 j0 P, r# $ make clean Clean the objectives and target.0 S2 Q4 }6 t1 _. w4 {7 n4 {9 E2 j2 x. Z
###############################################################################7 }7 {1 _. j. c& c( u& F: l
9 x- ^1 k# [9 }
( l: Z# |8 J& r% Q) |+ S
CROSS_COMPILE =, {$ J1 H4 ]7 S P, |1 V+ `* o
OPTIMIZE := -O2. O" S: s; Z; B- x& `5 [& r a. T
WARNINGS := -Wall -Wno-unused -Wno-format$ D6 N j' ~: d, x# Y/ i
DEFS := -DMYDEF=1 -UMYDEF20 V ], Q$ v, |& j
EXTRA_CFLAGS :=
9 m+ Y/ m: }3 ?2 |
. H5 n7 \0 M- _* E$ t
x4 Q6 A2 [0 M P3 NINC_DIR = include, W( Z2 E9 g3 J( x
SRC_DIR = src1 src2/a src2/b
0 B9 k- R- N9 N6 N: P0 ?1 uOBJ_DIR = out/target
2 F1 m4 q7 l5 B* P* s4 [' c5 e5 D H/ xEXTRA_SRC = src3/z3.c src4/z4.cpp
) I* v: e! R2 M/ LEXCLUDE_FILES = src1/skipme1.c src2/a/skipme2.c
$ v: }8 z x/ n7 @, a
$ m0 @; i. ~9 u( i+ P' G3 x4 F# f0 }, w% n1 n
SUFFIX = c cpp cc cxx1 s; {, D5 w# C
TARGET := out/go.exe* i2 } y9 h! k) I7 M" F& d# K0 a J
#TARGET_TYPE := ar
! C$ S$ [ ]% f' H, aTARGET_TYPE := app
9 w; N4 M8 z" J( h4 P#TARGET_TYPE := so% c/ O Q5 i; L
/ S! J, Q; c* W/ X' I `" l4 ~5 s4 M9 _. Z, S9 J
6 H3 g% h1 ?" \2 ~3 q
$ ^9 s" K! D; g0 G1 y3 k#####################################################################################9 z! l" P& P: C/ Y# U8 o+ e
# Do not change any part of them unless you have understood this script very well #
( [8 p. J$ t+ j# This is a kind remind. #
" K O4 z. N# D+ x$ m5 m: c7 Y#####################################################################################6 c5 L3 O! S; L, j7 a) O# U" P2 F
3 a) U2 u8 Z% ]* q' M# ?1 y
2 X( Z7 N' V [8 u#FUNC# Add a new line to the input stream.
7 p( |7 G4 d1 h5 M' j+ _) Sdefine add_newline' g9 t# @) U4 z0 |( G6 y
$1
+ D0 Q1 C6 O b5 @& I: Z S0 x: F3 p
1 x' C- K# U; i! t% I8 H& f
endef
1 }& e4 r0 T8 H6 |
9 x2 [/ c/ ~' y2 {# R- v9 I' o: x" T, F1 G) l$ F
#FUNC# set the variable `src-x' according to the input $1
8 @( C& _' r4 ]( Qdefine set_src_x
0 N+ H" L) {0 ^& {, y( o! |; Nsrc-$1 = $(filter-out $4,$(foreach d,$2,$(wildcard $d/*.$1)) $(filter %.$1,$3))- b# s. ]- [. w
- ]9 m1 x. V; Y1 d* H, b
9 \3 P7 a5 ?4 ^
endef
) u, i' d& d/ `& w9 t2 L% M: t6 @: l3 ~2 O0 X
6 D, w h: C3 |; k: [
#FUNC# set the variable `obj-x' according to the input $1) Z/ r6 A) J0 z+ e r) @' z, O
define set_obj_x3 s, d7 h, @ `( j3 _+ n
obj-$1 = $(patsubst %.$1,$3%.o,$(notdir $2))
! V" P) p9 U" O# ~# I
2 X! P% K [# U3 Q
, Z0 J. r8 A! e9 _: hendef
) h+ f1 h; P$ p1 A
! I, {, w+ X: I8 W% R: |8 R9 v
* A: w% z# m* ~' X4 @#VAR# Get the uniform representation of the object directory path name
% Y) N7 Q4 i3 q/ cifneq ($(OBJ_DIR),)
, Q8 X, p$ Q- m1 j" t2 F E h8 vprefix_objdir = $(shell echo $(OBJ_DIR)|sed 's:\(\./*\)*::')
+ V- q/ C3 T3 c4 P3 Z( Rprefix_objdir := $(filter-out /,$(prefix_objdir)/)
/ p% \( J1 m. c7 G3 K# Qendif4 Q3 B5 ?% ~# m4 a7 A4 K
/ [ D& {, A; } t" h6 ?# P' b& D1 g% a) n; t8 s8 g5 X
GCC := $(CROSS_COMPILE)gcc' ?* }( D7 L# x) m+ Z- A0 _
G++ := $(CROSS_COMPILE)g++* _+ [) I8 t0 V
SRC_DIR := $(sort . $(SRC_DIR))
/ w1 C8 H( I9 Ninc_dir = $(foreach d,$(sort $(INC_DIR) $(SRC_DIR)),-I$d)
$ |; G0 j" K/ ~$ t
* a0 w) ]; q" p" L5 l3 V' u7 G/ e% c3 e. _
#--# Do smart deduction automatically
. o% z, D) ]. q [$(eval $(foreach i,$(SUFFIX),$(call set_src_x,$i,$(SRC_DIR),$(EXTRA_SRC),$(EXCLUDE_FILES))))
, f) O `! Z% k; o/ [$(eval $(foreach i,$(SUFFIX),$(call set_obj_x,$i,$(src-$i),$(prefix_objdir))))
' `( G2 b' ~ S* N5 w7 \; |5 J$(eval $(foreach f,$(EXTRA_SRC),$(call add_newline,vpath $(notdir $f) $(dir $f))))
5 p" F3 G4 h2 G$(eval $(foreach d,$(SRC_DIR),$(foreach i,$(SUFFIX),$(call add_newline,vpath %.$i $d))))
# S& u4 Y& b2 g7 @2 t: e% C! N! l8 g: U" J+ T+ D% f/ b; L
5 V- f" }. U. H: H
all_objs = $(foreach i,$(SUFFIX),$(obj-$i))7 k0 H+ w4 @9 {3 b) F) B
all_srcs = $(foreach i,$(SUFFIX),$(src-$i))
% O) @4 X+ u; I0 m, [2 v
6 u6 P9 d* o" C) o$ ~4 l2 f+ ^+ V; J
% ~" _3 x* s* Z' G: wCFLAGS = $(EXTRA_CFLAGS) $(WARNINGS) $(OPTIMIZE) $(DEFS)
: @# V* Y3 g N, V$ |& l' T: f3 m$ \TARGET_TYPE := $(strip $(TARGET_TYPE))1 D1 q9 f' A2 g9 o5 J
1 L6 z7 W, L) i% J& B8 q- W# F7 \* d' K# R4 ^- b" D0 [
ifeq ($(filter $(TARGET_TYPE),so ar app),)' P7 j, s5 g: d$ @( h. V ^- w
$(error Unexpected TARGET_TYPE `$(TARGET_TYPE)')
2 z7 s. y: [' N2 t8 J4 a+ s$ |endif
( P) s+ n0 J% m3 j) J/ s( l! Y% }4 P+ Q) C0 G }
& O F/ h: t8 `, X
ifeq ($(TARGET_TYPE),so)
2 C/ `1 X' K y6 R# w+ Q- K2 o* E CFLAGS += -fpic -shared- @/ C/ o' f; ^1 N: h% ^3 H0 I* f
LDFLAGS += -shared$ S% f3 H2 d9 ^5 [. `% O
endif
( |* ]8 E7 J* T1 E: O1 I. I+ H
- _( ?6 ]# \ {/ IPHONY = all .mkdir clean" P4 j8 \+ T4 }0 P5 [- u
2 d) Q" v% m3 d( B/ q+ U
* a% e J' P9 J7 u5 s, v. a. Wall: .mkdir $(TARGET)
2 M$ M' E [9 t t* ?0 g
) R* j' Z; c, R/ D) ~" ]. `8 b# Q, M p, q/ ?, S
define cmd_o4 I- U a! \$ w5 G( u, x. |
$$(obj-$1): $2%.o: %.$1 $(MAKEFILE_LIST)1 G* `' C/ {2 a: p. B. s) W6 {
$(GCC) $(inc_dir) -Wp,-MT,$$@ -Wp,-MMD,$$@.d $(CFLAGS) -c -o $$@ $$<+ r" X P. ?* H) Q) ~1 {
6 a) Z# Y8 D% V: c/ W5 u# U
' X+ G7 b& r0 |4 [9 E) T9 qendef
1 K; d2 s. v* ~3 B: \8 P( }$(eval $(foreach i,$(SUFFIX),$(call cmd_o,$i,$(prefix_objdir)))) R6 g8 m/ i4 T) ]
6 g" S/ }, T6 w1 ^/ ^4 _
8 U* A5 A2 K0 ]5 _ X
ifeq ($(TARGET_TYPE),ar)
! O4 Q' e" W0 r% z$ a+ A$(TARGET): AR := $(CROSS_COMPILE)ar) `8 ^3 {# g, f
$(TARGET): $(all_objs)
h1 e+ d# y1 a( b. Irm -f $@- G" T0 Y" S8 D3 k& j8 H
$(AR) rcvs $@ $(all_objs): o1 n5 ~3 s" m- h. f! D
else
9 l! K1 D+ Y; X4 U$(TARGET): LD = $(if $(strip $(src-cpp) $(src-cc) $(src-cxx)),$(G++),$(GCC))
5 W! T& l9 h4 `- C2 G. B$(TARGET): $(all_objs)% x* r6 g u6 s2 r6 d
$(LD) $(LDFLAGS) $(all_objs) -o $@
6 _+ c' ]) }1 {5 i! Rendif
9 o' {: L) l, ^2 T) Q
0 ~# U0 \$ G i6 E
8 L4 ]' z( t1 N) I6 I1 ?) m- v.mkdir:; h- }! R. T# j8 p0 {
@if [ ! -d $(OBJ_DIR) ]; then mkdir -p $(OBJ_DIR); fi: N2 t9 `1 c8 x, T( n. S4 V: c, n! u
( O; _8 |6 r0 t) Y U/ s5 q0 O$ `
) B$ [1 z6 B% Y. F' ^: [9 n' G( Fclean:& a+ [6 n+ H. p
rm -f $(prefix_objdir)*.o $(TARGET)) D- E+ A$ _1 ^7 ]
: M# W, g: Y" }& ? U2 b. b+ J2 Z) A5 l
-include $(patsubst %.o,%.o.d,$(all_objs))- M" R) f+ Q( x$ b' r: `; D
: \- V- M4 O; U
* \6 r2 B5 Z9 P.PHONY: $(PHONY)+ B- J2 k7 q$ u- y8 Y4 W3 H8 g1 p( L6 p
2 l5 \& l$ R( p5 i6 u+ b8 q5 w
|
|