一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 4969|回复: 1

makefile 通用模板

[复制链接]
发表于 2017-5-4 09:13 | 显示全部楼层 |阅读模式
###############################################################################  _4 d/ B) j9 h$ [
#
7 X$ P3 h2 p4 \$ ]3 x! |' m- r# A smart Makefile template for GNU/LINUX programming6 g% q/ L: T& j+ \
#3 O, n% R- k/ E$ ?4 L; L2 I
# Author: SR
( f9 d; E2 ?' |# p. ?# Date:   ( Z# w8 E7 {1 v1 m; I% b1 Z& I
#
. d6 _6 ?* v! }4 n" I# Usage:
8 R1 y/ f7 r) E9 `#   $ make           Compile and link (or archive)9 ]0 v) I8 h2 Y, c
#   $ make clean     Clean the objectives and target.- W7 O5 ~% h! I  }6 D
###############################################################################' V  L, L7 e9 `. V( ?
/ ~6 r, p, ]/ Y6 D0 U) e

0 ~# i" u# C& K+ N2 ^CROSS_COMPILE =
! N9 c0 _/ U. B: l/ r+ zOPTIMIZE := -O25 t0 g$ {& G4 n% S* U2 `
WARNINGS := -Wall -Wno-unused -Wno-format* \9 O& E& U. O$ W. b8 U
DEFS     := -DMYDEF=1 -UMYDEF2
. g5 I+ _$ f1 ]1 L5 qEXTRA_CFLAGS :=
0 ?) C; e1 w, ?
6 H& p) X6 d: d  w5 S
: n) Q; t% i/ i" F" ?INC_DIR   = include
- k' H( B! y  ^) y& p( vSRC_DIR   = src1 src2/a src2/b
5 ]9 m$ L+ C+ I# gOBJ_DIR   = out/target
3 u8 a$ ~" J6 T! X$ v, D/ N) hEXTRA_SRC = src3/z3.c src4/z4.cpp
! \4 Z; m& f) P0 R5 Z4 ^, EEXCLUDE_FILES = src1/skipme1.c src2/a/skipme2.c6 u( Z$ \, z2 ?
7 m  H. o$ k1 |4 d! g

% ]3 e7 j3 E( kSUFFIX       = c cpp cc cxx& c9 z% B# `4 K
TARGET       := out/go.exe, H8 S# |! D5 A# q0 u. w6 O
#TARGET_TYPE          := ar
$ |+ W; g; }8 x) `1 a! c) eTARGET_TYPE          := app6 W$ A, x7 s: u# o2 G% K% `+ X
#TARGET_TYPE          := so4 H( D8 L5 @( N

