Waf выдает ошибки при сборке c++

Наш проект содержит много исходников на С++, до сих пор мы использовали make для сборки всего, однако это занимает много времени. Итак, я наткнулся на waf, который неплохо работает и значительно ускоряет сборку. Однако каждый раз, когда я делаю полную сборку, я получаю пару ошибок сборки, которые не имеют смысла. Если я сейчас выполняю инкрементную сборку, в большинстве случаев некоторые исходные коды, которые не удалось собрать с первого раза, будут собраны сейчас, а некоторые другие по-прежнему терпят неудачу. В другой инкрементной сборке я, наконец, получу успешную сборку.

Я пробовал создавать отдельные библиотеки отдельными шагами на случай, если какие-либо зависимые библиотеки попытаются построить параллельно, но ошибки все равно появляются.

EDIT: Ошибки, которые я продолжаю получать, похоже, не имеют ничего общего с моим кодом, например.

Build failed
 -> task failed (exit status -1):
        {task 10777520: c constr_SET.c -> constr_SET.c.1.o}

После очередной "сборки waf" я больше не получаю эту ошибку.

EDIT2: этап сборки моих библиотек выглядит следующим образом:

def build(bld):
  bld.shlib(source="foo.cpp bar.cpp foobar.cpp constr_SET.c",
  target="foobar",
  includes= "../ifinc",
  name="foobar",
  use="MAIN RW HEADERS",
  install_path = "lib/")

MAIN, RW, HEADERS — это лишь некоторые флаги и внешние библиотеки, которые мы используем.

Кто-нибудь видел подобное поведение в своей системе? Или хотя бы решение?


person pushy    schedule 07.10.2011    source источник
comment
Очевидно, вы неправильно понимаете зависимости (вероятно, шаг ссылки). Но вы не показываете пример, даже ошибки, так что мы не можем помочь.   -  person sehe    schedule 07.10.2011
comment
Вы правы, конечно, обновил пример. Это вполне может быть проблема с зависимостями, однако эти ошибки продолжают возникать во время сборки наших разделяемых библиотек, которые не имеют никаких зависимостей друг от друга (на этом этапе мы копируем наши заголовки в центральный каталог, чтобы избежать зависимостей).   -  person pushy    schedule 07.10.2011


Ответы (1)


Я подозреваю, что несколько целей создают один и тот же требуемый объект параллельно. Пытаться

export JOBS=1

or

 waf --jobs 1
person sehe    schedule 07.10.2011
comment
Хорошо, вы правы, если я уменьшу количество заданий, ошибки исчезнут. Но что я делаю неправильно? Я поместил (надеюсь) соответствующую часть моего wscript в текст вопроса. - person pushy; 07.10.2011
comment
Я думаю, вы должны показать правило, где компилируется constr_SET.c, и/или где используется constr_SET.o. Я предполагаю, что более 1 бинарника ссылается на constr_SET.o и строит его по запросу — одновременно. В этом случае лучше явно зависеть от constr_SET.o, чтобы Waf мог знать зависимость и сериализовать зависимые правила. - person sehe; 07.10.2011
comment
По сути, файл constr_SET.c является одним из исходных файлов для наших библиотек. Таким образом, приведенная выше конфигурация — это место, где компилируется исходный код, и, поскольку наши библиотеки не зависят друг от друга, исходный код нигде не используется на этапе сборки библиотеки. Позже, когда наши процессы собираются, мы зависим от библиотеки, но я помещаю сборку библиотек и процессов в разные группы сборки, поэтому я хотел бы думать, что таких побочных эффектов не должно быть... - person pushy; 07.10.2011
comment
Просто перезапустил сборку, и теперь я понял, что класс, для которого я получаю исключение, уже был построен. По крайней мере, теперь я понял, в каком направлении смотреть. Большое спасибо, вы очень помогли. - person pushy; 07.10.2011