Scons: как указать зависимость файла для стороннего результата компиляции?
Мне кажется, что цели scons генерируются не в последовательности объявления. Моя проблема в том, что мне нужно сначала сгенерировать некоторый код, я использую protoc для обработки файла my.proto в файл.h и.cc, мне нужен такой псевдокод (как должен выглядеть рабочий код?)
import os
env=Environment(ENV=os.environ,LIBPATH='/usr/local/lib')
env.ShellExecute('protoc', '--outdir=. --out-lang=cpp', 'my.proto')//produces my.cc
myObj=Object('my.cc')//should wait until 'my.cc' is generated by protoc
Dependency(myObj, 'my.cc')
mainObj=Object('main.cpp')
Мой вопрос:
Как указать этот ShellExecution protoc в SConstruct/SConscript?
Как убедиться, что компиляция "main.cpp" зависит от существования "my.cc", другими словами, дождаться генерации "my.cc" и выполнить?
1 ответ
Ваши наблюдения и предположения верны, SCons не будет выполнять отдельные команды сборки в том порядке, в котором вы их перечислили в файлах SConstruct. Он будет запускать их на основе зависимостей целей и исходных файлов в вашей сборке, либо определенных неявно (например, заголовок включен в C++), либо явно (через Depends()
метод).
Таким образом, вы должны правильно определить и настроить свои зависимости, чтобы SCons предоставил желаемый результат. Для особых protoc
В этом случае существует специальный конструктор, который поможет вам правильно построить граф зависимостей. Он доступен в нашем 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. В Руководстве пользователя, раздел. "18 Написание своих собственных строителей", и особенно наше Руководство по инструментальным средствам, вы можете найти больше информации об этом.