一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 4220|回复: 1
收起左侧

makefile 通用模板

[复制链接]
发表于 2017-5-4 09:13 | 显示全部楼层 |阅读模式
###############################################################################
% V" k3 U5 Q  i#3 O: E* {* n+ e0 p' d
# A smart Makefile template for GNU/LINUX programming
! ^- h% y* o1 l#- [; Q9 p; A* s% j6 b
# Author: SR! @# u) d; x: S/ ~# P
# Date:   
* {5 I+ y' z, N/ `% V+ q1 g#& p1 q1 V2 Z% f1 x
# Usage:
1 T/ ?3 f; |9 v#   $ make           Compile and link (or archive)
4 G5 ~- N5 k7 V+ P* G9 Q#   $ make clean     Clean the objectives and target.) A; D5 f( x, Y5 T/ t9 M
###############################################################################2 u. U7 B) k' q8 @  k' }
3 B3 C- F# M& T# n3 C' j
) H$ Y0 ?, \; O9 A# ~6 A
CROSS_COMPILE =7 x2 R( \9 z' h* D+ h( x& V
OPTIMIZE := -O2- Y( L% Z  J, Z# e! F) t
WARNINGS := -Wall -Wno-unused -Wno-format% V% l% X# R. x& Y) ~1 l4 }
DEFS     := -DMYDEF=1 -UMYDEF2( W% E0 g: ]/ o  h% f$ Q$ A0 K7 D
EXTRA_CFLAGS := " r+ D  }7 s: i- |; a8 @

: ^  e9 S6 Y8 f/ I2 c( i0 }2 G, [1 j8 ~
  f( _0 k! f) ]1 k9 l, W, R5 \' \INC_DIR   = include
; s/ M2 c$ Q7 X, |2 n; KSRC_DIR   = src1 src2/a src2/b
2 ]" I$ K: m: L9 ?. e! }1 v1 l% W+ DOBJ_DIR   = out/target
1 }: ^% ^$ y+ q; W6 P' |' ]! u6 G, GEXTRA_SRC = src3/z3.c src4/z4.cpp
; l# p2 G1 U* q. t1 L; zEXCLUDE_FILES = src1/skipme1.c src2/a/skipme2.c; ]0 x* r) V: @3 L/ n: h

3 X1 E* |) J  V9 g+ Q' ]# r( R' n6 w* Y: h
SUFFIX       = c cpp cc cxx
7 u$ t; U9 z- C& J* R$ nTARGET       := out/go.exe/ _6 ~* A: o4 V; P$ [- d
#TARGET_TYPE          := ar/ l3 Z. K' H3 W1 P1 w* u6 j
TARGET_TYPE          := app2 F. J. B$ Y5 i, R- Z' V
#TARGET_TYPE          := so
  S3 m7 f1 Z) H1 V- ?/ G" P8 Y% ?
6 A& a/ Z7 \1 c' ^" H) b1 `
7 m; a+ S- n5 x# W4 s- y( E6 D* _/ H6 Y3 c0 T

