makefile 子文件夹下的问题

water-moon 2013-04-22 02:07:52
主文件夹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 += $(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,谢谢您的回复。
...全文
157 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
prohibit 2013-04-23
  • 打赏
  • 举报
回复
去掉 $(FONT_OBJS): cd $(FONTDIR) && $(MAKE) $(IMAGE_OBJS): cd $(IMAGEDIR) && $(MAKE) 在main.o下执行子目录的make命令:
main.o:main.c lcd_tft.h bmp.h i2c.h keyboard.h $(FONTDIR)/font.h $(IMAGEDIR)/image.h
    $(CROSS)gcc -c main.c
    cd $(FONTDIR) && $(MAKE)
    cd $(IMAGEDIR) && $(MAKE)
这种方法你测试一下呢
water-moon 2013-04-23
  • 打赏
  • 举报
回复
引用 1 楼 prohibit 的回复:
最直接,最简单的方法是把子目录的makefile整合到主文件夹的makefile里: C/C++ code?1234567891011121314151617181920212223242526272829303132333435CROSS=arm-linux-APPNAME=main FONT_OBJS = font13_ASCII.o font13B_ASCII.o……
没有其他一些方法吗?在如果整合子文件夹到主文件夹中,子文件夹多了makefile就显得麻烦了。
mayer 2013-04-23
  • 打赏
  • 举报
回复

#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 $<
prohibit 2013-04-22
  • 打赏
  • 举报
回复
最直接,最简单的方法是把子目录的makefile整合到主文件夹的makefile里:
CROSS=arm-linux-
APPNAME=main

FONT_OBJS = font13_ASCII.o font13B_ASCII.o ...#省略,补全
IMAGE_OBJS = image_analog.o image_analog_dbm.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
...


#font objs
font13_ASCII.o: ./font/font13_ASCII.c ./font/font.h
    $(CROSS)gcc -c ./font/font13_ASCII.c
font13B_ASCII.o: ./font/font13B_ASCII.c ./font/font.h
    $(CROSS)gcc -c ./font/font13B_ASCII.c
...


#image objs
image_analog.o: ./image/image_analog.c
    $(CROSS)gcc -c ./image/image_analog.c
image_analog_dbm.o: ./image/image_analog_dbm.c
    $(CROSS)gcc -c ./image/image_analog_dbm.c
...

...

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