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

如何在makefile shell函数中转义反斜杠,makefile,escaping,gnu-make,Makefile,Escaping,Gnu Make,我需要递归地查找目录列表中的所有头文件。我不知道如何正确地逃脱命令。我四处搜索,在makefiles中找到了各种关于转义的信息,但我一直无法解决这个问题 在bash中,以下内容符合我的要求: find path1 path2 path3 -type f \( -name *.hpp -o -name *.h -o *.hxx \) 在我的make文件中,我尝试了foreach等的几种组合。目前我有: INCLUDE_PATHS ?= path1 path2 path3 MY_HEADERS :

我需要递归地查找目录列表中的所有头文件。我不知道如何正确地逃脱命令。我四处搜索,在makefiles中找到了各种关于转义的信息,但我一直无法解决这个问题

在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命令中的'\'字符,但没有成功


任何帮助都将不胜感激。

通过调用
$($INCLUDE\u path)
--not$(INCLUDE\u path),变量MY\u HEADERS将变得正确。 因此,您的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将显示您想要的答案。

您的问题与make或
INCLUDE\u路径的值或make如何解释反斜杠字符无关。问题是您没有转义全局搜索,而是与一些本地文件相匹配。请重写函数以转义我们的全球声明如下:

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

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

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

哎呀…我的意思是标题中的反斜杠。我之前的评论是关于我原来问题中的一个输入错误,我已经更正了。你在查找路径上的工作不是解决方案或相关的。如果我在那里放一条路径,而不是引用make变量,我仍然会得到相同的结果。问题在于传递多个名称选项,这需要e(…)个字符可以正确地传递给shell。换句话说,这
MY\u头:=$(shell查找$(包括路径)-键入f-name*.hpp))
工作正常。是否“转义反斜杠”“或不是你获得初步结果的原因。在Makefile中,除了有不同的变量调用约定外,我们嵌入了相同的find命令。顺便说一句,您应该这样做:
INCLUDE\u PATHS?=“path1 path2 path3”
(添加了单引号)呃。。。嗯?<代码>$($INCLUDE\u路径)
绝对是错误的。这应该做什么?我有一个相关的问题:在配方中,我需要使用带有-t选项的sort命令来指定字段分隔符作为选项卡。但是
sort-t'\t'
在传递给sort时失败(“sort:multi-character tab'\\t'”。如何在shell命令选项中转义反斜杠?这与make也没有关系:如果尝试此操作,则如果从shell提示符运行命令,而不是在配方中运行命令,则会出现相同的错误。
排序
手册页中没有任何内容表明它知道如何将两个字符的字符串
\t
转换为制表符,以及事实上,您收到的错误表明并非如此。它认为您正在尝试将分隔符设置为两个字符序列反斜杠-
t
。使用Google了解如何使用TAB作为带有
sort
的分隔符,我发现:这似乎是正确的。