makefile - 如何简化 Makefile 中的重复规则 (GNU Make)

标签 makefile gnu-make

使用 GNU Make 3.81。这个 Makefile 有一些重复的规则,我觉得可以简化,但我不知道如何去做。

如果目录不存在,Makefile 需要解压 tarball。然后,它应该将 tarball 中的源文件版本复制到 tarball 中,然后对其运行配置和 make 以生成目标二进制文件。

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'

有什么建议吗?

最佳答案

这个:

$(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 $< $@

P.S.您还可以简化 $(BLARG)规则。默认情况下,tar将 tarball 解压到工作目录中,因此无需复制、解压、删除:

$(BLARG):
    tar -xvf /pub/tars/$(BLARG).tar.gz

关于makefile - 如何简化 Makefile 中的重复规则 (GNU Make),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51432290/

相关文章:

c - 使用不带 makefile 的 make 命令?

android - 总是恢复到旧版本

bash - 许多Shell命令架构

c++ - 如何重写我的 makefile 以便重构我的项目目录?

makefile - 如何让automake不那么难看?

c - 没有规则使目标 '%.o'

linux - 当我们可以编写自己的 makefile 时,为什么还要使用像 Autotools 这样的构建工具?

c - 没有制定目标的规则

makefile - 为什么这个 makefile 无限循环,但只在一台机器上?

makefile - 使用 Makefile 将 PCL(点云库)添加到现有项目