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
在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