【发布时间】:2020-02-20 08:05:14
【问题描述】:
我正在尝试从我的 bash 脚本运行“make”命令来构建代码。
我可以看到所有参数都已分配并能够显示我正在尝试运行的命令。我看不到该命令有任何问题。但问题是当它尝试通过 bash 脚本运行命令时会失败。
My command is :-./build_script LIC=1 DOCUMNETS=1 PROJECTS="cuda bfm"
解析所有参数并构造make命令的脚本片段:-
makeargs=""
for build_flag do
if [[ "$build_flag " = "PROJECTS="* ]]; then
apps =`echo $build_flag |sed "s/PROJECTS=//" `
makeargs="$makeargs PROJECTS=\"$apps \""
else
makeargs="$makeargs $build_flag"
fi
done
echo "make DCOV=1 $makeargs $maketest"
make DCOV=1 $makeargs $maketest
当我运行脚本时,我可以看到构建命令已经正确构建。
输出:-
make DCOV=1 LIC=1 DOCUMNETS=1 PROJECTS="cuda bfm" run_all
GNUmakefile:16: warning: overriding commands for target `/'
GNUmakefile:19: warning: ignoring old commands for target `/'
make: *** No rule to make target `bfm"'. Stop.
我尝试在build_main 文件夹中的“GNUmakefile”中打印PROJECTS 变量。我可以看到输出:PROJECTS is "bfm。它不会将整个 "cuda bfm" 作为一个完整的字符串。
注意:- 当我尝试运行相同的构建命令时:- make DCOV=1 LIC=1 DOCUMNETS=1 PROJECTS="cuda bfm" run_all 明确它工作正常。
似乎是用 makefile 解释变量的问题。
有什么解决办法吗?请帮忙。 谢谢!
【问题讨论】:
-
看不到您的脚本。添加更多代码,或将代码粘贴到 shellcheck.net 或使用
bash -x build_script ...运行脚本 -
嗨,马克,您可以看到命令生成正确吗? for 循环将解析参数并检查 PROJECTS 字符串并生成构建命令。
-
我看不到足够多的代码来判断问题所在。你在spellcheck.net 上发布了吗?因为,例如这是不正确的
make DCOV=1 $makeargs $maketest,因为您没有双引号"$makeargs"或"$maketest" -
不,我之前没有在 speelcheck.net 上发过帖子。我们将它作为构建命令运行,即 make ...。所以没有必要保持双引号正确?
-
没错,这就是为什么我最初建议在
bash -x下运行并使用shellcheck...
标签: bash shell makefile gnu-make