当前位置: 技术问答>linux和unix
makefile 子文件夹下的问题
来源: 互联网 发布时间:2017-04-09
本文导语: 主文件夹main,子文件夹font,image 主文件夹下maikefile文件内容: CROSS=arm-linux- APPNAME=main #font objs FONTDIR = ./font FONT_OBJS += $(FONTDIR)/font13_ASCII.o FONT_OBJS += $(FONTDIR)/font13B_ASCII.o FONT_OBJS += $(FONTDIR)/font16_ASCII.o FONT_OBJS +...
主文件夹main,子文件夹font,image
主文件夹下maikefile文件内容:
font文件夹makefile:
image文件夹下makefile同font文件夹下是一样的。
问题:
在main文件夹下如果有c文件改变,make可以检测出来,修改后直接make就可以;在子文件夹下修改c文件后,make就不能检测出来,因为main文件夹下只是检测子文件夹里的.o文件是否存在,存在就不会再去make,必须要make clean后才能检测子文件夹的改动。怎样修改能达到任何一个文件修改后,make能选择性编译呢?
初使用makefile,谢谢您的回复。
主文件夹下maikefile文件内容:
CROSS=arm-linux-
APPNAME=main
#font objs
FONTDIR = ./font
FONT_OBJS += $(FONTDIR)/font13_ASCII.o
FONT_OBJS += $(FONTDIR)/font13B_ASCII.o
FONT_OBJS += $(FONTDIR)/font16_ASCII.o
FONT_OBJS += $(FONTDIR)/font16B_ASCII.o
FONT_OBJS += $(FONTDIR)/font24_ASCII.o
FONT_OBJS += $(FONTDIR)/font24B_ASCII.o
FONT_OBJS += $(FONTDIR)/font32_ASCII.o
FONT_OBJS += $(FONTDIR)/font32B_ASCII.o
FONT_OBJS += $(FONTDIR)/hzk12.o
FONT_OBJS += $(FONTDIR)/hzk16.o
FONT_OBJS += $(FONTDIR)/hzk24.o
#image objs
IMAGEDIR = ./image
IMAGE_OBJS += $(IMAGEDIR)/image_analog.o
IMAGE_OBJS += $(IMAGEDIR)/image_analog_dbm.o
IMAGE_OBJS += $(IMAGEDIR)/image_analog_dbmv.o
IMAGE_OBJS += $(IMAGEDIR)/image_analog_dbuv.o
IMAGE_OBJS += $(IMAGEDIR)/image_buttons_background.o
IMAGE_OBJS += $(IMAGEDIR)/image_background.o
IMAGE_OBJS += $(IMAGEDIR)/image_battery_0.o
IMAGE_OBJS += $(IMAGEDIR)/image_battery_1.o
IMAGE_OBJS += $(IMAGEDIR)/image_battery_2.o
IMAGE_OBJS += $(IMAGEDIR)/image_battery_3.o
IMAGE_OBJS += $(IMAGEDIR)/image_battery_4.o
IMAGE_OBJS += $(IMAGEDIR)/image_time_background.o
IMAGE_OBJS += $(IMAGEDIR)/image_minispec.o
C_OBJS = lcd_tft.o bmp.o i2c.o main.o keyboard.o gpio.o $(FONT_OBJS) $(IMAGE_OBJS)
all: $(APPNAME)
$(APPNAME): $(C_OBJS)
$(CROSS)gcc -lpthread -o $(APPNAME) $(C_OBJS)
main.o:main.c lcd_tft.h bmp.h i2c.h keyboard.h $(FONTDIR)/font.h $(IMAGEDIR)/image.h
$(CROSS)gcc -c main.c
lcd_tft.o:lcd_tft.c lcd_tft.h $(FONTDIR)/font.h
$(CROSS)gcc -c lcd_tft.c
bmp.o:bmp.c bmp.h
$(CROSS)gcc -c bmp.c
i2c.o:i2c.c i2c.h
$(CROSS)gcc -c i2c.c
keyboard.o:keyboard.c i2c.h keyboard.h
$(CROSS)gcc -c keyboard.c
gpio.o:gpio.c gpio.h
$(CROSS)gcc -c gpio.c
$(FONT_OBJS):
cd $(FONTDIR) && $(MAKE)
$(IMAGE_OBJS):
cd $(IMAGEDIR) && $(MAKE)
clean:
rm -vf $(APPNAME) *.o *.*~ *~
cd $(FONTDIR) && make clean
cd $(IMAGEDIR) && make clean
font文件夹makefile:
CROSS=arm-linux-
C_OBJS = font13_ASCII.o font13B_ASCII.o font16_ASCII.o font16B_ASCII.o font24_ASCII.o font24B_ASCII.o font32_ASCII.o font32B_ASCII.o hzk12.o hzk16.o hzk24.o
.PHONY:font
font:$(C_OBJS)
font13_ASCII.o:font13_ASCII.c font.h
$(CROSS)gcc -c font13_ASCII.c
font13B_ASCII.o:font13B_ASCII.c font.h
$(CROSS)gcc -c font13B_ASCII.c
font16_ASCII.o:font16_ASCII.c font.h
$(CROSS)gcc -c font16_ASCII.c
font16B_ASCII.o:font16B_ASCII.c font.h
$(CROSS)gcc -c font16B_ASCII.c
font24_ASCII.o:font24_ASCII.c font.h
$(CROSS)gcc -c font24_ASCII.c
font24B_ASCII.o:font24B_ASCII.c font.h
$(CROSS)gcc -c font24B_ASCII.c
font32_ASCII.o:font32_ASCII.c font.h
$(CROSS)gcc -c font32_ASCII.c
font32B_ASCII.o:font32B_ASCII.c font.h
$(CROSS)gcc -c font32B_ASCII.c
hzk12.o:hzk12.c font.h
$(CROSS)gcc -c hzk12.c
hzk16.o:hzk16.c font.h
$(CROSS)gcc -c hzk16.c
hzk24.o:hzk24.c font.h
$(CROSS)gcc -c hzk24.c
.PHONY:clean
clean:
rm -vf *.o *.*~ *~
image文件夹下makefile同font文件夹下是一样的。
问题:
在main文件夹下如果有c文件改变,make可以检测出来,修改后直接make就可以;在子文件夹下修改c文件后,make就不能检测出来,因为main文件夹下只是检测子文件夹里的.o文件是否存在,存在就不会再去make,必须要make clean后才能检测子文件夹的改动。怎样修改能达到任何一个文件修改后,make能选择性编译呢?
初使用makefile,谢谢您的回复。
|
#global directory defined
TOPDIR = $(shell pwd)
SRCDIR = $(TOPDIR)/src
LIBDIR = $(TOPDIR)/lib
OBJECTDIR = $(TOPDIR)/build
INCLUDEDIR = $(TOPDIR)/include
#cross compile tools defined
#CROSS_COMPILE ?=
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
RANLIB = $(CROSS_COMPILE)ranlib
#local host tools defined
CP := cp
RM := rm
MKDIR := mkdir
SED := sed
FIND := find
MKDIR := mkdir
XARGS := xargs
VPATH := $(shell ls -AxR $(SRCDIR)| grep ":"| grep -v ".svn" | grep -v ".git"| tr -d ':')
SOURCEDIRS := $(VPATH)
#search source file in the current dir
SOURCES := $(foreach subdir,$(SOURCEDIRS),$(wildcard $(subdir)/*.c))
SRCOBJS := $(patsubst %.c,%.o,$(SOURCES))
BUILDOBJS := $(subst $(SRCDIR),$(OBJECTDIR),$(SRCOBJS))
$(OBJECTDIR)/%.o: $(SRCDIR)/%.c
@[ -d $(dir $(subst $(SRCDIR),$(OBJECTDIR),$@)) ] | $(MKDIR) -p $(dir $(subst $(SRCDIR),$(OBJECTDIR),$@))
$(CC) $(CPPFLAGS) $(CFLAGS) -o $(subst $(SRCDIR),$(OBJECTDIR),$@) -c $