毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> linux >> 正文

模仿李云的Makefile添加include后死循环 第2页

更新时间:2016-8-7:  来源:毕业论文
其原因是:因为.dep文件的创建会造成存放.dep文件的目录的时间戳也发生改变,于是Makefile认为目录的变化需要重新构建.dep文件,于是进入了死循环。解决的方法很简单,就是在发现存放.dep文件的目录已存在时,就不让.dep文件依赖于目录。

.PHONY:all clean

MKDIR=mkdir
RM=rm
RMFLAGS=-rf

CC=gcc

DIR_OBJS=objs
DIR_EXES=exes
DIR_DEPS=deps
DIRS=$(DIR_OBJS) $(DIR_EXES) $(DIR_DEPS)

EXE=complicated.exe
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))

ifeq ("$(wildcard $(DIR_EXES))","")
DEP_DIR_EXES := $(DIR_EXES)
endif
ifeq ("$(wildcard $(DIR_OBJS))", "")
DEP_DIR_OBJS := $(DIR_OBJS)
endif
ifeq ("$(wildcard $(DIR_DEPS))", "")
DEP_DIR_DEPS := $(DIR_DEPS)
endif

all:$(EXE)

-include $(DEPS)

$(DIRS):
$(MKDIR) $@

$(EXE):$(DEP_DIR_EXES) $(OBJS)
$(CC) -o $@ $(filter %.o,$^)

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

$(DIR_DEPS)/%.dep:$(DEP_DIR_DEPS) %.c
@echo "Making $@..."
@set -e; \
$(RM) $(RMFLAGS) $@; \
$(CC) -E -MM $(filter %.c,$^) > $@.tmp; \
sed 's,\(.*\)\.o[:]*,objs/\1.o:,g' < $@.tmp > $@; \
$(RM) $(RMFLAGS) $@.tmp

clean:
$(RM) $(RMFLAGS) $(DIRS)

注意后面的$(RM) $(RMFLAGS) $@; \
有的会写成$(RM) $(RMFLAGS) $@.tmp; \
其实根据上下文,应该是要删除之前已经存在的dep文件。
 $@.tmp这个临时文件在下面已经被删除了。

上一页  [1] [2] [3] 下一页

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。