我需要以递归方式查找目录列表中的所有头文件。我无法弄清楚如何正确地逃避命令。我一直在搜索并发现有关在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命令中的'\'字符而没有成功。
非常感谢任何帮助。
答案 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))