我有一个 make build 系统,我正试图破译别人写的。当我在 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
我不确定我的错误是在依赖项生成中,还是在更底层的部分,比如对象生成目标?
如果您需要更多信息,请告诉我,我将添加到帖子中