首页 > 其他 > 详细

Makefile通用编写规则

时间:2014-03-14 07:38:38      阅读:519      评论:0      收藏:0      [点我收藏+]
#简单实用的Makefile模板:

objs := a.o b.o

test:$(objs)
    gcc -o test $^

# .a.o.d .b.o.d
dep_files := $(foreach f,$(objs),.$(f).d)
dep_files := $(wildcard $(dep_files))

ifneq ($(dep_files),)
  include $(dep_files)
endif

%.o : %.c 
    gcc -Wp,-MD,.$@.d -c -o $@ $<

clean:
    rm *.o test 

#/*关键解释*/	
这里面用到了一些Makefile函数,首先我们来说一下Makefile函数的格式:
$(函数名 参数,参数,......)
这里用到了两个函数,我们分别来说一下:
1、dep_files := $(foreach f,$(objs),.$(f).d)
依次取出objs中的成员,放在f中,然后加上.d后缀,组成一个字符串(各个成员以空格分开),返回给dep_files !
2、dep_files := $(wildcard $(dep_files))
展开当前目录下名字为符合dep_files的文件名,并组成字符串返回给dep_files

此外还有一点要说的是:
gcc -Wp,-MD,.$@.d -c -o $@ $<
1、-Wp,-MD:表示生成依赖文件,后跟依赖文件的名字
2、$@:表示规则的目标
      $^:所有的依赖
      $<:第一个依赖
      $?:代表依赖文件列表中被改变过的所有文件

# 第一次执行,没有依赖文件,这个ifneq不执行,
# 当修改.h文件之后,判断执行这个include $(dep_files)
ifneq ($(dep_files),)
  include $(dep_files)
endif

参考内核的Makefile编写包括Makefile和Makefile.build

#Makefile file
CROSS_COMPILE = arm-linux-
AS		= $(CROSS_COMPILE)as
LD		= $(CROSS_COMPILE)ld
CC		= $(CROSS_COMPILE)gcc
CPP		= $(CC) -E
AR		= $(CROSS_COMPILE)ar
NM		= $(CROSS_COMPILE)nm

STRIP		= $(CROSS_COMPILE)strip
OBJCOPY		= $(CROSS_COMPILE)objcopy
OBJDUMP		= $(CROSS_COMPILE)objdump

export AS LD CC CPP AR NM
export STRIP OBJCOPY OBJDUMP

CFLAGS := -Wall -O2 -g
CFLAGS += -I $(shell pwd)/include

LDFLAGS := -lm -lfreetype

export CFLAGS LDFLAGS

TOPDIR := $(shell pwd)
export TOPDIR

TARGET := show_file


obj-y += main.o
obj-y += display/
obj-y += draw/
obj-y += encoding/
obj-y += fonts/


all : 
	make -C ./ -f $(TOPDIR)/Makefile.build
	$(CC) $(LDFLAGS) -o $(TARGET) built-in.o


clean:
	rm -f $(shell find -name "*.o")
	rm -f $(TARGET)

distclean:
	rm -f $(shell find -name "*.o")
	rm -f $(shell find -name "*.d")
	rm -f $(TARGET)

#Makefile.build file 

PHONY := __build
__build:


obj-y :=
subdir-y :=

include Makefile
#找出子目录
# obj-y := a.o b.o c/ d/
# $(filter %/, $(obj-y))   : c/ d/
# __subdir-y  : c d
# subdir-y    : c d
__subdir-y	:= $(patsubst %/,%,$(filter %/, $(obj-y)))
subdir-y	+= $(__subdir-y)


# c/built-in.o d/built-in.o
subdir_objs := $(foreach f,$(subdir-y),$(f)/built-in.o)

#找出目标文件
# a.o b.o
cur_objs := $(filter-out %/, $(obj-y))
dep_files := $(foreach f,$(cur_objs),.$(f).d)
dep_files := $(wildcard $(dep_files))

ifneq ($(dep_files),)
  include $(dep_files)
endif


PHONY += $(subdir-y)


__build : $(subdir-y) built-in.o

$(subdir-y):
	make -C $@ -f $(TOPDIR)/Makefile.build
#built-in.o 依赖当前目录下的build-in.o 
built-in.o : $(cur_objs) $(subdir_objs)
	$(LD) -r -o $@ $^

dep_file = .$@.d

%.o : %.c
	$(CC) $(CFLAGS) -Wp,-MD,$(dep_file) -c -o $@ $<
	
.PHONY : $(PHONY)

关键点说明:


Makefile通用编写规则,布布扣,bubuko.com

Makefile通用编写规则

原文:http://blog.csdn.net/dream890527/article/details/21158849

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!