2013-07-31 119 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 

我知道這不是一個完整的答案,但也許一鼓勵它實際上是可能的。但我同意其他海報,如果你真的可以完全避免空間,你會有一個更輕鬆的生活!

相關問題