版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
###############################################################################2 f1 {) z% y8 d g5 M( c$ a
#
8 V1 q! `6 H) }, A# A smart Makefile template for GNU/LINUX programming( t6 E( x9 b/ Q5 \# `! f
#
' [2 y9 \3 f9 ~4 M" L* [# Author: SR* O8 J3 e3 F \$ u
# Date:
( f# S8 k4 {& L+ p- M6 c0 d#$ h$ U! t; \, r: }
# Usage:3 ]$ t" S6 l; [0 Q
# $ make Compile and link (or archive)
" h {. g. ~2 @. \# $ make clean Clean the objectives and target.
+ e# V# B! D9 p. w$ L7 E( p1 l6 W###############################################################################
; |5 q! Y- J( L2 X6 k- t- ]$ U# f7 Z z
) [3 C2 M1 Z' a" W: B" DCROSS_COMPILE =# a7 T% J: Z8 u( n
OPTIMIZE := -O2
/ w8 {. j z8 z1 G" G# L1 UWARNINGS := -Wall -Wno-unused -Wno-format* l. q4 J$ l) w. O9 |/ Q$ b+ Q
DEFS := -DMYDEF=1 -UMYDEF2# m6 ~! L0 Q5 d( o! I4 Y! v
EXTRA_CFLAGS := / j) M0 m# f5 J! e2 J( d V) I
% ^+ ?/ Y: H8 Q% l6 @
6 \$ U1 P3 h6 q1 K" D6 N9 f/ O8 v
INC_DIR = include9 x4 @& ?# X9 r8 _8 D9 V% B6 [
SRC_DIR = src1 src2/a src2/b
& I3 ~6 S. R; k R, jOBJ_DIR = out/target7 M5 q" K* t c
EXTRA_SRC = src3/z3.c src4/z4.cpp
! ?; h4 E6 Q) Y4 kEXCLUDE_FILES = src1/skipme1.c src2/a/skipme2.c
3 s6 _. @1 W6 u9 }+ [, `3 p- R( E, B
4 y: S2 a1 t, v( l2 rSUFFIX = c cpp cc cxx0 V- y. @, n& H- [3 E6 Y
TARGET := out/go.exe) H# {% t; N/ d9 u3 R* {( X5 A
#TARGET_TYPE := ar
& s9 l. L5 h/ iTARGET_TYPE := app- l6 L0 `+ G- {% v* J( Y9 m' J2 h
#TARGET_TYPE := so
- T) X8 E& X4 v
. ?2 L! \2 q; f! t( g4 b# s# [
9 [! L$ {. d7 S% r5 c+ Y* J5 t3 Q7 a0 t
; x% `& i0 c: }+ g$ J8 D1 s#####################################################################################* `* u* L6 Y# g5 W+ n0 Y
# Do not change any part of them unless you have understood this script very well #
) j: V2 R5 F8 n7 p& f. P# This is a kind remind. #
4 b0 T$ F/ O1 b. [) _#####################################################################################
6 E% o( p: ?, k: z' j0 T: }
$ Z7 \- a4 {$ j. |
" a; q( W2 l; }; A9 @#FUNC# Add a new line to the input stream.7 q/ g& _8 U- @* P" y# V1 s( W
define add_newline- X; ]; J2 f' B; j. q# N
$1- |! x9 ~# n7 B) I, r0 V8 E
8 f+ Y3 E9 a* p+ {! F- Y4 g
' x' ]' `; T0 f) |% j" [/ j& tendef; b T/ `1 x9 W' O8 l) _1 S3 N7 S
+ }* m/ Y$ O8 q$ l' A3 _9 I A! c# ]% `" v$ j
#FUNC# set the variable `src-x' according to the input $10 T8 H. g/ d; U
define set_src_x
# e' T# @9 D& ]src-$1 = $(filter-out $4,$(foreach d,$2,$(wildcard $d/*.$1)) $(filter %.$1,$3)). J1 {' J5 l+ \4 H
P2 d( r; t( i
3 R% q# b& E1 F) W
endef4 Q1 }0 n: Q1 N) R0 U1 I6 G
$ |. r8 l. i+ X
4 |# T V9 h! c; A3 J9 N$ P( a- x
#FUNC# set the variable `obj-x' according to the input $18 S0 L. x1 L- j X3 k4 K# A F
define set_obj_x
) o' d: J# N1 D" ^( j- l( |obj-$1 = $(patsubst %.$1,$3%.o,$(notdir $2))* N- A9 H$ q. u: @
2 f9 X/ z$ C4 V9 K+ z
! d4 d$ C7 F ]# r1 u% r6 r; cendef1 \: S4 _ D6 `; c- `
# r z+ }( T& W; a$ c3 Z Q. H+ a, Z: N/ K* N8 q# Q5 d" g
#VAR# Get the uniform representation of the object directory path name
2 Z7 A3 P5 ?2 }# vifneq ($(OBJ_DIR),)
) j: y/ m' U% f' mprefix_objdir = $(shell echo $(OBJ_DIR)|sed 's:\(\./*\)*::')& w4 P5 K( t2 C9 h
prefix_objdir := $(filter-out /,$(prefix_objdir)/): y- G! X. D7 s/ ^- {2 q( D7 r& r
endif
" U" q5 V: |9 l- W; f( a3 a* j# J! T8 m. @1 a4 Y6 L
6 C6 l5 y9 R2 r8 w1 o
GCC := $(CROSS_COMPILE)gcc
' r! c k- y% jG++ := $(CROSS_COMPILE)g++5 N2 t6 z3 F8 G
SRC_DIR := $(sort . $(SRC_DIR))
1 C/ x7 H6 J2 p& e3 Q8 E, I+ Kinc_dir = $(foreach d,$(sort $(INC_DIR) $(SRC_DIR)),-I$d)! _4 Q f$ J! Q: h7 h# h
3 {' V: q! P) [2 t9 `6 o B
) S" u$ p8 J0 a! R% M& c9 y
#--# Do smart deduction automatically5 Q+ v; t! S& n6 K
$(eval $(foreach i,$(SUFFIX),$(call set_src_x,$i,$(SRC_DIR),$(EXTRA_SRC),$(EXCLUDE_FILES))))6 B; J+ K+ `) c1 D2 k
$(eval $(foreach i,$(SUFFIX),$(call set_obj_x,$i,$(src-$i),$(prefix_objdir))))
3 ?3 x! r8 @2 Q1 D$(eval $(foreach f,$(EXTRA_SRC),$(call add_newline,vpath $(notdir $f) $(dir $f))))
9 ?# z2 f0 c& Q; p. Q y, h$(eval $(foreach d,$(SRC_DIR),$(foreach i,$(SUFFIX),$(call add_newline,vpath %.$i $d))))
+ n0 ?3 A$ |% I' N3 ^
) |0 x- s6 M% j7 ]
+ q! [, z! U; Hall_objs = $(foreach i,$(SUFFIX),$(obj-$i))( x/ y) E, Q$ c. S2 t
all_srcs = $(foreach i,$(SUFFIX),$(src-$i))+ E* A# j. T* P/ z$ j
' N2 N1 D+ H7 r Y! h, [& [' r; }0 F. U- ]9 y2 b
CFLAGS = $(EXTRA_CFLAGS) $(WARNINGS) $(OPTIMIZE) $(DEFS)2 n' T/ G# V' Y
TARGET_TYPE := $(strip $(TARGET_TYPE))
" Y$ p. V3 x: }4 |$ x: V7 f1 g( d5 @0 v2 }+ L" s5 s
6 S# y% H/ f% M1 L/ \5 n5 pifeq ($(filter $(TARGET_TYPE),so ar app),)' r& |- N* X! l ?+ h2 Z; q
$(error Unexpected TARGET_TYPE `$(TARGET_TYPE)')% W, k" v4 l; a
endif0 X9 D+ K5 S% h
2 k1 C" P5 ?) x0 h
3 Z* s8 H' D0 n5 @
ifeq ($(TARGET_TYPE),so)
, x- t; X6 N- U+ y( [6 E CFLAGS += -fpic -shared
! |$ {" z6 M1 D- C f6 i' L4 ~% u LDFLAGS += -shared0 a" b% ^/ a; A, v8 C: B
endif
# a* `4 J( c# j; ]5 g1 {* W1 g7 T5 l: i
+ d& `2 E( y: d2 L
PHONY = all .mkdir clean
$ \0 C$ E. t% A
' f8 m) m, z; {- W' I, W
2 }( i: v" @8 S( ~; V# Q6 Eall: .mkdir $(TARGET)2 v) _& R5 I: c. i
3 y( v* J4 P$ B: g/ }
q1 H$ [& t* [& f2 c. ~define cmd_o+ H8 y2 T8 ^/ k$ }. E G
$$(obj-$1): $2%.o: %.$1 $(MAKEFILE_LIST)" w( s# |3 h3 ^- L6 I! l2 I+ X
$(GCC) $(inc_dir) -Wp,-MT,$$@ -Wp,-MMD,$$@.d $(CFLAGS) -c -o $$@ $$<8 q. |8 k \! ]
! l, v8 ~/ O. Q( [
& T! v8 `3 Q0 L7 }endef: H) t. P$ V) p0 z
$(eval $(foreach i,$(SUFFIX),$(call cmd_o,$i,$(prefix_objdir))))9 D8 }% a6 O2 E
1 E7 q7 S0 E$ b$ `
; f- A0 z' \* X0 p2 P& aifeq ($(TARGET_TYPE),ar)
) Y2 k- w; J0 T9 e9 }% v0 J0 `+ [" H$(TARGET): AR := $(CROSS_COMPILE)ar
$ a7 k* }% U) g' P' C0 e$(TARGET): $(all_objs)
4 _; e+ _; W- w. frm -f $@
0 C* j5 L' B) N0 Z$(AR) rcvs $@ $(all_objs)
. o" a4 k$ c; G, O$ t3 }) Y% Delse
; ?8 ]: ~2 T* e. f$(TARGET): LD = $(if $(strip $(src-cpp) $(src-cc) $(src-cxx)),$(G++),$(GCC))/ G& o% ?: ?/ M
$(TARGET): $(all_objs)
0 i3 _0 }; n6 s% q- S0 e* W$(LD) $(LDFLAGS) $(all_objs) -o $@
5 R% k: R! t) Q* J5 `endif
0 W+ `3 o& G' f& p4 N5 m" ?
5 C( V( c2 I9 J Y3 B+ {7 o# ^
$ [' `* ^: F' I+ P' P) t! q3 C! w.mkdir:$ ]+ ]) D- d9 a4 g
@if [ ! -d $(OBJ_DIR) ]; then mkdir -p $(OBJ_DIR); fi" k h* U H9 M* p4 E
' \: W2 J5 G, {& b" J
5 `/ J! @+ a6 Y0 Z1 bclean:
6 B4 a. V3 z% U) X8 C0 zrm -f $(prefix_objdir)*.o $(TARGET)
2 _, ~2 x0 _" ~# ~/ L$ k3 n2 h( \6 U
D4 x* a* ^8 O! H U! @-include $(patsubst %.o,%.o.d,$(all_objs))
# v" j7 R" _; F o' K7 K! K4 q- X0 x0 z ^2 x1 f2 c! V
) Q/ o/ i1 u) W
.PHONY: $(PHONY) M1 V F: g1 c$ B
$ W# c+ A2 a+ Z/ T- m8 \$ A |
|