2016-01-22 4 views
0

Я работаю над проектом на C++, который имеет некоторые исходные файлы с ручной кодировкой, а также некоторые исходные и заголовочные файлы, которые генерируются инструментом командной строки. Фактические исходные и заголовочные файлы сгенерированы содержимым файла JSON, которое инструмент считывает, и поэтому не может быть жестко закодирован в скрипт scons. Я хотел бы настроить scons так, чтобы, если я очистку проекта, то сделайте это, он будет знать, чтобы запустить инструмент командной строки, чтобы сгенерировать сгенерированные исходные и заголовочные файлы в качестве первого шага, а затем после этого скомпилировать мою руку закодированных файлов и сгенерированных исходных файлов и связывать их, чтобы сделать мой двоичный файл. Возможно ли это? Я не понимаю, как это сделать, поэтому любая помощь будет высоко оценена.Как настроить scons для создания проекта, который сгенерировал исходные файлы?

ответ

1

Да, это возможно. В зависимости от того, какой инструмент вы используете для создания файлов заголовка/источника, вы хотите проверить наш ToolIndex на https://bitbucket.org/scons/scons/wiki/ToolsIndex или прочитать наш справочник https://bitbucket.org/scons/scons/wiki/ToolsForFools для написания собственного Builder. На основе вашего описания вам, вероятно, придется написать собственный излучатель, который анализирует входной файл 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).

+0

Это мой собственный инструмент, который генерирует исходные файлы. Я мог бы изменить его, чтобы вывести список файлов, которые он будет генерировать. Вы говорите, что я должен создать Emitter для YourBuilder, который вызывает мой инструмент, чтобы вернуть список выходных файлов, и тогда ваш пример будет работать правильно? –

0

Благодаря 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')) 
Смежные вопросы