代码之家  ›  专栏  ›  技术社区  ›  jfMR

在GNU中保留先决条件的尾部斜杠使3.81

  •  0
  • jfMR  · 技术社区  · 7 年前

    考虑一下这个非常简单的makefile:

    foo: bar/
    

    在此makefile上运行GNU Make 3.81将导致:

    make: *** No rule to make target `bar', needed by `foo'. Stop.
    

    / bar/ .

    --print-data-base or -p 用于打印处理此生成文件的规则的选项:

    $ make -p 2>/dev/null | grep foo:
    foo: bar
    

    酒吧/ . 但是,这个问题在gnumake的较新版本中不存在(例如,4.2.1)。

    如何在gnumake3.81中保留规则先决条件名称中的尾部斜杠?

    0 回复  |  直到 7 年前
        1
  •  3
  •   Stefan Becker    7 年前

    / 似乎不可能,但也许 bar/. 会帮助你吗?它将需要重写所有目录目标,以包括尾随的 /.

    _empty :=
    _space := $(_empty) $(_empty)
    
    .PHONY: bar bar/.
    bar bar/.:
           @echo "$@ -> $(dir $@)"
    
    foo: bar/
    
    foo_quoted: "bar/ "
    
    foo_space: bar/$(_space)
    
    foo_space_quoted: "bar/$(_space)"
    
    BAR = "bar/ "
    
    foo_var: $(BAR)
    
    BAR_DIR = bar/
    
    foo_dir: $(dir $(BAR_DIR))
    
    BAR_SPACE = bar/$(_space)
    
    foo_var_space: $(BAR_SPACE)
    
    foo_dot: bar/.
    
    foo_double: bar//
    

    bar ,也就是说,GNU会将尾随剥离 foo_dot 另一方面,示例的结果是

    $ ./make --version
    GNU Make 3.81
    ...
    $ ./make foo_dot
    bar/. -> bar/
    
    $ make --version
    GNU Make 4.2.1
    ...
    $ make foo_dot
    bar/. -> bar/