Ошибка многопоточной сборки в 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, из-за чего и возникла проблема