Я работаю над проектом C ++, в котором есть некоторые исходные файлы с ручным кодированием, а также некоторые исходные файлы и файлы заголовков, которые создаются инструментом командной строки.
Фактические сгенерированные исходные и заголовочные файлы определяются содержимым файла JSON, который читает инструмент, и поэтому не могут быть жестко закодированы в сценарий scons.
Я хотел бы настроить scons так, чтобы, если я очищу проект, а затем сделаю его, он будет знать, как запустить инструмент командной строки для генерации сгенерированных исходных и заголовочных файлов в качестве первого шага, а затем после этого скомпилировать обе мои ручные программы файлы и сгенерированные исходные файлы и связать их, чтобы сделать мой двоичный файл.
Это возможно? Я в растерянности относительно того, как этого достичь, поэтому любая помощь будет высоко ценится.
Да, это возможно. В зависимости от того, какой инструмент вы используете для создания заголовочных / исходных файлов, вы можете проверить наш ToolIndex в https://bitbucket.org/scons/scons/wiki/ToolsIndex , или прочитайте наше руководство https://bitbucket.org/scons/scons/wiki/ToolsForFools для написания своего собственного строителя.
Основываясь на вашем описании, вам, вероятно, придется написать свой собственный Emitter, который анализирует входной файл JSON и возвращает имена файлов, которые в итоге получатся в результате вызова. Затем все, что вам нужно сделать, это:
# creates foo.h/cpp and bar.h/cpp
env.YourBuilder('input.json')
env.Program(Glob('*.cpp'))
Glob
найдет созданные файлы, даже если они еще не существуют на жестком диске, и добавит их к общим зависимостям.
Если у вас возникнут дополнительные вопросы или возникнут проблемы, рассмотрите возможность подписки на наш список рассылки для пользователей по адресу [email protected] (см. Также http://scons.org/lists.html ).
Есть пример на:
https://bitbucket.org/scons/scons/wiki/UsingCodeGenerators
Я также повторю предложение Дирка присоединиться к списку рассылки пользователей.
Благодаря Dirk Baechle я получил эту работу — для всех, кто интересуется здесь, код, который я использовал.
import subprocess
env = Environment( MSVC_USE_SCRIPT = "c:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\VC\\bin\\vcvars32.bat")
def modify_targets(target, source, env):
#Call the code generator to generate the list of file names that will be generated.
subprocess.call(["d:/nk/temp/sconstest/codegenerator/CodeGenerator.exe", "-filelist"])
#Read the file name list and add a target for each file.
with open("GeneratedFileList.txt") as f:
content = f.readlines()
content = [x.strip('\n') for x in content]
for newTarget in content:
target.append(newTarget)
return target, source
bld = Builder(action = 'd:/nk/temp/sconstest/codegenerator/CodeGenerator.exe', emitter = modify_targets)
env.Append(BUILDERS = {'GenerateCode' : bld})
env.GenerateCode('input.txt')
# Main.exe depends on all the CPP files in the folder. Note that this
# will include the generated files, even though they may not currently
# exist in the folder.
env.Program('main.exe', Glob('*.cpp'))