2013-07-31 71 views
4

因此,一些匿名开发者已经决定在他们的文件夹名称中使用包含源文件的空间的荒谬惯例。我会改变这些文件夹不要使用空格,但很遗憾我不会在这里制定规则,所以这不是一个选项(尽管我希望是这样)。如何在我的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 "[email protected]" 

.PHONY: all 

简单的Makefile。它所要做的就是编译我所有的Lua文件,并将它们放到输出目录中。

无论我做它不断想拆就文件夹中的空格SOURCE字符串,所以我有一个美丽的错误是这样结尾:

make: *** No rule to make target `stupid/naming ', needed by `all'. Stop. 

是有办法解决这一问题不重新命名文件夹?

在此先感谢。

+0

唧你试过'\\'而不是'\'?例如'愚蠢/命名\\ convention/a.lua' – lifus

+0

这给了我:'make:***没有规则来制作'all'所需的'stupid/naming'目标。 Stop.' – OLL

+0

这看起来像是一个重复的问题给我。看到这个问题: http://stackoverflow.com/questions/9838384/can-gnu-make-handle-filenames-with-spaces – Chris

回答

0

Unfortunately, GNU Make's functions that deal with space-separated list do not respect the escaping of the space。唯一的例外是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 "[email protected]"" 

.PHONY: all 

我试图输出它第一这样的:

%.luac: %.lua 
    @echo "$<" 
    @echo "[email protected]"" 

输出如下:

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 
2

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

是的,这是勉强可以创建一个makefile,将包含空格的文件名的工作,但你实际上需要重写了所有的makefile,你将不能够使用许多GNU的特点这样你的makefile就会很长,很难阅读,而且很难维护。

只要告诉他们克服自己。或者如果他们真的不能,请尝试让他们在路径名中创建其工作空间,而名称中没有任何空格,然后创建一个包含指向实际工作空间的空白符号的符号链接(其他方式在所有情况下都不起作用)。

+0

虽然我宁愿避免使用空格,但它根本不是一个选项: (..你说的是“一个不同的构建工具”..你知道任何可以轻松处理空间的替代构建工具吗?如果这是需要的,我会很乐意学习另一个构建工具 – OLL

+0

有很多不同的构建工具但我不熟悉它们,所以我不能告诉你哪些流行/仍然支持,哪些是可移植的,哪些可以处理文件名中的空白。还有特性考虑(并行构建,递归/非递归,效率等)你可以使用谷歌的术语,比如“gnu make alternatives”等。我知道的一些包括scons,cook,bras,ant。我所知道的全部是他们的名字。 – MadScientist

0

如果你看这个优秀的写作:http://www.cmcrossroads.com/article/gnu-make-meets-file-names-spaces-them,作者建议,这主要是一项艰巨的任务。但是如果你真的无法避开这些空间,他的替代功能可能会让你走。

投入你的makefile这应该是这样的(对不起,如果我改变了一些你的路,但是这个工作对我的Cygwin安装):

LUAC   = luac 

s+ = $(subst \\ ,+,$1) 
+s = $(subst +,\ ,$1) 

SRC_DIR = . 
SOURCE := stupid/naming\\ convention/a.lua 
SOURCE := $(call s+,$(SOURCE)) 

vpath .lua $(SRC_DIR) 

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

all: $(call +s,$(OUTPUT)) 

$(OUT_DIR)/%.luac: %.lua 
    $(LUAC) "$<" 
    mv luac.out "[email protected]" 

.PHONY: all 

我知道这不是一个完整的答案,但也许一鼓励它实际上是可能的。但我同意其他海报,如果你真的可以完全避免空间,你会有一个更轻松的生活!

相关问题