使用GNU Make 3.81。这个Makefile有一些重复的规则,我觉得可以简化,但是我不知道该怎么做。
如果目录不存在,Makefile需要解压缩tarball。然后,应将我在tarball中的源文件版本复制到tarball中,然后运行configure并对其进行生成以生成目标二进制文件。
BLARG = blarg-1.8.6
blarg: $(BLARG)/get_key.c $(BLARG)/grab_key.c $(BLARG)/keys.c $(BLARG)/options.c $(BLARG)/blarg.c
cd $(BLARG) && ./configure --disable-guile && $(MAKE) && cp blarg ../
$(BLARG):
cp /pub/tars/$(BLARG).tar.gz .
tar -xvf $(BLARG).tar.gz
rm $(BLARG).tar.gz
$(BLARG)/get_key.c: get_key.c | $(BLARG)
cp $< $@
$(BLARG)/grab_key.c: grab_key.c | $(BLARG)
cp $< $@
$(BLARG)/keys.c: keys.c | $(BLARG)
cp $< $@
$(BLARG)/options.c: options.c | $(BLARG)
cp $< $@
$(BLARG)/blarg.c: blarg.c | $(BLARG)
cp $< $@
$(BLARG)/options.h: options.h | $(BLARG)
cp $< $@
我觉得应该有一种方法可以做这样的事情:
BLARG = blarg-1.8.6
SRCS = $(addprefix $(BLARG)/,get_key.c grab_key.c keys.c options.c options.h blarg.c)
blarg: $(SRCS)
cd $(BLARG) && ./configure --disable-guile && $(MAKE) && cp blarg ../
$(BLARG):
cp /pub/tars/$(BLARG).tar.gz .
tar -xvf $(BLARG).tar.gz
rm $(BLARG).tar.gz
$(SRCS): $($@=$(BLARG)/%=%) | $(BLARG)
cp $< $@
但是,这给了我以下错误:
cp blarg-1.8.6/get_key.c
cp: missing destination file operand after `blarg-1.8.6/get_key.c'
有什么建议吗?
答案 0 :(得分:4)
此:
$(SRCS): $($@=$(BLARG)/%=%) | $(BLARG)
cp $< $@
不能按预期工作。 The automatic variable $@
isn't available in the prerequisite field,因此整个术语扩展为零,因此$<
扩展为零,因此命令发出:
cp DEST
我建议改用static pattern rule:
$(SRCS): $(BLARG)/%.c: %.c | $(BLARG)
cp $< $@
PS 。您还可以简化$(BLARG)
规则。默认情况下,tar
将压缩包解压缩到工作目录中,因此无需复制,解压缩然后删除:
$(BLARG):
tar -xvf /pub/tars/$(BLARG).tar.gz