学习自狄泰软件学院唐佐临老师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$
待续未完…