bash脚本的执行结果,如何在Buildroot中定义局部变量

How to define local variable in Buildroot which is an execution result of bash script

netmap/LINUX/configure中有一个名为BUILDDIR的局部变量,其值为BUILDDIR=$PWD。它应该被重定向到$(@D),这是netmap包构建目录, /usr/local/buildroot/output/build/netmap-master 在我的例子中;否则,目标文件将输出到 buildroot 根目录。

我创建了一个名为NETMAP_CURRENT_BUILD的变量,让它成为/usr/local/buildroot/output/build/netmap-master,$(@D), 然后我想将 BUILDDIR=$PWD 替换为 BUILDDIR=/usr/local/buildroot/output/build/netmap-master。通过使用以下示例代码,无法完成。

示例代码:(sed 部分在终端控制台运行良好)

    define NETMAP_BUILD_CMDS
    NETMAP_CURRENT_DIR = $(sed -e 's/\//\\//g' <<< "$(@D)")   --   empty
    echo "$$(sed -e 's/\//\\//g' <<< "$(@D)")"               -- this line works fine
...
    sed -e 's/BUILDDIR=$$PWD/BUILDDIR=$(NETMAP_CURRENT_DIR)/g' -i $(@D)/LINUX/configure     
(double $$PWD, it has to be like this, which means string $PWD is needed rather than its value.)
    ...
        endef

你实际上并不需要这个,见下文。但是,如果您确实需要 make 变量中的 shell 命令的结果,请使用 $(shell ...)

由于这是一个 makefile,$ 由 make 解释,而不是由 shell 解释。因此,make 将尝试将 sed -e 's/\//\\//g' <<< "$(@D)" 计算为变量名。当然没有那个名字的变量,所以你得到一个空字符串。

要让 make 运行 成为 shell 命令并将结果存储在 make 变量中,请使用 $(shell ...) 函数。所以

NETMAP_CURRENT_DIR = $(shell sed -e 's/\//\\//g' <<< "$(@D)")

请注意,这应该在 NETMAP_BUILD_CMDS 外部 完成,因为 NETMAP_BUILD_CMDS 的内容实际上是一个 shell 脚本: make 首先扩展该脚本中的所有变量,然后将其逐行传递给 shell。 shell 实际上会在上面的语句中出错,因为 = 周围有空格,所以 NETMAP_CURRENT_DIR 被解释为命令名称。

如果要将结果存储在 shell 变量而不是 make 变量中,那么最简单的解决方案是使用反引号 `...` 来分隔命令而不是 $(...):

define NETMAP_BUILD_CMDS
        NETMAP_CURRENT_DIR=`sed -e 's/\//\\//g' <<< "$(@D)"`; \
        sed -e 's/BUILDDIR=$$PWD/BUILDDIR=$$NETMAP_CURRENT_DIR/g' -i $(@D)/LINUX/configure
endef

但是,在你的情况下你根本不需要这个。

首先,你可以直接在make.

中做简单的替换
NETMAP_CURRENT_DIR = $(subst /,\/,$(@D))

更好的是,您可以在 sed 表达式中使用与 / 不同的分隔符,这样就不需要引用它了:

sed -e 's@BUILDDIR=$$PWD@BUILDDIR=$(@D)@g' -i $(@D)/LINUX/configure

最后一点:像这样修改代码在 NETMAP_POST_PATCH_HOOKS 中比在 NETMAP_BUILD_CMDS 中更好。所以最后,最好的解决办法是:

define NETMAP_FIX_BUILDDIR
        sed -e 's@BUILDDIR=$$PWD@BUILDDIR=$(@D)@g' -i $(@D)/LINUX/configure
endef
NETMAP_POST_PATCH_HOOKS += NETMAP_FIX_BUILDDIR