一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

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

makefile 通用模板

[复制链接]
发表于 2017-5-4 09:13 | 显示全部楼层 |阅读模式
###############################################################################
. u' v7 k2 \* P8 a9 f#
0 l, }7 M9 b9 _# A smart Makefile template for GNU/LINUX programming
- J5 y0 y! b7 P- w  |! m3 W3 i/ C#6 O( x% {3 F* Z* E0 [7 H' X2 F  F
# Author: SR
6 |9 a7 {: |0 ^8 I4 p2 H( n8 y# Date:   
$ |* o" h9 J6 }* v+ Y# F! M, b#
2 {2 S1 k& S2 u! H' \8 r# Usage:0 Y, @, u' ?6 Z5 F- \' e/ P
#   $ make           Compile and link (or archive)
( z) o# D4 D; m* t#   $ make clean     Clean the objectives and target.
0 J% G6 p8 E# N################################################################################ p8 D: a- A: R0 p

- \2 R% S1 |2 b' `0 `# M1 h
: V$ e; b1 A& b0 ]" |* J5 OCROSS_COMPILE =+ I! K, ~6 H( H
OPTIMIZE := -O2
3 e% D+ D6 R1 |% r; c& MWARNINGS := -Wall -Wno-unused -Wno-format
9 Q1 w- k4 Q3 K& L( x4 G9 KDEFS     := -DMYDEF=1 -UMYDEF2; m0 a4 d) N4 L  K7 _
EXTRA_CFLAGS := 4 r  m0 N3 v" n! d8 ]

! n8 S! ^! C/ `7 y" K& r$ y. E. F! U; x% p, E
INC_DIR   = include
; l' S: ?( I9 O$ nSRC_DIR   = src1 src2/a src2/b- u1 G8 X5 w2 B! L
OBJ_DIR   = out/target
2 D+ X" A) }9 ^( _  tEXTRA_SRC = src3/z3.c src4/z4.cpp, P  R7 W1 E) n
EXCLUDE_FILES = src1/skipme1.c src2/a/skipme2.c$ J) v+ ]. w9 V3 U$ v1 H/ p6 {
* d4 V8 e7 ^' `, o1 |3 a

7 S" t0 ~7 n) `+ u- {4 QSUFFIX       = c cpp cc cxx
0 D' D- r) E" O! PTARGET       := out/go.exe) w9 t+ p4 w2 @) O  R% K; f& W8 a
#TARGET_TYPE          := ar
0 ]& P# }- S  m' HTARGET_TYPE          := app5 o- s- Y  @9 d# L' ^+ L
#TARGET_TYPE          := so
0 t( H7 w* J/ J  h1 [2 }
- `, r. K* [: ^  J  @1 J8 b& Y& P$ w6 [7 P
/ s2 P, t$ x* x: d0 |

0 V% L# ]- c: g2 G" E###################################################################################### s. D; L4 f( p- X( ]$ G+ V
#  Do not change any part of them unless you have understood this script very well  #* V" s( P) G, J
#  This is a kind remind.                                                           #
8 \5 p6 r) [: y) ^5 z0 I8 ]7 g#####################################################################################& ~3 }6 g, ~% f* b! D0 h0 H, D6 D
! H# q  A, y% \" {

# m) \" s4 l4 v8 C3 h#FUNC#  Add a new line to the input stream.+ y3 N$ _" ?1 z) {! ~4 ~4 t$ {
define add_newline
) w2 a4 z" e) _% Y. c  ]$1
8 c' s' V' q$ G. u3 W8 ]- ~2 x' q) }; F* A

8 N2 A+ a: d* dendef8 S$ a3 j8 z# d8 m* E& e

/ u' _+ i& f5 t# v' c- r% u1 Y( h; l8 C0 [6 V4 x
#FUNC# set the variable `src-x' according to the input $1
" R7 c" d- d5 d# zdefine set_src_x+ l. N) {- Q3 p. j- X# e
src-$1 = $(filter-out $4,$(foreach d,$2,$(wildcard $d/*.$1)) $(filter %.$1,$3))
1 u6 ~7 [. i" v! _0 n: I% @" }8 o( l* x  z

5 a( e9 G9 ?9 Kendef; U9 i) B6 h! g3 O' ~1 o

7 k# A8 m! y+ {4 _: w. X6 \  k. v4 c8 z) c
#FUNC# set the variable `obj-x' according to the input $1. w0 O, i2 l: ?3 V+ B+ h" T( D
define set_obj_x1 ]. F' I7 v- L0 l, j; M) D. W; B
obj-$1 = $(patsubst %.$1,$3%.o,$(notdir $2))3 c; b/ w( }0 O5 S3 Q2 m5 p
' i9 n0 H/ x/ R$ I0 B
4 K: T; p- L- w7 ], O  d0 T
endef$ M- w* P& I. F! U& d+ {

/ N# p0 s& r5 e" H2 A8 N1 g8 R, @' \5 J! m( X4 \
#VAR# Get the uniform representation of the object directory path name
: F$ A1 {7 c3 K$ |0 Y: g+ A* Difneq ($(OBJ_DIR),)
4 x+ f+ i. B" D! _; ^$ s! H, Aprefix_objdir  = $(shell echo $(OBJ_DIR)|sed 's:\(\./*\)*::'); C' {8 K" U* x
prefix_objdir := $(filter-out /,$(prefix_objdir)/)" U) H" _( o) j7 A
endif
+ J) x4 T5 |4 O; u- v( |$ M6 T/ I0 {# z

- f' S' m  H5 P+ B% B3 K6 QGCC      := $(CROSS_COMPILE)gcc  U) `+ B* V! G! d
G++      := $(CROSS_COMPILE)g++
5 e5 C9 A% H3 u# S7 {SRC_DIR := $(sort . $(SRC_DIR))
: P: {( ]8 R5 O6 X- |; x3 O! r& A- sinc_dir = $(foreach d,$(sort $(INC_DIR) $(SRC_DIR)),-I$d)7 ~# d) ]: G4 B+ r; g8 Q+ x2 V

4 b1 o  L( A; t/ p  F. Z& l7 Q9 C
" j6 e5 s/ X7 q% Y% g. I1 ~#--# Do smart deduction automatically
/ E) E- l; Z! c3 d  t0 q$(eval $(foreach i,$(SUFFIX),$(call set_src_x,$i,$(SRC_DIR),$(EXTRA_SRC),$(EXCLUDE_FILES)))); j, x$ g7 x9 x; I* U) x
$(eval $(foreach i,$(SUFFIX),$(call set_obj_x,$i,$(src-$i),$(prefix_objdir))))
" s& l# \0 T1 L: W) d/ d; l9 v$(eval $(foreach f,$(EXTRA_SRC),$(call add_newline,vpath $(notdir $f) $(dir $f))))
0 [! q( A/ h# q/ S" w! K# m5 k$(eval $(foreach d,$(SRC_DIR),$(foreach i,$(SUFFIX),$(call add_newline,vpath %.$i $d))))
; K' j$ P+ g5 N. D& `
" k: N; B8 d# d7 X2 Q; F
% W$ D3 Y$ Z; {  i; X% ~- m% b2 r  fall_objs = $(foreach i,$(SUFFIX),$(obj-$i))/ i" N( N8 r7 ?- k: _0 d9 i3 G
all_srcs = $(foreach i,$(SUFFIX),$(src-$i)). t( F7 ]$ O3 J; p& @1 U

6 \2 Y; ^9 n; o9 Z
  t4 z+ I& _. p) x1 ?CFLAGS       = $(EXTRA_CFLAGS) $(WARNINGS) $(OPTIMIZE) $(DEFS)$ h' l3 t8 _) P: O
TARGET_TYPE := $(strip $(TARGET_TYPE))
& y: }( r8 d) v4 M  ], \) p, O6 ^2 S- D) S* i) R" ^

, o" @9 j, h. Y3 s1 Vifeq ($(filter $(TARGET_TYPE),so ar app),)
- c3 {3 O& t( {5 u$(error Unexpected TARGET_TYPE `$(TARGET_TYPE)')9 x3 n8 w% }3 ^! S  Q' q! @8 w
endif
: P* o! f3 d  g6 K8 c, u+ H( O/ r4 R# t) U( u! K
& _7 v2 ^$ r# e' P2 l5 G( Y. H
ifeq ($(TARGET_TYPE),so)
% F% z9 h6 r* }% d: c CFLAGS  += -fpic -shared
7 `( m1 e1 }+ U. ^7 V, P# ^+ R LDFLAGS += -shared
7 o; m. z4 B" Y4 s1 F6 ~  Nendif
+ \0 L) i5 ?8 `$ e' Z# V) E" P
3 h! w$ d& Q8 L( K! Q  \4 Q; ]9 J1 \4 Z6 e
PHONY = all .mkdir clean5 B  l8 D( x" I. N; Z
& d# \* Y/ c$ V" @& P  P4 w
9 g# Y+ j9 U( W
all: .mkdir $(TARGET)" T0 ?# x, w' f7 o) {& c- S
. O& [* q6 L5 L0 M: X( D* ?% D
  r4 q6 @* _- T% W' z
define cmd_o
4 c; ?5 J/ z' h, A" ]% M$ X8 m" u8 v$$(obj-$1): $2%.o: %.$1  $(MAKEFILE_LIST)
" Q; D, ]9 x/ `) D6 i6 c$(GCC) $(inc_dir) -Wp,-MT,$$@ -Wp,-MMD,$$@.d $(CFLAGS) -c -o $$@ $$<) R$ b. A: t! _- ?
" ~3 n' }) N9 S; `- Q

/ K2 N# E2 h: ^endef1 x4 X2 `& I- B( h, V9 R0 U
$(eval $(foreach i,$(SUFFIX),$(call cmd_o,$i,$(prefix_objdir))))
; G& ^- `, s- n9 m% D) W( e1 k6 N& E' i: n3 Q# h
4 N3 ^4 c, U) \' R! G2 n/ H
ifeq ($(TARGET_TYPE),ar)' g2 s& y( w9 o2 d. v1 N
$(TARGET): AR := $(CROSS_COMPILE)ar; s$ d' x2 Z" n& ?3 {4 F% k
$(TARGET): $(all_objs)
( n' m+ B% k1 j& k2 R" u6 irm -f $@4 u3 g) k7 A: n* g8 F
$(AR) rcvs $@ $(all_objs)% M6 n! o" Q. B- @: C$ @; U$ B) O  w
else3 V0 x3 V& S2 H: l" ]* [
$(TARGET): LD = $(if $(strip $(src-cpp) $(src-cc) $(src-cxx)),$(G++),$(GCC))
7 U2 {' C' m8 M$(TARGET): $(all_objs)5 k. L# I, Z8 g: ]. O5 E2 `7 I% @
$(LD) $(LDFLAGS) $(all_objs) -o $@
; k: ^: \. v! z6 H4 T$ mendif: ^) z' _) X8 Y

* q/ g% {9 l* k8 D. ^' @4 N% G# b' `. U6 |0 l. x
.mkdir:
% ?/ z" }+ {! i& I- b# s@if [ ! -d $(OBJ_DIR) ]; then mkdir -p $(OBJ_DIR); fi
# q+ O# U7 a( W; b  c# e* p$ L" H1 |0 p! f6 T; m) D. P

! F! h' n2 u3 |- K/ m9 Gclean:  B! ^6 u/ j! A3 u3 X; }
rm -f $(prefix_objdir)*.o $(TARGET)* Y+ L1 j. d9 f

3 t; i' i9 P7 X4 ~1 S+ Z- h
; L3 o6 q3 M# e-include $(patsubst %.o,%.o.d,$(all_objs))" z# |0 c  C; T5 z
  T# m0 C) n) Q: T8 r4 F" H1 I

+ U# J1 z& G& ?- ]' T9 S.PHONY: $(PHONY)
( d# J1 t! R. U: @- ~7 p
0 p7 H$ R; X6 r; r+ P8 P& ]2 P
 楼主| 发表于 2017-5-4 09:14 | 显示全部楼层
Makefile模板2
9 k/ W+ N: D3 N( m+ u' S6 D
: i1 z+ W# y8 ]! L6 Q
: x1 r- k! m7 B! T+ z; l
src  := $(shell ls *.c), I# h) G! _5 i5 h
objs := $(patsubst %.c,%.o,$(src))
  P0 P4 Q& i- y, ~8 P! t, b
& m9 V5 \/ Z+ F2 J( L0 l0 E2 u! X0 o, p& D
test: $(objs)
* Y8 F* n4 I8 J1 Tgcc -o $@ $^
/ K* Q) N9 Q9 M( a" v; G
$ j% X8 x, x; D8 j2 J: H- m
' L) z% Z/ h  a& w3 ~%.o:%.c$ e' X$ J" n" j1 Y$ }
gcc -c -o $@ $<
. I* r4 V, r0 r& M( N
( F( y2 N* N& X! P8 x) O
1 s2 m9 v" x+ c/ b7 xclean:
, R& H$ |- L' @# irm -f test *.o
( B+ u/ ^- n8 ~$ |% |- ~

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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