2017-09-07 92 views
1

我需要遞歸查找目錄列表中的所有頭文件。我無法弄清楚如何正確地逃避命令。我搜索了四周,發現了有關在makefiles中轉義的各種信息,但我無法解決此問題。如何在makefile shell函數中轉義反斜線

在bash下面做什麼,我想:

find path1 path2 path3 -type f \(-name *.hpp -o -name *.h -o *.hxx \) 

在我的makefile文件我都試過的foreach的幾個組合等。目前我有這樣的:

INCLUDE_PATHS ?= path1 path2 path3 
MY_HEADERS := $(shell find $(INCLUDE_PATHS) -type f \(-name *.h -o -name *.hpp -o -name *.hxx \)) 

這將產生:

find: paths must precede expression 
Usage: find [-H] [-L] [-P] [path...] [expression] 

如果我只是尋找一個擴展名,如「* .HPP」它工作正常(我假設,因爲\(... \)是 不需要)。

我曾嘗試$的各種組合」,」 \逃脫‘沒有成功的shell命令\’字符。

任何幫助,將不勝感激。

+0

哎呀......我在標題意味反斜槓。 – sjacobs

回答

1

您的問題與make或INCLUDE_PATHS的值或如何解釋反斜槓字符的值沒有任何關係。問題是你沒有逃離你的通配符,而是匹配一些本地文件。重寫你的函數來逃避水珠語句,就像這樣:

MY_HEADERS := $(shell find $(INCLUDE_PATHS) -type f \(-name \*.h -o -name \*.hpp -o -name \*.hxx \)) 

我會感到非常驚訝,如果在bash原來的命令作品,而不引用這些字符,如果從含有相同的內容做出相同的目錄中運行它。

+0

工作。謝謝! – sjacobs

0

變量MY_HEADERS變。正確的,通過調用$($INCLUDE_PATHS) - 不是$(INCLUDE_PATHS) 所以你的Makefile是:

INCLUDE_PATHS ?= path1 path2 path3 
MY_HEADERS := $(shell find $($INCLUDE_PATHS) -type f \(-name *.h -o -name *.hpp -o -name *.hxx \)) 

您可以繼續檢查該變量的值:

all: printme 

printme: 
    @echo $(MY_HEADERS) 

運行這個Makefile的make將顯示您想要的答案。

+0

我以前的評論是關於我原來的問題,我糾正了一個錯字。 – sjacobs

+0

您在查找路徑上的工作不是解決方案或相關。如果我在那裏放置一個單獨的路徑,而不是引用一個make變量,我仍然會得到相同的結果。問題在於傳遞多個名稱選項,這些選項需要將\(... \)字符正確傳遞到shell。換句話說,這個'MY_HEADERS:= $(shell找到$(INCLUDE_PATHS)-type f -name * .hpp)''很好。 – sjacobs

+0

是否「轉義反斜槓」不是您獲得初始結果的原因。在Makefile中,我們嵌入了相同的find命令,除了有不同的變量調用約定。 – popuptoast

0

雖然MadScientist已經回答了這個問題很好,你可以使用下面完全避免外殼:

INCLUDE_PATHS ?= path1 path2 path3 
EXTENSIONS := .h .hpp .hxx 
MY_HEADERS := $(shell find $(INCLUDE_PATHS) -type f \(-name \*.h -o -name \*.hpp -o -name \*.hxx \)) 
$(info $(MY_HEADERS)) 
MY_HEADERS := $(foreach p,$(INCLUDE_PATHS),$(foreach e,$(EXTENSIONS),$(wildcard $(p)/*$(e)))) 
$(info $(MY_HEADERS))