代码之家  ›  专栏  ›  技术社区  ›  T Lytle

如何简化makefile(gnu make)中的重复规则

  •  1
  • T Lytle  · 技术社区  · 6 年前

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

    如果目录不存在,则MaxFi文件需要解包TAG。然后,它应该将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'
    

    有什么建议吗?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Beta    6 年前

    这:

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

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

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