Bash 使用MAKEFLAGS重写包含空格的make变量

Bash 使用MAKEFLAGS重写包含空格的make变量,bash,makefile,Bash,Makefile,我有一个bash脚本来运行基于Makefile的项目,包括您使用的IWYU,如下所示: #!/bin/bash export MAKEFLAGS="-k CXX=iwyu -Xiwyu --transitive_includes_only -Xiwyu --mapping_file=qt5_4.imp" build.sh sh脚本设置两个环境变量,准备构建环境的其他部分,然后最终运行make 乍一看,这似乎起了作用,并完成了它的工作。然而更仔细的检查表明,构建中实际上只使用

我有一个bash脚本来运行基于Makefile的项目,包括您使用的IWYU,如下所示:

#!/bin/bash
export MAKEFLAGS="-k CXX=iwyu -Xiwyu --transitive_includes_only -Xiwyu --mapping_file=qt5_4.imp"
build.sh
sh脚本设置两个环境变量,准备构建环境的其他部分,然后最终运行make

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

我尝试了对我的呼叫进行各种修改来解决这个问题,但是似乎没有一个能解决这个问题

命令行选项不再被删除,但是现在突然间-k似乎在某个地方被删除了,我的构建因为缺少-k而提前终止并失败

我被/bin/sh:1:Syntax error:Unterminated quoted string淹没了,它看起来像结尾“不知何故被删除了”


是否有其他方法可以转义和/或引用导出中的空格来修复此问题?

您可以创建一次脚本?要运行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"
或:


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

可以创建一次脚本吗?要运行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"
或:


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

您可以只导出CXX='iwyu-Xiwyu-transitive\u includes_only-Xiwyu-mapping\u file=qt5_4.imp'并在makefile中使用${CXX}吗?@Philippe-环境中的设置是否覆盖了makefile中的设置,如果您这样做?@JonathanLeffler如果CXX是在makefile中设置的,我们可以使用CXX2作为例子,并在makefile中测试它以将其设置为CXX吗?@Philippe-您可能可以像使用GNU Make那样使用系统,但不能使用经典的非GNU Make。“传递MAKEFLAGS”技术有时是最好的方法。这是在原始make到子make进程中中继命令行选项的问题。按照我的建议使用脚本可以避免引用的问题;中继仍然是问题的一部分。@Philippe我的重点是试图解决这个命令行参数/空格问题,这就是为什么我说它是基于Makefile的。但是,老实说,这些Makefiles当前是用Qt的qmake生成的,我没有任何直接的方法来更改它们。您可以只导出CXX='iwyu-Xiwyu-transitive_includes_only-Xiwyu-mapping_file=qt5_4.imp'并在Makefiles中使用${CXX}吗?@Philippe-环境中的设置是否覆盖了makefile中的设置,如果您这样做?@JonathanLeffler如果CXX是在makefile中设置的,我们可以使用CXX2作为例子,并在makefile中测试它以将其设置为CXX吗?@Philippe-您可能可以像使用GNU Make那样使用系统,但不能使用经典的非GNU Make。“传递MAKEFLAGS”技术有时是最好的方法。这是在原始make到子make进程中中继命令行选项的问题。按照我的建议使用脚本可以避免引用的问题;中继仍然是问题的一部分。@Philippe我的重点是试图解决这个命令行参数/空格问题,这就是为什么我说它是基于Makefile的。但是,老实说,这些make文件目前是用Qt的qmake生成的,我没有任何直接的方法来更改它们。好吧,这不是我问题的答案,而是我问题的解决方案:-所以,是的,放弃与make的斗争并最终这样做可能是我能得到的最好的解决方案。这真的很奇怪。我尝试了使用iwyu的包装器脚本的方法,但仍然失败了。在第一次调用ar命令时,由于返回的错误突然不再被忽略,make aborts,-k似乎丢失。我发现在我的脚本之后添加一个无用的-Xiwyu可以解决这个问题:export-MAKEFLAGS=-k CXX=$PWD/run.iwyu-xiwyuhmm……这很棘手。其基本思想是通过MAKEFLAGS设置避免在单个参数中使用空格。我编写了makecxx=$PWD/run.iwyu;我省略了a-k make-k CXX=$PWD/run.iwyu-你也犯了这个错误吗?如果是这样,我为我的疏忽道歉。我的MAKEFLAGS=-kcxx=$PW/run.iwyu中有-k,所以我认为这应该没问题。与此同时,我发现更多的w
埃迪内斯。将-xy形式的任何内容作为参数添加到run.iwyu可以解决此问题。参数未传递给run.iwyu,但错误再次被正确忽略。仅添加一个参数参数不起作用,-i带单个字符的双破折号不起作用。但是任何像-abcde,-Wasdf,-iii这样的东西似乎都能起作用。好吧,这不是我问题的答案,而是我问题的解决方案:-所以,是的,放弃与make的斗争,最终以这种方式去做可能是我能得到的最好的解决方案。这真的很奇怪。我尝试了使用iwyu的包装器脚本的方法,但仍然失败了。在第一次调用ar命令时,由于返回的错误突然不再被忽略,make aborts,-k似乎丢失。我发现在我的脚本之后添加一个无用的-Xiwyu可以解决这个问题:export-MAKEFLAGS=-k CXX=$PWD/run.iwyu-xiwyuhmm……这很棘手。其基本思想是通过MAKEFLAGS设置避免在单个参数中使用空格。我编写了makecxx=$PWD/run.iwyu;我省略了a-k make-k CXX=$PWD/run.iwyu-你也犯了这个错误吗?如果是这样,我为我的疏忽道歉。我的MAKEFLAGS=-kcxx=$PW/run.iwyu中有-k,所以我认为这应该没问题。与此同时,我发现了更奇怪的事情。将-xy形式的任何内容作为参数添加到run.iwyu可以解决此问题。参数未传递给run.iwyu,但错误再次被正确忽略。仅添加一个参数参数不起作用,-i带单个字符的双破折号不起作用。但任何像-abcde,-Wasdf,-iii这样的东西似乎都能奏效。
export MAKEFLAGS="-k CXX=$PWD/run.iwyu"