一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

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

makefile 通用模板

[复制链接]
发表于 2017-5-4 09:13 | 显示全部楼层 |阅读模式
###############################################################################2 l7 Q9 a: l) g
#
0 J0 ]: w2 R6 w! y# A smart Makefile template for GNU/LINUX programming# p% B1 {/ L) F
#
* f4 x, j/ S$ I& ~# Author: SR- J3 r1 i# I: K5 Y
# Date:   7 o5 G' v  ^% {
#
, A$ b8 j- e4 l# Usage:
% o3 v: @- e% |3 L0 l' f' e#   $ make           Compile and link (or archive)
% u! T: i; ]/ u; B8 r' {#   $ make clean     Clean the objectives and target.
/ _7 I3 ?4 x( W6 ]+ r###############################################################################8 k/ ]3 g; |' Q9 j

" X1 C! s! Y) Z' n  ^) ?2 S/ s7 {2 E; m
CROSS_COMPILE =
8 \! _. b! a# F2 e" GOPTIMIZE := -O2
! [. [4 W0 u1 q2 h- YWARNINGS := -Wall -Wno-unused -Wno-format
  N. X1 j: m  B. WDEFS     := -DMYDEF=1 -UMYDEF2
+ v2 c% ^0 Z  _: p' J. x& xEXTRA_CFLAGS := 9 n- P3 R  `5 S; k% r1 O  |

4 J, \( k# v8 k/ D! N/ X$ m7 b
( f5 X) l% C2 s% D2 D! Z7 dINC_DIR   = include, O4 t- W# h- Z6 g, P
SRC_DIR   = src1 src2/a src2/b
9 H8 v4 o6 s" X' X) b+ W/ [; WOBJ_DIR   = out/target
5 ~: E0 I" E% o: G) pEXTRA_SRC = src3/z3.c src4/z4.cpp
+ a& Q& B: S6 f; f' fEXCLUDE_FILES = src1/skipme1.c src2/a/skipme2.c: m$ B6 T( [3 }) C

% w* R/ `% T2 w: H2 e
1 y3 ]* x5 O! }+ GSUFFIX       = c cpp cc cxx& A! G0 X$ J( k/ s' W
TARGET       := out/go.exe
# R- W- {7 G1 E1 K6 M  B#TARGET_TYPE          := ar8 t$ v9 M' e# I5 }% A
TARGET_TYPE          := app* \8 E  \( Z( g; G6 Z1 g+ Y
#TARGET_TYPE          := so  [, T* z' J, i2 R$ k& f
( j* W8 \( }* t% t; r8 s
% ~- e  n( X2 c9 @0 m) S: p
: p8 W4 ]- @; i  J- }7 I

0 d1 ?2 r2 Y3 z: {#####################################################################################
6 @/ T1 x* M# F9 q' L#  Do not change any part of them unless you have understood this script very well  #& Z, G# ~# {% j% p5 K4 I' R
#  This is a kind remind.                                                           #, i( {- z6 N9 {0 g) m  l% V" [
#####################################################################################4 Y" N, {0 C! ~6 u1 k. Z
5 O" Y1 T4 [* K0 w9 F

  n: A: o1 d4 L8 s  I#FUNC#  Add a new line to the input stream.
3 y& K- S/ f! X$ ]define add_newline) j5 E* b" w7 D! d9 D4 e6 [
$1" ]' k- R9 N4 |0 \7 Z/ E

# I3 b/ A, e; C3 g
: ?! I$ \! N. O' ~. d$ ]2 y' xendef3 S: E% Q; s% W: j# u+ [/ V6 f8 O

+ I3 j5 _! ^7 X5 s4 r! E; @/ o2 u
#FUNC# set the variable `src-x' according to the input $1
% H( T; y2 [0 A4 S% G+ Q( Udefine set_src_x
2 q5 Q+ R- x0 zsrc-$1 = $(filter-out $4,$(foreach d,$2,$(wildcard $d/*.$1)) $(filter %.$1,$3))/ `! o' ?+ ?1 h  g
0 Y* S7 m% c3 e

+ T2 A1 m# g6 y/ t: iendef3 G% Q+ P; w& _9 T0 y( F0 S

" v% s! C. A6 D2 x, n9 E8 D
8 O9 _: q  {+ |8 R+ q) l0 P) S' J#FUNC# set the variable `obj-x' according to the input $1
7 {! }" k" y2 G5 _3 l+ S7 h. vdefine set_obj_x
8 K4 a4 U2 @5 o1 Wobj-$1 = $(patsubst %.$1,$3%.o,$(notdir $2))
9 x! n2 t( w* u2 Q$ R" J$ H: m$ S% |) d* g2 n# a$ T- `# W

7 U0 w( f7 E6 q) dendef
+ t( s. Q9 d; @# d' g0 L" u9 N- I: e) ~3 I( S

* u& M/ b4 @/ K7 @' J+ A2 I#VAR# Get the uniform representation of the object directory path name
9 @5 x' l) _/ |ifneq ($(OBJ_DIR),)
7 I1 J6 C* m+ Q/ M- Zprefix_objdir  = $(shell echo $(OBJ_DIR)|sed 's:\(\./*\)*::')! `; X9 u; ^( A- p& i3 j. X# k
prefix_objdir := $(filter-out /,$(prefix_objdir)/)9 i/ d( Y3 ~$ W; m4 Q0 o
endif
1 n4 P6 q+ A% b( b2 N" ]
3 z6 ^, f& \/ |& d% j: S7 V1 E1 o$ V! G# v1 j- W: y5 ?% Y* F
GCC      := $(CROSS_COMPILE)gcc
6 R2 O1 P1 n: s$ gG++      := $(CROSS_COMPILE)g++6 w  \) O+ b7 N* x( u% T$ F& S
SRC_DIR := $(sort . $(SRC_DIR))
! o2 v$ W' m9 G6 a6 Kinc_dir = $(foreach d,$(sort $(INC_DIR) $(SRC_DIR)),-I$d)8 `( _, H9 A# w/ Z

; H4 z! k; \2 v& w2 D6 e7 P: K: H2 s/ A5 L6 [( N
#--# Do smart deduction automatically3 ^! z$ \6 A; w0 w. q7 I
$(eval $(foreach i,$(SUFFIX),$(call set_src_x,$i,$(SRC_DIR),$(EXTRA_SRC),$(EXCLUDE_FILES))))
( X' O/ E. A% \6 v$(eval $(foreach i,$(SUFFIX),$(call set_obj_x,$i,$(src-$i),$(prefix_objdir))))6 E( |) U: M7 F1 Z/ Y! i
$(eval $(foreach f,$(EXTRA_SRC),$(call add_newline,vpath $(notdir $f) $(dir $f))))' \8 y# T& A' ?5 f* n/ G2 _1 r
$(eval $(foreach d,$(SRC_DIR),$(foreach i,$(SUFFIX),$(call add_newline,vpath %.$i $d)))). `. d- z8 h) |( q* F4 |% {

) x( K) r. v: V* n+ l0 o2 D7 r5 E: s. C
all_objs = $(foreach i,$(SUFFIX),$(obj-$i))7 {- l, d& j# V; U! o) V  L& o
all_srcs = $(foreach i,$(SUFFIX),$(src-$i))
* ]5 a! `9 o! e4 j! t5 R" o, W$ ]! |& P

) i- F; b# `0 J2 a. ^+ H2 RCFLAGS       = $(EXTRA_CFLAGS) $(WARNINGS) $(OPTIMIZE) $(DEFS)1 z* q. l. [2 O6 O8 w- N1 O( D& Z: D
TARGET_TYPE := $(strip $(TARGET_TYPE))5 Z* h8 S) M' N$ q% ^+ C

8 v5 M1 `+ n( I/ P
2 G/ F. x5 t$ W' D* J% e& Uifeq ($(filter $(TARGET_TYPE),so ar app),)
6 }* ~' q+ `/ ]' s6 f$(error Unexpected TARGET_TYPE `$(TARGET_TYPE)')' ]: S; t4 h$ B5 e6 v  X
endif& ^% E0 e7 a) c) F: _- t
* \1 ~9 e7 E4 [/ \) \( d2 R
  k" j/ e0 F7 C
ifeq ($(TARGET_TYPE),so)0 O% B1 J; {9 P3 C- p* Z$ m3 y! u
CFLAGS  += -fpic -shared
' z* r2 X; A7 S7 ?. B* ~ LDFLAGS += -shared% b3 i9 V2 m' S' G: X1 K
endif' j& G  l; a; M- k1 ~9 V" }

2 K* }" d- ?5 c5 K- L5 V2 B9 o
/ D" n4 N0 _7 ]" R& _! s: mPHONY = all .mkdir clean
; a' f, f* Y! A" {
5 ?! S1 Y$ m+ x, t/ K" H! }% w; \! B: l' {' d: B* |- O# E
all: .mkdir $(TARGET)
* \6 E6 p' Y. _7 [5 V5 w& i! L  c9 a) D# ?
5 @6 q( [+ k& [( Z
define cmd_o4 f/ o" r* t. [
$$(obj-$1): $2%.o: %.$1  $(MAKEFILE_LIST)
( T, z/ ]; @6 V  a$(GCC) $(inc_dir) -Wp,-MT,$$@ -Wp,-MMD,$$@.d $(CFLAGS) -c -o $$@ $$<
3 J6 R" \; [1 S, c' I9 H# I6 o9 r7 ^
8 d9 p! V& n4 l1 n) B% m' X
+ V7 X9 a  V3 w- ?8 b2 T( rendef
3 z2 N1 @2 l+ I1 c9 Q5 A$(eval $(foreach i,$(SUFFIX),$(call cmd_o,$i,$(prefix_objdir)))); j7 H$ Z4 W8 X0 |' j0 Z' u* ^; ]- Y1 ?
( e$ a' g: v: s1 F; c9 j

+ C0 _- ?) @' a8 }7 Z8 N( sifeq ($(TARGET_TYPE),ar)# I% z% ]; }8 ^' m6 g
$(TARGET): AR := $(CROSS_COMPILE)ar
! a/ Y" r! {; N0 O) G+ h$(TARGET): $(all_objs)2 \% g7 ~6 C6 L1 P5 a4 U+ @
rm -f $@) X  W2 j0 F2 W' y$ z
$(AR) rcvs $@ $(all_objs)
8 I. ^. T7 T" t( C' W* g0 t# velse
, k$ U- z8 ]/ }$ ]4 q6 G$(TARGET): LD = $(if $(strip $(src-cpp) $(src-cc) $(src-cxx)),$(G++),$(GCC))9 ^3 A7 w$ G* n+ p
$(TARGET): $(all_objs)
9 R0 o' }3 X* b, Z+ q" O$(LD) $(LDFLAGS) $(all_objs) -o $@
  |5 Y% n0 r! M5 R6 v8 vendif
  @2 {* P/ Y+ A6 ?$ S3 ?2 s) v0 Q+ s$ N! \3 A4 G0 N* s: h& N( s# o+ A

# V% J5 I( E5 w* u# T) q1 n.mkdir:! n1 u! R; Y# F
@if [ ! -d $(OBJ_DIR) ]; then mkdir -p $(OBJ_DIR); fi
! G( ~0 C! v# W- O" s% I
3 Z4 J5 K1 ?4 m6 C; V( F3 q% w) M1 R9 W' p; A$ C7 Q
clean:8 S0 h3 }1 @9 E" f& W. t8 Q
rm -f $(prefix_objdir)*.o $(TARGET)
0 I( b) N2 C8 Q8 [9 ^1 T$ W6 k* f5 u" J, C) V3 X9 t' Q6 L
7 ]: w3 f. o8 m# `
-include $(patsubst %.o,%.o.d,$(all_objs))
/ J& I7 ]# h" m/ C1 K1 @: A0 V$ ~2 ?3 X( P1 }

% v6 i/ H4 F3 X. K- Q5 r% Z.PHONY: $(PHONY)
2 }( O8 p6 ~7 M! E
6 ~  }7 k! T& D/ L8 n3 f
 楼主| 发表于 2017-5-4 09:14 | 显示全部楼层
Makefile模板2 # M4 e# a) ]" C. f3 r  g9 D2 B
' n- J0 v* q- T; O& W
5 Y1 Z0 T& B) k
src  := $(shell ls *.c): D/ f& j1 _2 V( z' _; w
objs := $(patsubst %.c,%.o,$(src))
, ^: ?2 N9 I0 H9 E0 x
0 _! Q9 j8 i! h
) a& h- i. l/ Itest: $(objs)! y6 J. t5 H' W  l6 {
gcc -o $@ $^& o+ p1 r& k9 r( u
$ C0 Z0 e8 r' |! L/ f+ x7 x. h/ J
$ Q9 a' J6 |! ]6 J
%.o:%.c4 H! Z- d4 e$ J- w6 E% y1 O7 V* B
gcc -c -o $@ $<
% z  h1 t) o: e* q* n, P& Y# f
: z4 B0 N4 V& K" E6 ]7 Z
% N- d: v0 c0 c. u' \6 e- L/ @clean:' ^( ]! P6 y/ T7 N
rm -f test *.o 2 i5 o7 H6 d' i: n/ {" Y6 b

本版积分规则

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

GMT+8, 2024-4-26 10:55 , Processed in 0.061634 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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