首页 > 解决方案 > 用 MAKEFLAGS 覆盖包含空格的 make 变量

问题描述

我有一个 bash 脚本来通过 Include-What-You-Use (IWYU) 运行我的基于 Makefile 的项目,如下所示:

#!/bin/bash
export MAKEFLAGS="-k CXX=iwyu -Xiwyu --transitive_includes_only -Xiwyu --mapping_file=qt5_4.imp"
build.sh

build.sh脚本设置了几个环境变量,准备构建环境的其他部分,然后最终运行make

乍一看,这似乎有效并完成了它的工作。然而更仔细的检查表明,这只CXX=iwyu在构建中实际使用。IWYU 的命令行选项被删除。

我尝试了各种修改我的调用来解决这个问题,但似乎没有一个可以解决问题。

export MAKEFLAGS="-k CXX=iwyu\ -Xiwyu\ --transitive_includes_only\ -Xiwyu\ --mapping_file=qt5_4.imp"

命令行选项不再被丢弃,但现在突然-k似乎被丢弃在某个地方,我的构建(因为缺少-k)因失败而提前终止。

export MAKEFLAGS="-k CXX='iwyu -Xiwyu --transitive_includes_only -Xiwyu --mapping_file=qt5_4.imp'"

我被淹没了/bin/sh: 1: Syntax error: Unterminated quoted string,看起来结局'不知何故被丢弃了。

还有其他方法我必须逃避和/或引用我的空格export来解决这个问题吗?

标签: bashmakefile

解决方案


你可以创建一个脚本(一次?)来运行iwyu——注意,单引号和双引号不能互换:

echo 'iwyu -Xiwyu --transitive_includes_only -Xiwyu --mapping_file=qt5_4.imp "$@"' > ./run.iwyu
chmod +x ./run.iwyu

然后运行:

make -k CXX="$PWD/run.iwyu"

或者:

export MAKEFLAGS="-k CXX=$PWD/run.iwyu"

这回避了参数中空格的整个问题。如图所示,您指定run.iwyu脚本的完整路径以防您的make进程更改目录。如果您将run.iwyu脚本放在您的目录中PATH,则无需指定脚本的完整路径。如果您愿意,可以在脚本中的命令行前加上前缀exec


推荐阅读