Ваши наблюдения и предположения верны, 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
.
Вы всегда можете написать свои собственные Builders и Emitters в SCons, что является каноническим способом сделать новые инструменты/связки инструментов известными анализу зависимостей SCons. В Руководстве пользователя, разд. "18 Написание собственных сборщиков" и особенно наше Руководство по ToolsForFools. об этом.
person
dirkbaechle
schedule
14.09.2018