如何处理我的 Makefile 中带有空格的文件?

OLL*_*OLL 7 makefile

因此,一些匿名开发人员决定使用一种荒谬的约定,即在包含其源文件的文件夹名称中使用空格。我会更改这些文件夹以不使用空格,但遗憾的是我没有在这里制定规则,因此这不是一个选项(尽管我希望是这样)。

LUAC            = luac

SRC_DIR         = .
SOURCE          =                                                      \
stupid/naming\ convention/a.lua                                        \
stupid/naming\ convention/very\ annoying/b.lua                         \

vpath .lua $(SRC_DIR)

OUT_DIR         = ../out/
OUTPUT          = $(patsubst %.lua, $(OUT_DIR)/%.luac, $(SOURCE))


all: $(OUTPUT)

$(OUT_DIR)/%.luac: %.lua
    $(LUAC) "$<"
    mv luac.out "$@"

.PHONY: all
Run Code Online (Sandbox Code Playgroud)

简单的生成文件。它要做的就是编译我拥有的所有 Lua 文件并将它们放入输出目录中。

无论我做什么,它一直想SOURCE在文件夹中的空格上拆分字符串,所以我以这样的美丽错误结束:

make: *** No rule to make target `stupid/naming ', needed by `all'.  Stop.
Run Code Online (Sandbox Code Playgroud)

有没有办法在不重命名文件夹的情况下解决这个问题?

提前致谢。

Mad*_*ist 5

非常简短但 IMO 最终正确的答案是 make(不仅仅是 GNU make,而是所有 POSIX 风格的 make 实现)不支持包含空格的路径名。如果您想使用 make,您的“匿名开发人员”根本无法使用它们。如果他们坚持认为这是绝对要求,您应该完全切换到不同的构建工具,这确实支持文件名中的空格。

是的,几乎不可能创建一个可以使用包含空格的文件名的 makefile,但是您基本上必须从头开始重写所有的 makefile,并且您将无法使用 GNU make 的许多功能,因此您的 makefile 将长、难读、难维护。

只是告诉他们克服自己。或者,如果他们真的不能,请尝试让他们在名称中没有任何空格的路径名中创建他们的工作区,然后创建一个包含指向真实工作区的空格的符号链接(相反的方法不适用于所有情况)。


lif*_*fus 1

不幸的是,GNU Make 处理空格分隔列表的函数不考虑空格的转义。唯一的例外是wildcard

编辑:

这是我的解决方法:

LUAC            = luac

SRC_DIR         = .
SOURCE          =                                                      \
stupid/naming\ convention/a.lua                                        \
stupid/naming\ convention/very\ annoying/b.lua                         \

vpath .lua $(SRC_DIR)


OUT_DIR         = ../out/
OUTPUT          = $(patsubst %.lua,%.luac,$(SOURCE))


all: $(OUTPUT)

%.luac: %.lua
    $(LUAC) "$<"
    mv luac.out "$@""

.PHONY: all
Run Code Online (Sandbox Code Playgroud)

我尝试先这样输出它:

%.luac: %.lua
    @echo "$<"
    @echo "$@""
Run Code Online (Sandbox Code Playgroud)

输出如下:

stupid/naming convention/a.lua
../out/stupid/naming convention/a.luac
stupid/naming convention/very annoying/b.lua
../out/stupid/naming convention/very annoying/b.luac
Run Code Online (Sandbox Code Playgroud)