如何在不使用自定义代码的情况下从命令行传递带有Scons的任意编译器CFLAGS?

时间:2018-08-20 10:42:41

标签: scons

有没有办法写这样的东西:

scons CFLAGS='-fsanitize=address -fsanitize=thread'

只需一个最小的脚本即可

env = Environment()
env.Program(target='main.out', source=['main.c'])

不更改该脚本?

我知道如何通过使用AddOption + env.Append(CCFLAGS修改脚本来做到这一点,但我想知道是否有可能在不更改代码的情况下明确支持它。

2 个答案:

答案 0 :(得分:1)

这在设计上是不可能的(无需显式更改构建脚本)。从我们的FAQ中最常见的问题的答案#1:

  

SCons不会自动传播所使用的外部环境   对用于生成目标文件的命令执行“ cons”。这是   这样一来,无论   调用scons时设置的环境变量。这也是   表示如果要使用的编译器或其他命令   建立目标文件不在标准系统位置,SCons   将不会找到它们,除非您明确设置PATH以包括这些   位置。

答案 1 :(得分:0)

我最终选择了:

env = Environment()
env.Append(CCFLAGS='-Werror')
env.Append(CCFLAGS=ARGUMENTS.get('CCFLAGS', ''))
env.Program(target='main.out', source=['main.c'])

可以用作:

scons CCFLAGS='-Wall -pedantic'

,并将编译为:

gcc -o main.o -c -Werror -Wall -pedantic main.c

您可能希望保留env.Append(CCFLAGS=ARGUMENTS.get('CCFLAGS', ''))行作为对CCFLAGS所做的最后一次更改,因为这将允许覆盖命令行上的默认值:GCC倾向于仅使用显示为实际的。

TODO:如何使其与变量一起使用?这样会更好,因为我们可以获得更多的错误检查和帮助消息的生成:

variables = Variables(None, ARGUMENTS)
variables.Add('CCFLAGS', 'my help', '')
env = Environment(variables)
env.Append(CCFLAGS='$CCFLAGS')
env.Append(CCFLAGS=['-Werror'])
env.Program(
    source=['main.c'],
    target='main.out',
)
Help(variables.GenerateHelpText(env))

但是由于引用错误而失败:

gcc -o main.o -c "-Wall -pedantic" -Werror main.c