代码之家  ›  专栏  ›  技术社区  ›  Ciro Santilli OurBigBook.com

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

  •  0
  • Ciro Santilli OurBigBook.com  · 技术社区  · 6 年前

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

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

    只需要一个简单的脚本:

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

    不改变剧本?

    AddOption + env.Append(CCFLAGS 但我想知道,如果不更改代码来显式地支持它,这是可能的。

    1 回复  |  直到 6 年前
        1
  •  1
  •   dirkbaechle    6 年前

    这在设计上是不可能的(没有显式地更改构建脚本)。从我们最常问的问题的答案到 FAQ

    SCons不会自动传播使用的外部环境 对用于生成目标文件的命令执行“scons”。这是 因此,无论 在调用scons时设置的环境变量。这也是 意思是如果编译器或其他命令 生成目标文件不在标准系统位置,SCons 除非显式设置路径以包含 位置。

        2
  •  0
  •   Ciro Santilli OurBigBook.com    5 年前

    我最终选择了:

    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倾向于只使用最后一个被视为实际值的值。

    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