一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 4968|回复: 1

makefile 通用模板

[复制链接]
发表于 2017-5-4 09:13 | 显示全部楼层 |阅读模式
###############################################################################
/ H6 ^* ], E( D! w$ x, l, r- t* L#
" _0 |& T& }# P6 ]# A smart Makefile template for GNU/LINUX programming& }& s/ ?6 e8 r1 E3 e+ @4 V$ L
#( h- S% U; b3 I) z3 t
# Author: SR( X. {+ Y. T" K/ X8 Z8 @  x
# Date:   / l6 F1 l2 v6 z# e2 x
#$ B6 K$ p, q1 O" z0 n  L6 z
# Usage:
: Z4 N3 r! z! b9 {& ]9 R8 P. C#   $ make           Compile and link (or archive)+ X  s  I, V! i7 c$ L# _: W
#   $ make clean     Clean the objectives and target.* C7 i: J3 b4 E7 J
###############################################################################0 v) n1 m; p  g% W/ T" [+ ^+ e) P

) ^0 m! w7 `* a- ^" b
9 _3 ^" B% ^9 YCROSS_COMPILE =
0 P" I( u4 o2 B4 T/ G0 h2 m$ H& S5 `( bOPTIMIZE := -O2: O0 Y. ~) I7 ~6 a- B7 q8 z, `/ @
WARNINGS := -Wall -Wno-unused -Wno-format: u/ n. s' a$ B* r; d% u2 g1 b
DEFS     := -DMYDEF=1 -UMYDEF2
' `* t. @, ]: ~: ]) ~$ u  TEXTRA_CFLAGS :=
# _) I) P0 X( h% `; k
# ?1 P0 v: H! G2 @( u* F/ \
( T5 j; u6 ?4 YINC_DIR   = include
; g2 V8 P. s8 PSRC_DIR   = src1 src2/a src2/b
1 F0 C: M5 G& U" Q3 e% ^! YOBJ_DIR   = out/target3 X4 E* C8 {/ {  P& q' `2 H) G2 v. P
EXTRA_SRC = src3/z3.c src4/z4.cpp
& Z+ G+ r3 Z% I0 pEXCLUDE_FILES = src1/skipme1.c src2/a/skipme2.c: D- U% O4 K2 F4 O
" b& U5 \0 m/ H( P5 R0 \" J

+ g* l6 x4 [' ~6 M6 {, {SUFFIX       = c cpp cc cxx3 |; v/ n( O: @( G
TARGET       := out/go.exe
6 Q' `' P! ^! W: L" C- i; {#TARGET_TYPE          := ar
# c: }7 {* j8 d2 ?7 q' U4 f  MTARGET_TYPE          := app5 Q9 s# D4 j! R, D0 A% v* s
#TARGET_TYPE          := so
1 A0 X$ _4 Z8 x6 N# w9 y( a- L* I$ s; t% R/ K7 G

  D5 u- M' k) B+ U) u) V
6 b6 J: Y% F* C- a! G  ?
. `/ T# U" z; t2 ?4 A1 w3 l3 A( P- Z#####################################################################################/ w& z' x: b+ c
#  Do not change any part of them unless you have understood this script very well  #
- B6 d) p6 D: P& i# W; |4 r. j#  This is a kind remind.                                                           #
( e8 S3 p; L; Q: ~#####################################################################################6 ]  X5 R% A1 A+ W; g) L

0 q0 j/ n6 e0 F3 ]) a+ }1 s
. @, f* |" B, P* P6 [; `1 j4 k#FUNC#  Add a new line to the input stream.
5 I4 f# S" \# y2 ~) {6 @' Hdefine add_newline
, f! {2 `) i& o  i$1) r2 c, N6 s- c7 ~8 [, G. [
) C; f+ `% N  V' k. f- }, p2 `# R' {8 J

  F- E7 G4 g3 p9 u' eendef* m+ ~0 n! R8 T' b& Z0 W/ i

) U! ?! s0 S6 N- J9 v# m) [
5 Z% r2 m9 L: k5 `0 l& z#FUNC# set the variable `src-x' according to the input $1: O" @. j% ~' I7 L" X% X! u" i
define set_src_x
5 e3 f* I* {! @4 Bsrc-$1 = $(filter-out $4,$(foreach d,$2,$(wildcard $d/*.$1)) $(filter %.$1,$3))
. o5 p: B! {% G- w( X3 x) N4 J( f3 w6 S' K$ {/ [( a4 i
* i0 d# x" c# v
endef
0 }& Z; V  M; U" n, V
& n) L7 e2 P7 c0 D; u  _9 S; K3 Z- k5 A" a
#FUNC# set the variable `obj-x' according to the input $16 @/ {6 C( z* c0 W
define set_obj_x
. I# B( o! x: \obj-$1 = $(patsubst %.$1,$3%.o,$(notdir $2))
5 z. o2 e; M$ _6 l) @3 c8 [7 [4 o* O

  x5 S6 ^- O# g& I9 j' p7 `endef
& w# o$ P+ |* p# S; C- p; R- w) l$ `/ S" ]0 y% E+ h8 Y

% s; U8 K9 g. j5 [# J: N#VAR# Get the uniform representation of the object directory path name
) H4 k8 Y- N! s0 i* j7 D2 }ifneq ($(OBJ_DIR),)
# {6 H) H  X1 A3 Mprefix_objdir  = $(shell echo $(OBJ_DIR)|sed 's:\(\./*\)*::')
/ V+ n/ g& J5 }5 L" ?8 }& J! S  g# ^prefix_objdir := $(filter-out /,$(prefix_objdir)/)3 S2 j9 Y% c4 H6 ]$ y  L
endif
) j2 @. C- \! f) i- J5 Z" E. G  e' n! t
2 Y$ x: q& y. z
GCC      := $(CROSS_COMPILE)gcc( E1 i# V( m! H- l7 Z1 K& W
G++      := $(CROSS_COMPILE)g++
4 E- J4 P$ v& ~. e8 Y! NSRC_DIR := $(sort . $(SRC_DIR))0 @. {$ g! P  V% \; ?! y/ ]- z: g. U
inc_dir = $(foreach d,$(sort $(INC_DIR) $(SRC_DIR)),-I$d)
% X( M) o% V; C* {1 u" e
. b2 H0 z0 k. i/ `! F% y2 Y6 K
1 h' `' r3 {4 H9 Z8 ~. f#--# Do smart deduction automatically
: h/ x' Z; K1 y1 i4 W6 |, C$(eval $(foreach i,$(SUFFIX),$(call set_src_x,$i,$(SRC_DIR),$(EXTRA_SRC),$(EXCLUDE_FILES))))
" w' g2 ~, G) J; m  t6 W$(eval $(foreach i,$(SUFFIX),$(call set_obj_x,$i,$(src-$i),$(prefix_objdir))))# `7 K& V5 h4 {5 R; m
$(eval $(foreach f,$(EXTRA_SRC),$(call add_newline,vpath $(notdir $f) $(dir $f)))). Q# K. x, e+ ~9 Z: H7 F. \
$(eval $(foreach d,$(SRC_DIR),$(foreach i,$(SUFFIX),$(call add_newline,vpath %.$i $d)))): n; n5 Y! \4 C6 X) ?; s
# t/ O: M6 C. I& {% o# {

' Y, ~5 p0 _, p( J- i  ]+ jall_objs = $(foreach i,$(SUFFIX),$(obj-$i))
" k% L& f' u9 C/ M9 \- uall_srcs = $(foreach i,$(SUFFIX),$(src-$i))
. u2 k; b- a. z8 i# `6 u2 o/ j) e) G- E' j4 _
6 {9 {! L, I+ R" v; k9 C2 v
CFLAGS       = $(EXTRA_CFLAGS) $(WARNINGS) $(OPTIMIZE) $(DEFS)3 X, L4 Q- `! v6 a8 G# G& L
TARGET_TYPE := $(strip $(TARGET_TYPE))& ]! P9 }4 J- L; e$ @

) g/ M& a8 F- |, B: H
: Y/ c! t* |0 H, W! T6 e. ~# Hifeq ($(filter $(TARGET_TYPE),so ar app),)
5 R1 N9 J) e7 R& L, J3 Q$(error Unexpected TARGET_TYPE `$(TARGET_TYPE)')
: u9 X: t3 l% _; oendif
0 C* T! f1 M; f, Z3 V
2 V5 ]* c2 s; F7 z: m! U3 b8 |5 \
  k1 p8 z/ |! {7 G( xifeq ($(TARGET_TYPE),so)
/ o+ @2 W6 W& `% z CFLAGS  += -fpic -shared
$ U' R  x% k; F- b7 u7 u' B LDFLAGS += -shared
. E3 Q/ r4 t" @" S! [) D% U7 F5 Q: {endif5 L- }( P* ^% Y; K
. Q8 _3 O& u; X+ n) b! u
! o- J2 `' W1 g3 j
PHONY = all .mkdir clean
3 r3 z& n' z7 T( i1 U  ^* z
; X7 m3 r9 w. f! H" |) ^% O7 a+ _# X  ~! O3 ?9 D5 ?
all: .mkdir $(TARGET)
8 @( D5 f* ]+ t) N3 M" ~  E  H9 h# }
. _$ a8 i* E2 A' S$ p& O9 {
; L" `" y' N6 A, f5 W2 Xdefine cmd_o
7 {$ f( W2 {) F, x( R, V" z% E$$(obj-$1): $2%.o: %.$1  $(MAKEFILE_LIST)
: c/ Q  _- y6 D+ S$(GCC) $(inc_dir) -Wp,-MT,$$@ -Wp,-MMD,$$@.d $(CFLAGS) -c -o $$@ $$<- R* K& d! ~2 v+ Z
$ x( K1 q; D) Q' o6 X

) L2 A4 U/ a" m6 S3 Vendef& p" A. i9 z. G1 t: [1 i; `1 r
$(eval $(foreach i,$(SUFFIX),$(call cmd_o,$i,$(prefix_objdir))))
+ r/ _6 V- g7 c4 Y; I9 j! f
) A8 |$ ]  l4 m# ~# I
* p0 S* h7 t4 ^$ `ifeq ($(TARGET_TYPE),ar)8 b0 g1 k5 U% P+ Z7 ?4 I
$(TARGET): AR := $(CROSS_COMPILE)ar
' C$ `" D* A" B0 @9 Y2 K. \+ b8 N/ g$(TARGET): $(all_objs)8 v* j5 L4 ?: a. F. K) o
rm -f $@
3 i# b" `/ V5 E4 C; D$(AR) rcvs $@ $(all_objs)
# m5 r- \4 h0 x5 a; Xelse
, Q) E3 _) j- N( [( o# r3 a$(TARGET): LD = $(if $(strip $(src-cpp) $(src-cc) $(src-cxx)),$(G++),$(GCC))2 o8 V" u) f5 D6 p8 B. ]; c
$(TARGET): $(all_objs)* q, O* v# ~$ f' _( K& ?
$(LD) $(LDFLAGS) $(all_objs) -o $@
9 ?5 \( C8 H. X( ?$ J! W3 V# i9 Uendif5 Z/ G* B6 X9 i$ b8 i' Q

% G+ b& K; {8 M' M
2 f$ d# o! }: ~7 X.mkdir:
7 q6 \* Q( s& K: h. i: a) n@if [ ! -d $(OBJ_DIR) ]; then mkdir -p $(OBJ_DIR); fi6 C( f# t4 y" X9 c& r& G0 Q! w, ~# r
/ o9 {" n* k: [5 T6 Z

4 I7 a0 W3 a" I* t7 u) H. [clean:
* v$ p3 y. X7 w9 V+ Y0 srm -f $(prefix_objdir)*.o $(TARGET)
+ B; [% _$ r8 [' C+ I$ c
7 r0 U$ L8 K4 p/ S1 O% M( ^) A3 I0 @  ^
-include $(patsubst %.o,%.o.d,$(all_objs))# q0 n+ j9 }1 v+ m7 e4 C
$ [% Z- ]6 _. K0 w

8 ]3 j. E7 T, x# e# f.PHONY: $(PHONY)) `8 P2 ^) b- p# C8 n

! w: `' F" f- C3 y. c8 g" n
 楼主| 发表于 2017-5-4 09:14 | 显示全部楼层
Makefile模板2 4 [! g) v0 }  |1 n' E  i; V

2 x! v- R; k6 T; }
3 ~. X3 _6 M- Y; e
src  := $(shell ls *.c)
: x( S  j, ~9 z; O& T, Qobjs := $(patsubst %.c,%.o,$(src))
1 d+ Q4 J2 d2 V. C3 }+ \8 u3 V- p0 ?0 w% `6 }

1 J# [" F& d3 T: z6 E5 @test: $(objs)% p6 R1 D& y7 y* R9 R* Y, C
gcc -o $@ $^! [( t% U! q' K+ q/ ^* ^
8 p7 @8 U6 G2 R8 ^3 r# j

! r6 M6 j9 h# q" G$ m- G' @% ~" y%.o:%.c- m# _. i' f2 W; q
gcc -c -o $@ $<
: B# }* E# l# s4 w3 d: q' C$ o" \

) ^% `: P; z1 [: S) M; P/ l9 Hclean:, k/ ]+ K9 E* J# Y9 d6 ]
rm -f test *.o
" i8 M+ ~) c6 @' @; `# d4 i
回复

使用道具 举报

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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