Scons: как указать зависимость файла для стороннего результата компиляции? - PullRequest
0 голосов
/ 14 сентября 2018

Мне кажется, что цели 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 Ответ

0 голосов
/ 14 сентября 2018

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

...