Ваши наблюдения и предположения верны, SCons не выполнит отдельные команды сборки в порядке, указанном вами в файлах SConstruct. Он будет запускать их на основе зависимостей целей и исходных файлов в вашей сборке, либо определенных неявно (например, заголовок включен в C ++), либо явно (с помощью метода Depends()
).
Таким образом, вы должны правильно определить и настроить свои зависимости, так что SCons доставит желаемый результат. Для особого случая protoc
в вашем примере существует специальный Builder, который поможет вам правильно построить граф зависимостей. Он доступен в нашем ToolsIndex , где также можно найти поддержку множества других языков и диалектов.
Эти специальные компоновщики будут излучать правильные целевые узлы, например, когда ему дан входной файл *.proto
, и SCons может автоматически обнаружить зависимость между входным файлом protoc и вашей программой main
, если вы скажете что-то вроде:
env=Environment(tools=['default','protoc'])
env.Protoc([], "test.proto")
env.Program('main', ['main.cpp'] + Glob('*.cc'))
Glob('*.cc')
обнаружит ваши *.cc
файлы, поступающие из инструмента protoc , и включит их в качестве зависимостей для вашей конечной цели main
.
Вы всегда можете написать своих собственных Строителей и Излучателей в SCons , что является каноническим способом сделать новые инструменты / наборы инструментов известными для SCons анализа зависимостей. В UserGuide , раздел. «18 Написание собственных строителей», и особенно наше Руководство по инструментальным средствам , вы можете найти больше информации об этом.