一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 4767|回复: 1

makefile 通用模板

[复制链接]
发表于 2017-5-4 09:13 | 显示全部楼层 |阅读模式
###############################################################################2 f1 {) z% y8 d  g5 M( c$ a
#
8 V1 q! `6 H) }, A# A smart Makefile template for GNU/LINUX programming( t6 E( x9 b/ Q5 \# `! f
#
' [2 y9 \3 f9 ~4 M" L* [# Author: SR* O8 J3 e3 F  \$ u
# Date:   
( f# S8 k4 {& L+ p- M6 c0 d#$ h$ U! t; \, r: }
# Usage:3 ]$ t" S6 l; [0 Q
#   $ make           Compile and link (or archive)
" h  {. g. ~2 @. \#   $ make clean     Clean the objectives and target.
+ e# V# B! D9 p. w$ L7 E( p1 l6 W###############################################################################
; |5 q! Y- J( L2 X6 k- t- ]$ U# f7 Z  z

) [3 C2 M1 Z' a" W: B" DCROSS_COMPILE =# a7 T% J: Z8 u( n
OPTIMIZE := -O2
/ w8 {. j  z8 z1 G" G# L1 UWARNINGS := -Wall -Wno-unused -Wno-format* l. q4 J$ l) w. O9 |/ Q$ b+ Q
DEFS     := -DMYDEF=1 -UMYDEF2# m6 ~! L0 Q5 d( o! I4 Y! v
EXTRA_CFLAGS := / j) M0 m# f5 J! e2 J( d  V) I
% ^+ ?/ Y: H8 Q% l6 @
6 \$ U1 P3 h6 q1 K" D6 N9 f/ O8 v
INC_DIR   = include9 x4 @& ?# X9 r8 _8 D9 V% B6 [
SRC_DIR   = src1 src2/a src2/b
& I3 ~6 S. R; k  R, jOBJ_DIR   = out/target7 M5 q" K* t  c
EXTRA_SRC = src3/z3.c src4/z4.cpp
! ?; h4 E6 Q) Y4 kEXCLUDE_FILES = src1/skipme1.c src2/a/skipme2.c
3 s6 _. @1 W6 u9 }+ [, `3 p- R( E, B

4 y: S2 a1 t, v( l2 rSUFFIX       = c cpp cc cxx0 V- y. @, n& H- [3 E6 Y
TARGET       := out/go.exe) H# {% t; N/ d9 u3 R* {( X5 A
#TARGET_TYPE          := ar
& s9 l. L5 h/ iTARGET_TYPE          := app- l6 L0 `+ G- {% v* J( Y9 m' J2 h
#TARGET_TYPE          := so
- T) X8 E& X4 v
. ?2 L! \2 q; f! t( g4 b# s# [
9 [! L$ {. d7 S% r5 c+ Y* J5 t3 Q7 a0 t

; x% `& i0 c: }+ g$ J8 D1 s#####################################################################################* `* u* L6 Y# g5 W+ n0 Y
#  Do not change any part of them unless you have understood this script very well  #
) j: V2 R5 F8 n7 p& f. P#  This is a kind remind.                                                           #
4 b0 T$ F/ O1 b. [) _#####################################################################################
6 E% o( p: ?, k: z' j0 T: }
$ Z7 \- a4 {$ j. |
" a; q( W2 l; }; A9 @#FUNC#  Add a new line to the input stream.7 q/ g& _8 U- @* P" y# V1 s( W
define add_newline- X; ]; J2 f' B; j. q# N
$1- |! x9 ~# n7 B) I, r0 V8 E
8 f+ Y3 E9 a* p+ {! F- Y4 g

' x' ]' `; T0 f) |% j" [/ j& tendef; b  T/ `1 x9 W' O8 l) _1 S3 N7 S

+ }* m/ Y$ O8 q$ l' A3 _9 I  A! c# ]% `" v$ j
#FUNC# set the variable `src-x' according to the input $10 T8 H. g/ d; U
define set_src_x
# e' T# @9 D& ]src-$1 = $(filter-out $4,$(foreach d,$2,$(wildcard $d/*.$1)) $(filter %.$1,$3)). J1 {' J5 l+ \4 H
  P2 d( r; t( i
3 R% q# b& E1 F) W
endef4 Q1 }0 n: Q1 N) R0 U1 I6 G
$ |. r8 l. i+ X
4 |# T  V9 h! c; A3 J9 N$ P( a- x
#FUNC# set the variable `obj-x' according to the input $18 S0 L. x1 L- j  X3 k4 K# A  F
define set_obj_x
) o' d: J# N1 D" ^( j- l( |obj-$1 = $(patsubst %.$1,$3%.o,$(notdir $2))* N- A9 H$ q. u: @

2 f9 X/ z$ C4 V9 K+ z
! d4 d$ C7 F  ]# r1 u% r6 r; cendef1 \: S4 _  D6 `; c- `

# r  z+ }( T& W; a$ c3 Z  Q. H+ a, Z: N/ K* N8 q# Q5 d" g
#VAR# Get the uniform representation of the object directory path name
2 Z7 A3 P5 ?2 }# vifneq ($(OBJ_DIR),)
) j: y/ m' U% f' mprefix_objdir  = $(shell echo $(OBJ_DIR)|sed 's:\(\./*\)*::')& w4 P5 K( t2 C9 h
prefix_objdir := $(filter-out /,$(prefix_objdir)/): y- G! X. D7 s/ ^- {2 q( D7 r& r
endif
" U" q5 V: |9 l- W; f( a3 a* j# J! T8 m. @1 a4 Y6 L
6 C6 l5 y9 R2 r8 w1 o
GCC      := $(CROSS_COMPILE)gcc
' r! c  k- y% jG++      := $(CROSS_COMPILE)g++5 N2 t6 z3 F8 G
SRC_DIR := $(sort . $(SRC_DIR))
1 C/ x7 H6 J2 p& e3 Q8 E, I+ Kinc_dir = $(foreach d,$(sort $(INC_DIR) $(SRC_DIR)),-I$d)! _4 Q  f$ J! Q: h7 h# h
3 {' V: q! P) [2 t9 `6 o  B
) S" u$ p8 J0 a! R% M& c9 y
#--# Do smart deduction automatically5 Q+ v; t! S& n6 K
$(eval $(foreach i,$(SUFFIX),$(call set_src_x,$i,$(SRC_DIR),$(EXTRA_SRC),$(EXCLUDE_FILES))))6 B; J+ K+ `) c1 D2 k
$(eval $(foreach i,$(SUFFIX),$(call set_obj_x,$i,$(src-$i),$(prefix_objdir))))
3 ?3 x! r8 @2 Q1 D$(eval $(foreach f,$(EXTRA_SRC),$(call add_newline,vpath $(notdir $f) $(dir $f))))
9 ?# z2 f0 c& Q; p. Q  y, h$(eval $(foreach d,$(SRC_DIR),$(foreach i,$(SUFFIX),$(call add_newline,vpath %.$i $d))))
+ n0 ?3 A$ |% I' N3 ^
) |0 x- s6 M% j7 ]
+ q! [, z! U; Hall_objs = $(foreach i,$(SUFFIX),$(obj-$i))( x/ y) E, Q$ c. S2 t
all_srcs = $(foreach i,$(SUFFIX),$(src-$i))+ E* A# j. T* P/ z$ j

' N2 N1 D+ H7 r  Y! h, [& [' r; }0 F. U- ]9 y2 b
CFLAGS       = $(EXTRA_CFLAGS) $(WARNINGS) $(OPTIMIZE) $(DEFS)2 n' T/ G# V' Y
TARGET_TYPE := $(strip $(TARGET_TYPE))
" Y$ p. V3 x: }4 |$ x: V7 f1 g( d5 @0 v2 }+ L" s5 s

6 S# y% H/ f% M1 L/ \5 n5 pifeq ($(filter $(TARGET_TYPE),so ar app),)' r& |- N* X! l  ?+ h2 Z; q
$(error Unexpected TARGET_TYPE `$(TARGET_TYPE)')% W, k" v4 l; a
endif0 X9 D+ K5 S% h
2 k1 C" P5 ?) x0 h
3 Z* s8 H' D0 n5 @
ifeq ($(TARGET_TYPE),so)
, x- t; X6 N- U+ y( [6 E CFLAGS  += -fpic -shared
! |$ {" z6 M1 D- C  f6 i' L4 ~% u LDFLAGS += -shared0 a" b% ^/ a; A, v8 C: B
endif
# a* `4 J( c# j; ]5 g1 {* W1 g7 T5 l: i
+ d& `2 E( y: d2 L
PHONY = all .mkdir clean
$ \0 C$ E. t% A
' f8 m) m, z; {- W' I, W
2 }( i: v" @8 S( ~; V# Q6 Eall: .mkdir $(TARGET)2 v) _& R5 I: c. i

3 y( v* J4 P$ B: g/ }
  q1 H$ [& t* [& f2 c. ~define cmd_o+ H8 y2 T8 ^/ k$ }. E  G
$$(obj-$1): $2%.o: %.$1  $(MAKEFILE_LIST)" w( s# |3 h3 ^- L6 I! l2 I+ X
$(GCC) $(inc_dir) -Wp,-MT,$$@ -Wp,-MMD,$$@.d $(CFLAGS) -c -o $$@ $$<8 q. |8 k  \! ]
! l, v8 ~/ O. Q( [

& T! v8 `3 Q0 L7 }endef: H) t. P$ V) p0 z
$(eval $(foreach i,$(SUFFIX),$(call cmd_o,$i,$(prefix_objdir))))9 D8 }% a6 O2 E

1 E7 q7 S0 E$ b$ `
; f- A0 z' \* X0 p2 P& aifeq ($(TARGET_TYPE),ar)
) Y2 k- w; J0 T9 e9 }% v0 J0 `+ [" H$(TARGET): AR := $(CROSS_COMPILE)ar
$ a7 k* }% U) g' P' C0 e$(TARGET): $(all_objs)
4 _; e+ _; W- w. frm -f $@
0 C* j5 L' B) N0 Z$(AR) rcvs $@ $(all_objs)
. o" a4 k$ c; G, O$ t3 }) Y% Delse
; ?8 ]: ~2 T* e. f$(TARGET): LD = $(if $(strip $(src-cpp) $(src-cc) $(src-cxx)),$(G++),$(GCC))/ G& o% ?: ?/ M
$(TARGET): $(all_objs)
0 i3 _0 }; n6 s% q- S0 e* W$(LD) $(LDFLAGS) $(all_objs) -o $@
5 R% k: R! t) Q* J5 `endif
0 W+ `3 o& G' f& p4 N5 m" ?
5 C( V( c2 I9 J  Y3 B+ {7 o# ^
$ [' `* ^: F' I+ P' P) t! q3 C! w.mkdir:$ ]+ ]) D- d9 a4 g
@if [ ! -d $(OBJ_DIR) ]; then mkdir -p $(OBJ_DIR); fi" k  h* U  H9 M* p4 E
' \: W2 J5 G, {& b" J

5 `/ J! @+ a6 Y0 Z1 bclean:
6 B4 a. V3 z% U) X8 C0 zrm -f $(prefix_objdir)*.o $(TARGET)
2 _, ~2 x0 _" ~# ~/ L$ k3 n2 h( \6 U

  D4 x* a* ^8 O! H  U! @-include $(patsubst %.o,%.o.d,$(all_objs))
# v" j7 R" _; F  o' K7 K! K4 q- X0 x0 z  ^2 x1 f2 c! V
) Q/ o/ i1 u) W
.PHONY: $(PHONY)  M1 V  F: g1 c$ B

$ W# c+ A2 a+ Z/ T- m8 \$ A
 楼主| 发表于 2017-5-4 09:14 | 显示全部楼层
Makefile模板2
8 N1 y- \- r9 v0 f; ]0 ^6 Z2 C- z- A" L2 O3 }9 q# s
" s( G0 x% P$ w3 r' |2 ?; G+ ^8 T
src  := $(shell ls *.c)
7 U# ^" u; z, Gobjs := $(patsubst %.c,%.o,$(src)), m  G- ~# n& b

$ H% F% x( W( F- [3 W  K  F
- R1 H. W8 i& C: C& J7 ?, l2 stest: $(objs)+ V8 z$ ]# P% q' z: r. y  r9 \
gcc -o $@ $^9 v: E9 p; f: \3 O( I

- }( j- P, [2 R* i6 d/ x* Y/ n6 G' `0 ]8 V" v2 r! @1 }2 [
%.o:%.c
3 ^3 ~4 \+ R* l. ]gcc -c -o $@ $<1 k$ \2 J$ O- M4 ?) V

9 h( r0 n6 I2 ^# v" P& r+ ]% c8 a8 Q1 `. `5 [
clean:- l2 ]: W- @# W4 L! z8 E
rm -f test *.o
2 o: F: @/ v! P
回复

使用道具 举报

本版积分规则

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

GMT+8, 2025-10-27 09:31 , Processed in 0.033467 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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