如何在makefile shell函数中转义反斜杠

时间:2017-09-07 18:50:17

标签: makefile escaping gnu-make

我需要以递归方式查找目录列表中的所有头文件。我无法弄清楚如何正确地逃避命令。我一直在搜索并发现有关在makefile中逃逸的各种信息,但我无法解决这个问题。

在bash中,以下内容符合我的要求:

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

在我的make文件中,我尝试了一些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命令中的'\'字符而没有成功。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

您的问题与make或INCLUDE_PATHS的值或make如何解释反斜杠字符无关。问题是你没有逃脱你的全局,它匹配一些本地文件。重写你的函数以转义你的glob语句,如下所示:

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

如果原始命令在bash中没有引用这些字符,如果你从包含与make相同内容的同一目录中运行它,我会感到非常惊讶。

答案 1 :(得分: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)

make运行此Makefile将显示您想要的答案。

答案 2 :(得分:0)

尽管MadScientist已经完美地回答了这个问题,但您可以使用以下内容来完全避免shell:

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))