! U) i0 Z+ |3 Z8 ]#####################################################################################
" Z* ^7 R4 }/ ~#  Do not change any part of them unless you have understood this script very well  #! v+ B6 ]- s2 _0 a) w' k& G
#  This is a kind remind.                                                           #
7 S8 ]# \3 m4 z  l4 g; A7 R) P# z#####################################################################################
( u$ h1 s# b# x
' V# Y5 Z$ r6 l" `7 B( i0 r( p1 ~* p( n2 d
#FUNC#  Add a new line to the input stream.' b4 R9 f) s' ?4 o  I# z) [2 O' F
define add_newline' u% V( v  `( ?- s& O
$1
: C# Z; E0 c! q: Y: S
6 W% l, p' I- h; V+ ]  b  B% \% P: q2 E3 r6 r# m
endef
5 G  |0 C0 d/ S" }: L
0 }# U# N" e7 ]+ p. f
0 D; f4 \! P8 d! W* |#FUNC# set the variable `src-x' according to the input $1* y+ [) N+ \6 N* v: Z
define set_src_x
* d6 T( f- t, [. h- L. Lsrc-$1 = $(filter-out $4,$(foreach d,$2,$(wildcard $d/*.$1)) $(filter %.$1,$3))
7 r" @- k' U: [( Y" ?
7 `+ U* }0 m8 U* f8 ~+ n. V1 t: l6 e; b  n8 r/ A2 |1 K- F/ {
endef% B! r+ _2 t% N% a
- ]! _5 Q2 Q: K1 E

6 E  C5 N4 M- E, X# g! Y# \#FUNC# set the variable `obj-x' according to the input $1' i' D; V7 j; o# U! y2 Q
define set_obj_x
& A1 R  o: [/ D9 \$ J6 ^! vobj-$1 = $(patsubst %.$1,$3%.o,$(notdir $2))
* N  {6 H, [' d7 c9 _; y; u7 V1 Z" o) F' P, R

# O" t+ e7 x* f; _! J% Xendef
  z, }0 W- p: {( p
+ ~3 m) ~9 F8 K5 n  g
% x7 Y! x. c3 c. j  A" T, N7 w, i#VAR# Get the uniform representation of the object directory path name/ H8 b. T8 S% W
ifneq ($(OBJ_DIR),)
6 }/ e, I5 o5 r8 i9 I' T" l4 U  Sprefix_objdir  = $(shell echo $(OBJ_DIR)|sed 's:\(\./*\)*::')0 U$ o2 M4 G" x+ ?; w# p" P
prefix_objdir := $(filter-out /,$(prefix_objdir)/)( C- U3 F1 v/ \4 f# T" d+ H
endif
% I7 }8 v1 b' Y2 t* m
9 m* i" J/ n( _# f' G
2 k8 e9 G# U/ \) T- ^+ e8 u/ pGCC      := $(CROSS_COMPILE)gcc' [% J( t! \7 R, d& N( p  g3 A3 ]
G++      := $(CROSS_COMPILE)g++
2 }( @6 S* b& m! I" \: kSRC_DIR := $(sort . $(SRC_DIR))
* m4 K, L/ l. y1 {1 r4 M) ?inc_dir = $(foreach d,$(sort $(INC_DIR) $(SRC_DIR)),-I$d)
+ l2 u1 X& y7 ~; C) m1 e: M# U, w8 H0 V+ r0 ?
* z: Q2 Y/ `! R) b
#--# Do smart deduction automatically. y& x7 }8 x% Q0 |9 i7 r4 [# T
$(eval $(foreach i,$(SUFFIX),$(call set_src_x,$i,$(SRC_DIR),$(EXTRA_SRC),$(EXCLUDE_FILES))))
" l$ d( Z' a9 k+ F5 P% r0 R$(eval $(foreach i,$(SUFFIX),$(call set_obj_x,$i,$(src-$i),$(prefix_objdir))))0 f  R- \& w1 G' \
$(eval $(foreach f,$(EXTRA_SRC),$(call add_newline,vpath $(notdir $f) $(dir $f))))6 X" o  u, U, \6 y. ?/ M
$(eval $(foreach d,$(SRC_DIR),$(foreach i,$(SUFFIX),$(call add_newline,vpath %.$i $d))))
8 }1 Y1 g4 Z2 D1 J+ F7 u/ ^9 \8 b
, d( G( |& j% l5 l0 L2 |
all_objs = $(foreach i,$(SUFFIX),$(obj-$i))
& @7 P) u" n' P0 pall_srcs = $(foreach i,$(SUFFIX),$(src-$i))
8 D9 A( h5 I" ~* B* B* D2 D
; Z* L, G: w! e; }: G2 P8 o
1 A% V) L5 _, D9 J) t/ U3 }$ \0 DCFLAGS       = $(EXTRA_CFLAGS) $(WARNINGS) $(OPTIMIZE) $(DEFS)" T5 u. Z5 o9 t  }; P/ ?
TARGET_TYPE := $(strip $(TARGET_TYPE)); _  z+ R3 m2 j$ i
! `  I  I8 O$ k6 s- y, @; W

5 x' t% j! B  D) H7 xifeq ($(filter $(TARGET_TYPE),so ar app),)2 g: g. C* H" y0 s% Y2 ]
$(error Unexpected TARGET_TYPE `$(TARGET_TYPE)')9 L8 t6 w6 `; [6 g6 l7 x
endif
6 _! D9 @/ [/ r4 Y8 X8 G
9 x( ^9 ^/ p# u1 s" }. l/ k0 ^2 @; b, N( q7 _# z) ^
ifeq ($(TARGET_TYPE),so)
( ~' P- z$ k! E6 F CFLAGS  += -fpic -shared
/ c, e! U" X) ?5 Q0 I LDFLAGS += -shared; t6 B/ S1 E: k- y9 G  d7 Y
endif
8 q4 ?! S! O, P
2 {& H3 ]4 V1 ]/ o
' A# }' }- J; c, `8 {! @PHONY = all .mkdir clean
% v4 v9 h- |! w& O6 }5 o8 E' X& g& \: ]8 D
1 V2 Y2 ?& ^7 h' O* [+ `- J
all: .mkdir $(TARGET)* v5 k+ ^# w  P2 S5 |: z
+ s, K9 b) B: N4 `$ O, N+ r) f. e
0 z9 P7 `& B' @
define cmd_o, V4 d1 w! l. e+ V9 L8 a
$$(obj-$1): $2%.o: %.$1  $(MAKEFILE_LIST)/ g2 e2 F+ h8 x6 o4 V0 M
$(GCC) $(inc_dir) -Wp,-MT,$$@ -Wp,-MMD,$$@.d $(CFLAGS) -c -o $$@ $$<4 r) `! p7 w' E  K) O  L- P. c

9 f# L3 |& {" q" O2 ~/ ~- v+ n1 |" H- x. a
endef/ A$ T. `9 l( T' U9 E  @0 t
$(eval $(foreach i,$(SUFFIX),$(call cmd_o,$i,$(prefix_objdir)))), S- X; X" ~5 ^6 f& v

. D2 W3 S9 ?7 ^% r, S3 f) c3 y- A2 B; n! R+ [
ifeq ($(TARGET_TYPE),ar)
% Y9 x4 v8 Z2 f) `# i1 e) b# d' T$(TARGET): AR := $(CROSS_COMPILE)ar8 _! d  ~5 k' l8 v8 A
$(TARGET): $(all_objs)
+ F$ Q) ~8 X/ y7 _. Srm -f $@2 e$ J. M9 P0 X
$(AR) rcvs $@ $(all_objs)
/ r* \& I- ]# p) P. Velse; B. d9 y3 A" }, f+ \
$(TARGET): LD = $(if $(strip $(src-cpp) $(src-cc) $(src-cxx)),$(G++),$(GCC))
: r6 P6 b: M1 y( ~4 O  ~( _$(TARGET): $(all_objs)/ u- X0 @3 E) n' m1 C- o$ \* h
$(LD) $(LDFLAGS) $(all_objs) -o $@
" j7 n) t- Z8 l% b  t. U. e8 tendif2 F; Z/ R! F& H4 `+ e/ F

8 F3 b* N$ E" [
3 U3 ^& l6 k' X% G% p4 v.mkdir:
# f3 N4 {5 ]" ?6 O% S# a@if [ ! -d $(OBJ_DIR) ]; then mkdir -p $(OBJ_DIR); fi
/ X. z3 Q$ F* e  S; d) n( M" y* H1 O8 T0 W& x+ @7 J
- G) ]6 {) a& }1 i  w0 R5 m. v
clean:
( x  W4 ^) H% q4 ~; j! Drm -f $(prefix_objdir)*.o $(TARGET)' Z* H. ^4 R+ L4 A) n5 |" o
: Y, I, l1 g) I4 p" v9 E+ I! E

8 J( z+ u4 e7 v-include $(patsubst %.o,%.o.d,$(all_objs))
  L8 D3 v) A- z7 y$ }. n! u' C; N: k! Y/ i
- Y4 N  z* @* m' n! ~5 y' |
.PHONY: $(PHONY)) z) q0 t2 R5 ^# A4 a6 v
. b. J0 Z$ l* y) P% |. u0 A
 楼主| 发表于 2017-5-4 09:14 | 显示全部楼层
Makefile模板2 1 k7 j3 |! N1 b3 ]" J, J6 u. ]" J3 T
: w; n- Y) t) \; K9 v) ]4 t3 A
, q- k6 @' Y8 e; T
src  := $(shell ls *.c)  `; a- i0 O, m/ l" B3 h
objs := $(patsubst %.c,%.o,$(src))
+ L! @- I$ ?( H( t
& g% m7 s7 g  J& i* D6 K% a
2 y& Y+ C2 v4 _: q( H( B. ]test: $(objs)
# `$ d6 s' d' k0 j3 j) a, pgcc -o $@ $^
, R. f' `5 [4 e, I7 t8 O0 H4 U, c1 W# N
2 l$ Y7 E) X0 Q- @' e- ^: M: b
%.o:%.c
; W/ D1 ]7 Y4 K* I. |5 s5 dgcc -c -o $@ $<1 Z" h9 p. q- ^% u+ q2 [4 s
& y, P0 g" g, n) _' E! E% c
+ H7 l: a7 X9 l; J) I
clean:
6 z- s0 P/ G6 d/ B7 Mrm -f test *.o
. Q; A6 }* q1 z) |

本版积分规则

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

GMT+8, 2025-4-28 04:13 , Processed in 0.058000 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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