Необязательные аргументы среды для SCons Builders

Я заметил, что вызовы построителей Object и Library иногда принимают в конце необязательные аргументы, такие как

Object('hello.c', CCFLAGS='-DHELLO')
Object('goodbye.c', CCFLAGS='-DGOODBYE')

Могут ли Object, Library и SharedLibrary принимать произвольный набор из них или они ограничены определенным набором переменных? Если это так, я надеюсь, что это должно спасти нашу текущую очень большую сборку SCons в работе.


person Nordlöw    schedule 22.04.2014    source источник


Ответы (2)


Разработчики C/C++ распознают определенный набор аргументов, называемый . Конструктивные переменные.

Эти переменные могут быть установлены либо в среде, либо при вызове построителя, как вы делаете в своем вопросе. Часто проще установить их в среде, что упрощает вызовы сборщиков, а затем изменять переменные только при необходимости.

Вот пример:

env = Environment()

# Notice that CPPPATH, CPPDEFINES, LIBS, and LIBPATH dont include the
# compiler flags -I, -D, -l, and -L respectively, SCons will add those
# in a platform independent manner
env.Append(CCFLAGS=['-g', '-O2'])
env.Append(CPPPATH=['some/include/path'])
env.Append(CPPDEFINES=['YOUR_DEFINE'])
env.Append(LIBS=['pthread'])
env.Append(LIBPATH=['some/lib/path'])

# All of these builder calls use the construction  
# variables set on the environment above
env.Object('hello.c')
env.Object('goodbye.c')
env.Program('main.cc')

Если вы хотите переопределить определенную переменную, вы можете сделать следующее

env.Object('hello.c', CPPDEFINES='HELLO')

Или, если вы хотите добавить к определенной переменной всего одним вызовом, вы можете сделать следующее:

env.Object('hello.c', CPPDEFINES=[env['CPPDEFINES'], 'HELLO'])
person Brady    schedule 23.04.2014

То, что сказал Брэйди, в основном верно. Однако вы можете добавить любое (количество) переменных Environment() в конец любого компоновщика. Они создают OverrideEnvironment(), который затем используется для запуска компоновщика.

Если бы вы изменили значение CCCOM и/или любую переменную, которая передается в командную строку для запуска компилятора, то добавление этих переменных в вызов построителя также оказало бы некоторое влияние.

Если вы укажете переменную, которая не влияет на текущий билдер или даже переменную, которая не определена нигде в SCons или любых билдерах, которые вы могли создать, SCons не выдаст предупреждение или ошибку.

person bdbaddog    schedule 05.02.2016