在 makefile 中运行 perl oneliner

问题描述 投票:0回答:1

我正在尝试使用以下 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 上运行。
    

makefile gnu-make
1个回答
0
投票
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,这可能会也可能不会达到预期的效果。

© www.soinside.com 2019 - 2024. All rights reserved.