【问题标题】:How to Simplify Repeated Rules in Makefile (GNU Make)如何简化 Makefile 中的重复规则(GNU Make)
【发布时间】:2018-12-28 03:51:27
【问题描述】:

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

如果目录不存在,Makefile 需要解压 tarball。然后它应该将我在 tarball 中的源文件版本复制到 tarball 中,然后对其运行 configure 和 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'

有什么建议吗?

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    这个:

    $(SRCS): $($@=$(BLARG)/%=%) | $(BLARG)
        cp $< $@
    

    无法按您的意愿工作。 The automatic variable $@ isn't available in the prerequisite field,所以整个术语扩展为空,所以$&lt; 扩展为空,所以命令出来了:

    cp DEST
    

    我建议改为static pattern rule

    $(SRCS): $(BLARG)/%.c: %.c | $(BLARG)
        cp $< $@
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-31
      • 2011-10-28
      • 1970-01-01
      • 2022-12-02
      • 1970-01-01
      相关资源
      最近更新 更多