我正在尝试使用以下 Makefile 语法从头文件之一解析字符串:-
CONV := $(HOST_TOOLSBIN)/mdConvert.exe --abi-version "$$(PERL) -nle 'print $$1 if /#define\s+TEST_LATEST\s+(\S+)/' $(ELF_DIR)/elf.h"
我面临问题:-
shell fatal : Terminator character '"' expected
从日志中我可以看到命令:-
bin/mdConverter.exe --abi-version "$(PERL) -nle 'print $1 if /
奇怪的是,在/
之后没有考虑任何事情。
基本上我的文件
$(ELF_DIR)/elf.h
有以下行:-
#define TEST_LATEST 7U // latest abi version
我需要获取动态的
7U
字符串,明天它可能会增加到8U
。我需要将参数 7U
传递给可执行文件 mdConvert.exe
,如上面命令所示。我做了很多步道,但没有任何效果。有什么建议吗?注意:- 我不想使用 --abi-version
或
sed
,因为我在 Windows 机器上遇到问题。我的 makefile 必须在 Linux 和 Windows 上运行。grep
text...
$(info
函数,
记录在 手册:8.13 控制 Make 的函数$(信息文本...)
此函数只不过将其(扩展的)参数打印到标准输出。 不添加 makefile 名称或行号。这个函数展开的结果 是空字符串。
使用此 makefile:
)
我可以看到:
$ cat Makefile
CONV := $(HOST_TOOLSBIN)/mdConvert.exe --abi-version "$$(PERL) -nle 'print $$1 if /#define\s+TEST_LATEST\s+(\S+)/' $(ELF_DIR)/elf.h"
$(info CONV is [${CONV}])
all:
这表明分配给
$ make
CONV is [/mdConvert.exe --abi-version "$(PERL) -nle 'print $1 if /]
make: Nothing to be done for 'all'.
的值在
CONV
之后被无意地截断,
使孤独的/
不平衡。因此出现错误:"
发生这种情况是因为
shell fatal : Terminator character '"' expected
之后的行的其余部分以
/
开头,在 GNU makefile 中是注释的开始。要告诉 Make #
是字面的
#
字符,您必须使用前面的 #
对其进行转义。
如果您进行更正:\
那么
$ cat Makefile2
CONV := $(HOST_TOOLSBIN)/mdConvert.exe --abi-version "$$(PERL) -nle 'print $$1 if /\#define\s+TEST_LATEST\s+(\S+)/' $(ELF_DIR)/elf.h"
$(info CONV is [${CONV}])
all:
的值就不会被截断:
CONV
然后,有效的正则表达式命令行将被传递给 perl,这可能会也可能不会达到预期的效果。