Я пытаюсь получить waf для генерации заголовочных файлов, сгенерированных цепочкой задач, и автоматически подбирать их с помощью функции scan
препроцессора c.
Вот пример проекта.Некоторые файлы генерируются в каталоге проекта gen
, который будет использоваться в каталоге проекта prog.
Макет:
├── gen
│ ├── test.txt
│ └── wscript
├── prog
│ ├── main.c
│ └── wscript
├── waf
└── wscript
Генерация файла .h
происходитчерез цепочку задач, объявленную в файле верхнего уровня:
top = '.'
def configure(cfg):
cfg.load('compiler_c')
def build(bld):
from waflib import TaskGen
TaskGen.declare_chain(name = 'int',
rule = 'cat ${SRC} > ${TGT}',
ext_in = '.txt', ext_out = '.int')
TaskGen.declare_chain(name = 'inttoh',
rule = 'cat ${SRC} > ${TGT}',
ext_in = '.int', ext_out = '.h')
bld.recurse(['prog', 'gen'])
В общем, все, что нам нужно, это определить build
как bld(source = 'test.txt', target='test.h')
.
В проге мы создаемзапрограммируйте и задайте только путь включения, не упоминайте test.h
напрямую (main.c
включает test.h
):
def build(bld):
includes = [ bld.path.parent.find_dir('gen').get_bld().abspath() ]
bld.program(source = 'main.c', target = 'prog', includes = includes)
Когда я запускаю waf
на верхнем уровне, все работает как положено,Когда я запускаю его из каталога prog
, он никогда не вызывает создание test.h
.У меня сложилось впечатление, что препроцессор c проверки не должен запускаться до тех пор, пока не будут созданы все узлы, но, похоже, если я запускаю из каталога prog
, waf
не знает об этих сгенерированных заголовках, даже если ониопределены как цели в файле wscript
другого каталога.
[edit: в этом есть смысл, который я только что понял - при запуске с верхнего уровня он будет планировать построение заголовков, а затем зависимости разрешатся нормально.Waf, похоже, не имеет списка элементов, которые «могут быть собраны, если это необходимо»]
Есть некоторые обходные пути, такие как использование name
и добавление директивы use = ...
в файле C wscript.Есть ли способ.хотя, чтобы он работал автоматически?Кажется, waf
должен иметь всю информацию, необходимую для автоматической работы.
(протестировано с waf 1.7.8 и 2.0.8)