在 Windows 构建系统中运行 GREP 命令

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

我正在尝试读取头文件

elf.h
中的文本,其中包含以下内容:-

#define ELFOSABIV_STDELF_V1          8U      // STD ELF ABI
#define ELFOSABIV_PRE_STDELF         7U      // latest abi version
#define ELFOSABIV_LATEST             6U      // latest abi version

基本上,我对

ELFOSABIV_LATEST
版本感兴趣,即
6U

这是我的 makefile 片段:-

MDCONVERTER := $(HOST_TOOLSBIN)/mdConverter$(EXESUFFIX) --abi-version `$(GREP) -Po '^\#define\s+ELFOSABIV_LATEST\s+\K\S+' $(ELF_DIR)/elf.h`

--mdConverter.exe 的abi-version 参数必须是

6U
上面的 makefile 片段在 Linux 构建系统中工作正常,我在其中获得 grep 命令的输出
6U
。仅在 Windows 上出现此问题。

在Windows构建系统中,它使用

busybox_glob.exe
,这是一个在单个可执行文件中提供多个Unix实用程序的软件套件。这是日志文件中的命令:-

build/busybox_glob.exe grep -Po '^#define\s+ELFOSABIV_LATEST\s+\K\S+' /home/test/utilities/elf/elf.h 

我面临的问题:-

BusyBox v1.25.0-FRP-261-gea341c7 (2015-11-01 15:13:33 GMT) multi-call binary.

Usage: grep [-HhnlLoqvsriwFEz] [-m N] [-A/B/C N] PATTERN/-e PATTERN.../-f FILE [FILE]...

Search for PATTERN in FILEs (or stdin)

    -H  Add 'filename:' prefix
    -h  Do not add 'filename:' prefix
 ....
makefile gnu-make busybox
1个回答
0
投票

大概,使用 Perl 风格的正则表达式 (

grep -P
) 的动力来自于想要从该行中仅提取 ABI 版本号。为此目的,首先选择了有问题的
grep -o
,然后您需要像 Perl 的
\K
这样的东西来将版本号与行的其余部分分开。这依赖于 GNU
grep
实现的特定功能,您的 Windows 构建环境中没有这些功能,并且在其他一些环境中也可能没有这些功能。

在任何情况下,最好首先使用更合适的工具来完成工作。

选项1

由于您正在分析头文件中的宏定义,因此最适合该作业的选择是 C 预处理器。例如,您可以将此测试文件包含在您的发行版中:

elf_version_test.c

#include <elf.h>
ELFOSABIV_LATEST

然后,假设您的 makefile 将

CPP
定义为运行 C 预处理器的命令(例如,如果您使用 gcc,则定义为
gcc -E
),您的 makefile 可能会执行以下操作:

MDCONVERTER := $(HOST_TOOLSBIN)/mdConverter$(EXESUFFIX) \
  --abi-version $$($(CPP) -I$(ELF_DIR) elf_version_test.c | tail -n1)

选项2

如果您决定直接分析标题,那么

sed
将是比
grep
更好的选择。我希望任何旨在提供类 Unix 构建环境的套件在提供的工具中也包含
sed
。看起来可能是这样的:

MDCONVERTER := $(HOST_TOOLSBIN)/mdConverter$(EXESUFFIX) \
  --abi-version $$($(SED) -n '/#define ELFOSABIV_LATEST/ s/^.*LATEST[[:space:]]\+\([^[:space:]]\+\).*/\1/p')

这有点拗口,但它仍然只是一句台词,而且它只使用 POSIX 指定的功能来完成这项工作。

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