基于 COM 的 COMSTR

COMSTR based on COM

如何从 COM 生成 COMSTR 以包含正在执行的完整命令。例如:

env = Environment(CPPPATH='/opt/foo:/opt/bar')
print(env['CXXCOM'])
env['CXXCOMSTR'] = 'fizz\n$CXXCOM\nbuzz'
env.Object('a.cpp')

打印

$CXX -o $TARGET -c $CXXFLAGS $CCFLAGS $_CCCOMCOM $SOURCES
fizz
g++ -o a.o -c     $( -I/opt/foo -I/opt/bar $) a.cpp
buzz

当第 3 行预期 g++ -o a.o -c -I/opt/foo -I/opt/bar a.cpp 时。获得预期输出的最简单方法是什么?

有一个接受的答案,类似于 env['CXXCOMSTR'] = 'fizz\n$CXXCOM\nbuzz' 行不通,另一个答案说 Scons 没有内置任何东西。

我在 Centos 7 上使用带有 Python 2.7 的 Scons 3.0.1。

如果您阅读联机帮助页,您会发现“$(”和“$)”被插入到命令字符串中,以告诉 SCons 在生成命令签名时不要使用它们之间的任何内容。此签名用于确定自上次构建以来它是否已更改,如果已更改则重新构建。

因此,对于上面的示例,您必须追踪哪个变量引入了 $(。可能是它的 _CPPINCFLAGS 并在没有它的情况下重建 CXXCOM。

或者您可以创建一个可调用的 class 并为其设置一个 Environment() 变量,然后执行如下操作:

env['CXXCOMSTR'] = 'fizz\n${SANITIZE($CXXCOM)}\nbuzz'

在联机帮助页中搜索 "Variable Substitution" 以获取示例:https://scons.org/doc/production/HTML/scons-man.html

在您的函数中,您需要调用 env.subst(the_argument) 参见:https://scons.org/doc/production/HTML/scons-man.html#f-subst