一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 4604|回复: 1

makefile 通用模板

[复制链接]
发表于 2017-5-4 09:13 | 显示全部楼层 |阅读模式
###############################################################################  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
 楼主| 发表于 2017-5-4 09:14 | 显示全部楼层
Makefile模板2 " [* y. @* e) o& J) B0 D; y
8 ?. l+ x5 x! j+ X, S2 t& L  u

2 [# D2 a% l* }9 Q; z! V7 ]  {src  := $(shell ls *.c)
9 U0 e" z5 m" N5 P, ~, Tobjs := $(patsubst %.c,%.o,$(src))* J: i0 _/ T: R5 P
  H# Y. l+ t* Z

. {6 Q% P9 L3 v7 {test: $(objs): X# g  V; [9 D' X0 s% q
gcc -o $@ $^5 ]9 \' O! r7 k% G+ O  y
: F& Z) W5 i, v/ K$ w) c
9 ~' E3 L) Y. o) y8 ^* h5 H' k
%.o:%.c
4 C4 r, j5 `7 a; a3 v- L# {' C( C* dgcc -c -o $@ $<
: W0 s5 j. h8 d) S. Y7 H
  f1 P' V5 U4 N: V6 M+ o2 `4 N+ M! f2 A7 v0 X3 B
clean:7 [8 V5 z% k9 U3 }& k! o/ D; f
rm -f test *.o
3 ~& Z3 j$ R3 A9 y1 h$ O4 b
回复

使用道具 举报

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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