2017-09-07 130 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))