Ошибка многопоточной сборки в Makefile


Окружение:

  • Виртуализация: VirtualBox 6.1
  • Host OS: Windows Server 2016 Datacentr
  • Guest OS: UbuntuServer 18.04
  • Директория с исходниками находится на диске windows
  • В guestos доступ к ней прокинут через VB shared folder
  • Диск обычный SATA6

Сборка происходит под десяток различных тулчейнов в основном всё gcc. В Makefile ни чего необычного, около 20 либ собирающиеся g++ и gcc.


Проблема

При многопоточной сборке с различной переодичностью возникает ошибка, в независимости от таргета или тулчейна:

In file included from ../../lib/boost/predef/os.h:18:0,
                 from ../../lib/boost/predef.h:17,
                 from ../../include/share/cpp11check.h:2,
                 from ../../include/share/mplcshare.h:44,
                 from ./mplc_opcua.h:17,
                 from ./stdafx.h:58,
                 from core_opcua_server/source/SubscriptionServer.cpp:39:
../../lib/boost/predef/os/linux.h:12:31: error: ../../lib/boost/predef/make.h: Invalid argument
 #include <boost/predef/make.h>
                               ^

В место boost/predef/make.h может быть любой header

Изначально из-за проблем с зависимостями сборка паралелилась на уровне тулчейна, т.е запускалось 4 make для разных платформ и там эта проблема возникала чаще.

Сейчас запускается один make c -j4, ошибка появляется реже но не пропала полностью.


Вопросы:

  • В чём может быть проблема подобного поведения?
  • Есть ли какие то ограничения на количество открываемых файлов с gusetos?
  • Есть ли способ диагностировать в чём заключается реальная ошибка?

PS:

Перенести srcdir на guestos на текущий момент не представляется возможным, как и собирать на отдельной машине с linux.

на локальной машине пока не воспроизводилось, возможно из-за малого количества попыток(нет возможности ждать 3-4 часовые билды), а возможно из-за nvme ssd.


Ещё раз хочу отдельно подчеркнуть:

  • проблема не в отсутствии файлов или их путях и не в флагах gcc
  • нет ни каких "гонок" все исходники гарантировано лежат в нужной директории до начала сборки.
  • Эта ошибка решается тупо изменением опции make c -j4 на -j1, что замедляет полную сборку в 3-4 раза и длится вместо 2-3 часов все 8-10, из-за чего и возникла проблема

Ответы (0 шт):