Есть ли способ написать что-то вроде:
scons CFLAGS='-fsanitize=address -fsanitize=thread'
который будет работать с минимальным скриптом:
env = Environment()
env.Program(target='main.out', source=['main.c'])
без изменения этого сценария?
Я знаю, как это сделать, изменив сценарий с помощью AddOption
+ env.Append(CCFLAGS
, но мне интересно, что это возможно без изменения кода, чтобы явно поддерживать его.
Это невозможно по замыслу (без явного изменения сценариев сборки). Из ответа на # 1 наиболее часто задаваемых вопросов в нашем Вопросы-Ответы:
SCons does not automatically propagate the external environment used to execute 'scons' to the commands used to build target files. This is so that builds will be guaranteed repeatable regardless of the environment variables set at the time scons is invoked. This also means that if the compiler or other commands that you want to use to build your target files are not in standard system locations, SCons will not find them unless you explicitly set the PATH to include those locations.
Вызов просто env = Environment()
всегда приведет к чистой среде сборки. Затем вам нужно будет добавить / изменить переменные в env
, чтобы ваша фактическая среда сборки была настроена правильно. Я не знаю способа обойти это, не существует метода обход, который работал бы автоматически для некоторого набора «специальных» переменных. И это будет работать против вышеописанной цели - сделать сборку повторяемой при любых условиях для этих «специальных». Итак, если существует способ, о котором я не знаю, его следует считать ошибкой. ;)
Я закончил с:
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
Мне не нужно, чтобы это было с внешними переменными среды, я бы предпочел сделать это с параметрами командной строки
scons
, такими какscons A=B
. Или эти двое всегда связаны?