允许make文件中的通配符

时间:2017-11-21 05:54:32

标签: c++ makefile cmake gnu-make automake

我有一个在Windows和Linux上运行的应用程序。 它有一个在运行时生成的make文件。 现在的问题是make文件指向文件夹路径,它有@#$%等特殊字符!作为一些道路。

但是因为这些人物有不同的含义 例如,$搜索其定义     #参考评论

编译失败。

你对此有什么决议吗? 提前致谢

3 个答案:

答案 0 :(得分:0)

在数字前面使用反斜杠,所以在它们之前使用\,如下所示:\#

答案 1 :(得分:0)

如果要在 Makefile 中生成文字文件名:

# This won't work
OBJECTS := D:/PR/9354/lib_15_#$@%&/submodels/win32-gcc/CONS00_ABHI_REV‌​15.o
$(info [${OBJECTS}])

AFAICS您必须在 make 中处理的唯一特殊字符是$#

$总是引入宏扩展。 解决办法是将所有美元加倍: $$扩展为名为$的变量值$

#发表评论。 替换为\#

# This works
OBJECTS := D:/PR/9354/lib_15_\#$$@%&/submodels/win32-gcc/CONS00_ABHI_REV‌​15.o
$(info [${OBJECTS}])

如果您从调用$(wildcard ...)获取文件名,请说 你不必担心上述情况。

但是,你的shell肯定会被所有这些字符搞糊涂。 例如,$导致 bash 上的参数扩展,& bash 等后台运行命令。

这里最安全的做法是在调用shell之前引用所有文件名。 如果您的shell是 bash ,则使用单引号'包围每个文件名。 如果您使用的是Windows shell( cmd ),则必须使用双引号。 (如果您使用 cmd ,由于其疯狂的引用规则,您的生活将是地狱。)

所以,假设 bash

$ cat Makefile
OBJECTS := D:/PR/9354/lib_15_\#$$@%&/submodels/win32-gcc/CONS00_ABHI_REV‌​15.o
QUOTED := $(patsubst %,'%',${OBJECTS})

.PHONY: all
all:
    echo ${QUOTED}

$ make --warn
echo 'D:/PR/9354/lib_15_#$@%&/submodels/win32-gcc/CONS00_ABHI_REV‌​15.o'
D:/PR/9354/lib_15_#$@%&/submodels/win32-gcc/CONS00_ABHI_REV‌​15.o

啧。

修改

最简单的方法当然是避免使用 make 的解析器, 并使用$(file …)简单地阅读未经检验的文件名。

$ cat names
D:/PR/9354/lib_15_#$@%&/submodels:=/win32-gcc/CONS00_ABHI_REV‌​15.o

$ cat Makefile
OBJECTS := $(file < names)

.PHONY: all
all:
        echo $(patsubst %,'%',${OBJECTS})

$ make
echo 'D:/PR/9354/lib_15_#$@%&/submodels:=/win32-gcc/CONS00_ABHI_REV‌​15.o'
D:/PR/9354/lib_15_#$@%&/submodels:=/win32-gcc/CONS00_ABHI_REV‌​15.o

@Vroomfondel指出,该名称甚至包括有问题的:=

答案 2 :(得分:0)

一旦make在其特殊含义是允许的解析解决方案的行中找到像#:$这样的文字字符,它就会解释它们。你最好的办法是修改makefile的生成器,并重写路径名的输出过滤器,将所有这些字符替换为&#34; defused&#34;引用序列。避免这种情况的另一种方法是预处理makefile并替换有问题的外观,但我认为这比更改文件名输出要困难得多。 在任何情况下,您需要在makefile中使用一些额外的变量定义作为引用结构:

space := $(strip) $(strip)#
comma := ,#
hash := \##
percent := %#
colon := :#
equal := =#
paropen := (#
parclose := )#
像往常一样,{p> $$$转义。这可以让你现在定义各种令人讨厌的字符串:

evilstring := $(space)D$(colon)/PR/9354/lib_15_$(hash)$$@$(percent)&/etc...

虽然其他答案是正确的,但在变量分配中只需要转义$#,我不知道您的生成器是否会在其他位置插入文件名:

类似

 D:\home\myfile.o: 

 \home\lib_1_&=@!\myfile.o:

因为目标名称可能会导致问题。

你可能想看看现在甚至有全局匹配的gmtt(例如$(call glob-match,$(shell uname -sr),Linux 4.[7-9].*)),尽管这可能对你的问题没有帮助。