【问题标题】:Capturing filenames including parentheses with GNU Make's wildcard function使用 GNU Make 的通配符函数捕获包含括号的文件名
【发布时间】:2013-06-17 13:19:55
【问题描述】:

我将使用 Makefile 从一组数据目录中渲染一些绘图以并行化该过程,但在使用通配符函数转义文件名时遇到问题。

这是我的 Makefile 的标题:

SOURCE_DIR = ./results
SOURCES = $(wildcard $(SOURCE_DIR)/*cpuonly*) $(wildcard $(SOURCE_DIR)/*cudaonly*)
$(warning $(SOURCES))  # for debugging
...

示例目录名称为:

  • blahblah-cpuonly-123
  • blahblah-cudaonly-345
  • blahblah-cpuonly-(123,567)

这里,警告函数的输出只包含没有括号的目录名。 我怎样才能把带括号的也包括在内?

编辑:当然,我可以将文件名更改为不包含括号。但是对于这个问题,我只想知道使用括号是否不可能。

EDIT2:我使用诸如“blablah-cpuonly-(123,567).log”之类的文件名对其进行了测试,输出包括它们!但是,它在执行规则时会导致 shell 语法错误。 :(

【问题讨论】:

    标签: makefile escaping gnu-make


    【解决方案1】:

    我无法重现您的问题(而且我知道括号没有限制):

    $ cat Makefile
    foo := $(wildcard *foo*)
    $(info foo = $(foo))
    all: ;:
    
    $ ls -1 *foo*
    foo
    foo-(bar,baz).bar
    foo.mk
    
    $ make
    foo = foo foo-(bar,baz).bar foo.mk
    :
    

    【讨论】:

    • 它只发生在目录,而不是文件。在您的示例中,“foo-(bar,baz).bar”应该是重现我的问题的目录。对于文件,还有另一个问题:使用$(SOURCES) 变量执行规则时出现shell 语法错误,但从我的问题的角度来看,这超出了范围。
    • 仅供参考,我在 Ubuntu 12.04 LTS 上使用 GNU make 3.81。
    • 啊,我发现只有当名字“)”结尾时才会出现这个问题。如果右括号后有任何其他字符,则问题不会重现。
    • 这看起来像是 GNU make 3.81 中的一个错误。我可以用 GNU make 3.81 重现它,但它可以在 GNU make 3.82 上正常工作。
    猜你喜欢
    • 2019-05-07
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多