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')

Мой вопрос:

  1. Как указать этот ShellExecution protoc в SConstruct/SConscript?

  2. Как убедиться, что компиляция "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 Написание своих собственных строителей", и особенно наше Руководство по инструментальным средствам, вы можете найти больше информации об этом.

Другие вопросы по тегам