2017-02-15 13 views
5
$ python gencpp.py 

Эта команда генерирует файл cpp foo.cpp в рабочем каталоге.Использование сгенерированного кода в bazel build

Я хотел бы, чтобы запустить эту команду в bazel, прежде чем строить, чтобы иметь возможность включать foo.cpp в cc_binary «S srcs атрибутов.

Что я пробовал:

genrule(
    name = 'foo', 
    outs = ['foo.cpp'], 
    cmd = 'python gencpp.py', 
) 

cc_library(
    srcs = ['foo.cpp'], # tried also with :foo 
    ... 
) 

объявил выход 'внешний/somelib/foo.cpp' не был создан genrule. Вероятно, это связано с тем, что genrule на самом деле не создавал этот вывод или потому, что вывод был каталогом, а genrule запускался удаленно (обратите внимание, что только содержимое объявленных файлов выгружается из genrules запускает удаленно).

Я знаю, что есть решение, которое требует, чтобы gencpp.py было немного изменено, но это не то, что я ищу.

+0

У меня была довольно похожая проблема [stackoverflow/bazel-автоматически-сгенерированные-cpp-hpp-файлы] (https://stackoverflow.com/questions/44312549/bazel-automatically-generated-cpp-hpp-files). Эти ответы могут завершить приведенные здесь. –

ответ

4

Благодарим @kristina за the answer.

Мне нужно скопировать foo.cpp в каталог outs после его создания.

genrule(
    name = 'foo', 
    outs = ['foo.cpp'], 
    cmd = """ 
      python gencpp.py 
      cp foo.cpp [email protected] 
    """, 

) 
+0

копия трюка работала для меня тоже.Помните, что когда у вас несколько выходов (мой скрипт генерирует код C++, один файл hpp и один файл cpp), вы должны использовать: cp file.hpp $ (@ D); cp file.cpp $ (@ D); –

2

Эта команда создает файл CPP foo.cpp в рабочем каталоге.

Я рекомендовал бы это изменить, так что либо:

  • Вы пишете вывод в файл, указанный в командной строке флаг
  • Пишешь выход на стандартный вывод.

Тогда ваша команда genrule может быть:

python gencpp.py [email protected] 

или

python gencpp.py > [email protected] 

соответственно.

Как Ulf Adams указывает:

Базэл запускает несколько действий параллельно, а если же правило зависимость инструмента, а также приложения, он может попытаться запустить и в то же время , и они переписывают друг друга, что может иметь очень плохие результаты.

Таким образом, следует избегать записи выходных файлов, о которых базель напрямую не знает.

+1

На самом деле это хуже. Bazel выполняет несколько действий параллельно, и если одно и то же правило является зависимостью от инструмента, а также от приложения, оно может попытаться запустить оба одновременно, и они перезаписывают друг друга, что может иметь очень плохие результаты. (Хотя нет, если песочница включена.) –

+0

@UlfAdams «Это на самом деле хуже», как в «моем предположении хуже», или как «последствия написания и копирования хуже, чем я предлагаю»? –

+0

Последний. Последствия записи в текущий каталог, а затем копирования или перемещения в пункт назначения могут привести к молчанию. –