Makefile14--自动生成依赖关系(续)

学习自狄泰软件学院唐佐临老师Makefile课程,文章中图片取自老师的PPT,仅用于个人笔记。


在这里插入图片描述

试验1,关于变量的一个问题,??? 需要解答

寻找 $(DIR_OBJS) $(DIR_EXES) $(DIR_DEPS) 这三个 依赖的规则 怎么会 执行到 $(DIRS)对应的规则的????
倒推看的话 应该是 all : $(DIR_OBJS) $(DIR_EXES) $(DIR_DEPS) 这句每一个依赖都回归到了 DIRS 这个变量????

.PHONY : all clean rebuild

MKDIR := mkdir
RM := rm -fr
CC := gcc

DIR_DEPS := deps
DIR_EXES := exes
DIR_OBJS := objs

DIRS := $(DIR_DEPS) $(DIR_EXES) $(DIR_OBJS)

all : $(DIR_OBJS) $(DIR_EXES) $(DIR_DEPS)

$(DIRS) :
	@echo "add $@"
	$(MKDIR) $@

clean :
	$(RM) $(DIRS)
	


mhr@ubuntu:~/work/makefile1$ 
mhr@ubuntu:~/work/makefile1$ make all
add objs
mkdir objs
add exes
mkdir exes
add deps
mkdir deps
mhr@ubuntu:~/work/makefile1$ 

试验2

.PHONY : all clean rebuild


MKDIR := mkdir
RM := rm -fr
CC := gcc

DIR_DEPS := deps
DIR_EXES := exes
DIR_OBJS := objs

DIRS := $(DIR_DEPS) $(DIR_EXES) $(DIR_OBJS)

EXE := app.out
EXE := $(addprefix $(DIR_EXES)/, $(EXE))

SRCS := $(wildcard *.c)
OBJS := $(SRCS:.c=.o)
OBJS := $(addprefix $(DIR_OBJS)/, $(OBJS))
DEPS := $(SRCS:.c=.dep)
DEPS := $(addprefix $(DIR_DEPS)/, $(DEPS))

all : $(DIR_OBJS) $(DIR_EXES) $(EXE)
ifeq ("$(MAKECMDGOALS)", "all")
-include $(DEPS)
endif

ifeq ("$(MAKECMDGOALS)", "")
-include $(DEPS)
endif

$(EXE) : $(OBJS)
	$(CC) -o $@ $^
	@echo "Success! Target => $@"

#第十课中 针对针对当前工作目录中的文件的模式替换
$(DIR_OBJS)/%.o : %.c
	$(CC) -o $@ -c $^

$(DIRS) :
	@echo "add $@"
	$(MKDIR) $@

ifeq ("$(wildcard $(DIR_DEPS))", "")
$(DIR_DEPS)/%.dep : $(DIR_DEPS) %.c
else
$(DIR_DEPS)/%.dep : %.c
endif
	@echo "Creating $@ ..."
	@set -e; \
	$(CC) -MM -E $(filter %.c, $^) | sed 's,\(.*\)\.o[ :]*,objs/\1.o: ,g' > $@

clean :
	$(RM) $(DIRS)

rebuild :
	@$(MAKE) clean
	@$(MAKE) all

	


 mhr@ubuntu:~/work/makefile1$ ll
total 40
drwxrwxr-x 5 mhr mhr 4096 Jan  5 07:33 ./
drwxrwxr-x 4 mhr mhr 4096 Dec 15 03:18 ../
drwxrwxr-x 2 mhr mhr 4096 Jan  5 07:33 deps/
drwxrwxr-x 2 mhr mhr 4096 Jan  5 07:33 exes/
-rw-rw-r-- 1 mhr mhr   93 Dec 27 04:13 func.c
-rw-rw-r-- 1 mhr mhr   83 Dec 27 05:58 func.h
-rw-rw-r-- 1 mhr mhr   81 Dec 27 04:13 main.c
-rw-rw-r-- 1 mhr mhr  964 Jan  5 07:32 makefile
-rw------- 1 mhr mhr 1024 Jan  5 07:00 makefile1
drwxrwxr-x 2 mhr mhr 4096 Jan  5 07:33 objs/
mhr@ubuntu:~/work/makefile1$ make all
add deps
mkdir deps
Creating deps/func.dep ...
Creating deps/main.dep ...
add objs
mkdir objs
add exes
mkdir exes
gcc -o objs/main.o -c main.c func.h
gcc: fatal error: cannot specify -o with -c, -S or -E with multiple files
compilation terminated.
makefile:39: recipe for target 'objs/main.o' failed
make: *** [objs/main.o] Error 1
mhr@ubuntu:~/work/makefile1$ 

报错:提示编译的时候有 .h 文件存在,因为我们生成的 main.dep 文件被inlcude 到了 makefile中,main.dep内容入下:

objs/main.o: main.c func.h

说明 main.o 依赖于 main.c func.h,新的规则覆盖了 原本的规则

$(DIR_OBJS)/%.o : %.c
	$(CC) -o $@ -c $^

故报错。

可以通过调用filter预定义函数改成入下:

$(DIR_OBJS)/%.o : %.c
	$(CC) -o $@ -c $(filter %.c, $^)


mhr@ubuntu:~/work/makefile1$ 
mhr@ubuntu:~/work/makefile1$ make all
add deps
mkdir deps
Creating deps/func.dep ...
Creating deps/main.dep ...
add objs
mkdir objs
add exes
mkdir exes
gcc -o objs/main.o -c main.c
gcc -o objs/func.o -c func.c
gcc -o exes/app.out objs/main.o objs/func.o
Success! Target => exes/app.out
mhr@ubuntu:~/work/makefile1$ 

待续未完…

发布了192 篇原创文章 · 获赞 100 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/LinuxArmbiggod/article/details/103848943