【发布时间】:2010-05-26 18:46:04
【问题描述】:
我有一个 make 构建系统,我正试图破译其他人编写的内容。当我在 redhat 系统上运行它时出现错误,但在我的 solaris 系统上运行它时却没有。 gmake 的版本是相同的主要版本(次要版本关闭)。
这是为了构建一个C项目,make系统有一个全局的Makefile.global,被每个目录的本地Makefile继承
Makefile.global 包含所有目标,以
开头 all: $(LIB) $(BIN)
全局文件也有下面这行
ifndef INCLUDE_GEN_DEPS
sinclude $(GEN_DEPS)
endif
LIB 构建库,BIN 构建二进制文件。
跳下我的目标
$(LIB) : $(GEN_LIB)
$(GEN_LIB) : $(GEN_DEPS) $(GEN_OBJS)
$(AR) $(ARFLAGS) $(GEN_LIB) $(GEN_OBJS)
$(GEN_DEPS) :
@set -e; rm -f $@; \
$(CC) $(CDEP_FLAG) $(CFLAGS) $(INCDIRS) `basename $@ | sed 's/\.d/\.c/' | sed 's,^,$(HOME_SRC)/,'` | sed 's,\(.*\)\.o: ,$(GEN_OBJDIR)/\1.o $@ :,g' > $@.tmp ; \
cat $@.tmp > $@ ; \
cat $@.tmp | cut -d: -f2 | grep '\.h' | sed 's,\.h,.h :,g' >> $@ ; \
rm $@.tmp
$(GEN_OBJS) :
$(CC) $(CFLAGS) $(INCDIRS) -c $(*F).c -lmpi -o $@
我认为这些是回答我的问题需要包括的所有相关目标。
这些变量的定义:
CC = icc
CDEP_FLAG = -M
CFLAGS = various compiler flags ifdef type flags
INCDIRS = include directory where all .h files are
GEN_OBJDIR = /lib/objs
HOME_SRC = .
GEN_LIB = lib/$(LIB)
GEN_DEPDIR=/lib/deps
GEN_DEPS = $(addprefix $(GEN_DEPDIR)/,$(addsuffix .d,$(basename $(OBJS))))
我认为这涵盖了您需要的一切。基本上从名称中可以自我解释。
现在据我所知,这是在 /lib/deps 中生成一个 .d 文件,其中包含对象和源依赖项。换句话说,对于utilities.a库,我会得到一个utils.o和utils.c的依赖栈,都在utils.d文件中
我认为该文件中正在生成一些语法错误,因为我收到以下错误:
../lib/deps/util.d:25: *** target pattern contains no '%'. Stop.
gmake[2]: *** [all] Error 2
gmake[1]: *** [all] Error 2
gmake: *** [all] Error 2
我不确定我的错误是在依赖生成中,还是在更底层的部分,比如对象生成目标?
如果您需要更多信息,请告诉我,我会添加到帖子中
【问题讨论】:
-
您是否尝试过使用
-d选项运行 gmake 以查看它在做什么?
标签: sed dependencies makefile redhat gnu-make