一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 4605|回复: 1

makefile 通用模板

[复制链接]
发表于 2017-5-4 09:13 | 显示全部楼层 |阅读模式
###############################################################################
. 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
 楼主| 发表于 2017-5-4 09:14 | 显示全部楼层
Makefile模板2
6 y1 K" k7 {# k3 T
+ c$ K7 ~# n0 f& }
7 C& p2 W3 ~. K
src  := $(shell ls *.c)
5 [4 }. @) h$ X$ wobjs := $(patsubst %.c,%.o,$(src))
, z* _" h  i" r+ C: Q" s8 U7 B/ _) B- [) O* G: k

; v3 ~4 z- a5 @; qtest: $(objs)
  |$ {  m7 P9 Z' [: w) G7 agcc -o $@ $^+ m0 b2 ^# M" R% @: M0 Y

+ g$ d" C, j; L8 p1 t. a
% h0 |$ a/ o+ Z2 _+ ]+ y5 ]( f%.o:%.c) y! u. Z7 u+ c$ m% F  r
gcc -c -o $@ $<& J$ z: f# `* S' r5 Q) ]7 \( A; A
3 X1 b- `# R+ l
! V' U$ m2 n- e! f5 c: v
clean:
- T& P- Q& d( K; xrm -f test *.o 3 P  V3 j5 @9 @/ I
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-8-20 09:12 , Processed in 0.033085 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表