В ваф, как определить зависимость от сгенерированного заголовка из другого подкаталога - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь получить 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)

1 Ответ

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

Когда вы запускаете waf в подкаталоге, он публикует только генератор задач, определенный в поддереве.Это позволяет частичные сборки.waf знает о ваших зависимостях, которые сканирование включает в ваши C-файлы, но, как может быть, включает в себя системные включения, которые ничего не вызывают.Чтобы запустить генератор задач в другой части вашего дерева, лучше всего сделать это use =, на мой взгляд, это лучший способ.Вы также можете использовать:

bld.program(source = ["main.c", "../gen/test.h"], ...)

, но я считаю его менее модульным.

...