1 p/ G: P9 Y# E" ?# X
2 i2 @9 T& M# m& Q0 x% m! q2 `5 o( ]- b- h  |
5 x# {8 V6 H" z3 U0 v- U
#####################################################################################+ s+ _  M2 t8 w$ O4 j1 X! X, g
#  Do not change any part of them unless you have understood this script very well  #
( ^( [( p9 M' F% H8 _& _#  This is a kind remind.                                                           #$ q4 q' b' L* A' o
#####################################################################################! C8 H7 A; N* R

( V4 M: A& g( x* x) _! v
/ E' H  w& G6 W2 W0 L7 W#FUNC#  Add a new line to the input stream.% n/ ]+ s9 |$ ^# x6 B
define add_newline
, }$ `$ Y% z/ b" |/ f$1  A9 h. e# X" h7 m- K2 A
% z9 o! b; m" C6 ?: o, x, G/ K  [* D/ g
4 K" z# Z# U4 c4 J4 m
endef
4 v8 z1 p  U4 W/ i% T4 E% V2 E2 D5 L& v+ X% Y% S% H

4 W  B( [$ p" a( y4 A#FUNC# set the variable `src-x' according to the input $14 J5 k$ X8 R7 t. g& E4 _
define set_src_x0 l- _/ J0 z1 b; S2 I1 W8 S
src-$1 = $(filter-out $4,$(foreach d,$2,$(wildcard $d/*.$1)) $(filter %.$1,$3))
' W! r0 P. C7 @% W  L! \" o8 C
1 t* N  Y$ ?" j0 O6 y% x9 s3 |8 [5 J3 Y' |
endef
4 q* ]/ t+ f, [9 S* @3 G
% ^, D9 g: f2 I% D* ?$ y9 _& N6 v# c1 P
#FUNC# set the variable `obj-x' according to the input $1
$ @5 ^( S! G6 I- ^  i% Ndefine set_obj_x& Z. C  S+ x7 f  F/ I/ Z
obj-$1 = $(patsubst %.$1,$3%.o,$(notdir $2))3 Y# a7 Z, @6 C7 O1 x

( X  J) c) v5 m8 a- P$ p4 `
' F3 _# c2 D1 E) o2 x8 Y4 ?endef5 \5 x% A. O: X1 x+ e* ^8 K( E1 p
$ k$ d3 f, w2 I% l0 H

* x5 v, e. y! Z! h: E1 e#VAR# Get the uniform representation of the object directory path name$ X1 a3 O% I1 e
ifneq ($(OBJ_DIR),), M$ Y+ G+ w# o* I
prefix_objdir  = $(shell echo $(OBJ_DIR)|sed 's:\(\./*\)*::')
$ @7 e8 K* U* uprefix_objdir := $(filter-out /,$(prefix_objdir)/)' ~- C5 h( s/ r" R7 g
endif
) d& l" B; a2 t" {) J0 U0 `& Y2 h. D* E# t+ n0 a8 y" _; [

- w* y' ]  H1 t4 F3 J6 B+ cGCC      := $(CROSS_COMPILE)gcc& u+ o* H3 [- l0 p6 m5 V' w8 }8 N
G++      := $(CROSS_COMPILE)g+++ b3 E. S3 T/ b
SRC_DIR := $(sort . $(SRC_DIR))6 ?8 m8 X! P2 ?  D/ P
inc_dir = $(foreach d,$(sort $(INC_DIR) $(SRC_DIR)),-I$d)
2 ^" M8 K7 a) s6 x: ~1 r; b4 K# ~# r  |2 E! s2 J- k/ O

, n6 L/ R9 [6 v7 f1 f! K#--# Do smart deduction automatically* }- V- H* N% e! h. A& r+ ]4 c
$(eval $(foreach i,$(SUFFIX),$(call set_src_x,$i,$(SRC_DIR),$(EXTRA_SRC),$(EXCLUDE_FILES))))$ G/ _" H- `; z8 q5 _9 A
$(eval $(foreach i,$(SUFFIX),$(call set_obj_x,$i,$(src-$i),$(prefix_objdir))))$ ^0 ~- k: ^* `. r
$(eval $(foreach f,$(EXTRA_SRC),$(call add_newline,vpath $(notdir $f) $(dir $f))))
; V3 b; q0 E' E* b. K& e6 c+ u' M$(eval $(foreach d,$(SRC_DIR),$(foreach i,$(SUFFIX),$(call add_newline,vpath %.$i $d))))
% ^  {, e7 b' Y- R* }' F2 |0 y3 v8 ^* Q  O+ Z, A
" [$ H+ j1 d: \1 @5 b% c
all_objs = $(foreach i,$(SUFFIX),$(obj-$i)). N6 F) m% ]0 t# w8 j
all_srcs = $(foreach i,$(SUFFIX),$(src-$i)), k0 V% g! I8 J; V4 J  g
9 }  Z6 o' ~9 }. A; v
% I0 u# J8 B$ y; R7 f
CFLAGS       = $(EXTRA_CFLAGS) $(WARNINGS) $(OPTIMIZE) $(DEFS)
/ N, `" ^% r/ _+ h- H; H3 t9 i1 \TARGET_TYPE := $(strip $(TARGET_TYPE))
# p6 D+ L7 r2 G6 b9 _
; I( P  F- T9 l: V5 Y5 M" T9 _% B/ w9 b
ifeq ($(filter $(TARGET_TYPE),so ar app),)
. i# o1 @4 l) U( [6 ~1 a$(error Unexpected TARGET_TYPE `$(TARGET_TYPE)')
+ `. w% S5 l9 o$ ^9 ~5 Nendif
& j/ C7 n$ ?/ `0 ?/ I7 P1 N
* H* ]+ p( v& e
; A% l9 Z, G, D7 D/ a5 v: B" q) cifeq ($(TARGET_TYPE),so)$ }  \. |! h2 J' r
CFLAGS  += -fpic -shared. ?# I/ {* K/ m- q5 N
LDFLAGS += -shared! N! r6 ], ]( @2 x2 ?1 M
endif; V6 [* H: p4 s3 l) ?
& g! e( m' u! h9 X

# A2 y, Z: ^  m  tPHONY = all .mkdir clean
5 i9 ^, U# c) m7 C7 V2 `- T( M7 D0 t; e5 A( ?, R

* R5 \, v! i6 H7 V: D! _all: .mkdir $(TARGET)7 I$ k6 {, W2 a2 J, [" |. J" K

. J; ^3 d" L; l* ?; m0 ]$ p* a
5 d6 m. w( x. Pdefine cmd_o
" @* E; x! }/ G1 q; L+ C$$(obj-$1): $2%.o: %.$1  $(MAKEFILE_LIST)% |9 v3 d) |! l  [6 ?( n. @% [: R
$(GCC) $(inc_dir) -Wp,-MT,$$@ -Wp,-MMD,$$@.d $(CFLAGS) -c -o $$@ $$<
" M  c. _, N6 |+ }7 |
3 Q( Q" Z5 C& P+ j3 o0 W0 b! L" @3 C$ V) I- \
endef
  [5 z. b' Q* U# J* ]$(eval $(foreach i,$(SUFFIX),$(call cmd_o,$i,$(prefix_objdir))))
  O9 o4 W- g, u2 G% r' T4 f: v: S7 w3 e$ \! E+ E% a

+ c7 p8 o: c/ [. }$ Eifeq ($(TARGET_TYPE),ar)
. k# j2 k; H6 M, [/ J8 H4 _$(TARGET): AR := $(CROSS_COMPILE)ar
) i' v% s9 Q6 A' n0 d; I* H) ~$(TARGET): $(all_objs)
% E! X  j8 q0 t5 @- B+ a1 l2 prm -f $@# l3 o7 s) u) G' O, |
$(AR) rcvs $@ $(all_objs)
: k. {  z% T& T$ `! q& v$ m+ \+ celse  h( d6 z$ ]0 A8 u# |# @
$(TARGET): LD = $(if $(strip $(src-cpp) $(src-cc) $(src-cxx)),$(G++),$(GCC))) c  N4 W3 G6 i
$(TARGET): $(all_objs)2 J8 T, C: q2 X! D
$(LD) $(LDFLAGS) $(all_objs) -o $@
) }6 c# R' L' n& A" C: D1 Kendif0 ^3 \3 I& {  u+ }
$ e6 j, F) h$ w. K( D

" e% M" r' e8 u2 q' m5 V7 r.mkdir:. d7 I2 z* p7 L, J; B$ j- x
@if [ ! -d $(OBJ_DIR) ]; then mkdir -p $(OBJ_DIR); fi# ?+ M, F+ p7 q; k9 g; v, y
# C! c* o' f& _% I1 r' _/ m
4 F- k# d$ D9 X# F
clean:  a3 r; v) _5 Q$ _
rm -f $(prefix_objdir)*.o $(TARGET)
- ~3 i; Z$ R/ O/ s
& M7 q& P  o) t- ?/ D2 k
) ?3 V6 Z. B& Z4 z* \. u0 R7 e-include $(patsubst %.o,%.o.d,$(all_objs))/ f1 y' L/ |8 E& B
" o& R/ g* h, t% ~0 I* J

+ L3 Q$ V7 Z1 ]: R8 e.PHONY: $(PHONY)
6 S* v7 ~, n7 H4 e0 J
+ q$ y3 y. q+ G# q
 楼主| 发表于 2017-5-4 09:14 | 显示全部楼层
Makefile模板2
# x* q7 w% J. p0 r
) O5 d; Q* }! \9 `, H- F+ x

8 M9 E3 |+ N8 E8 \6 c" hsrc  := $(shell ls *.c)* Z/ \/ q9 L+ n; P
objs := $(patsubst %.c,%.o,$(src))( d# {/ x+ w7 f  g
" j" M' u- y# q' k

0 `9 \/ D3 S9 @9 f- d  |test: $(objs)
! L2 ]$ Q. A$ Fgcc -o $@ $^# x: h9 A, t. D. D/ h; @5 A) W! _+ k5 L

. ^8 Q, c. ^8 g; t: @* Q
- Y/ M3 ]+ b6 @* G. Y/ ~%.o:%.c8 U- q8 d, h" s; X1 @1 ]5 f
gcc -c -o $@ $<5 ?  O! M7 c9 Q& M' O! ^$ P
: C6 E, F: \7 N

1 h# c/ G- [" z" B: Lclean:; G( U( |4 ?- ]' i# I
rm -f test *.o
- S: U. K% o9 _+ x
回复

使用道具 举报

本版积分规则

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

GMT+8, 2026-1-12 01:00 , Processed in 0.032617 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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