Мне тоже интересна эта тема.
Путь у меня есть N модулей, компилировать модуль X можно только при условии что все модули, от которых X зависит, уже скомпилированы (потому что для компиляции X нужен выхлоп анализа из этих модулей - контекст).
Сейчас я сделал контекст моноидальным, построил граф модулей (дуги из модуля в его зависимости), положил пустой контекст и граф в общую память транзакционную.
Потом я запускаю M воркеров, каждый из воркеров пытается достать из графа модуль, из которых нет дуг, и которые не компилируются в данный момент времени уже. Если таких нет, ждут пока граф поменяется. После начинают компилировать его с контекстом на этот момент времени, потом удаляют модуль из графа, обновляя контекст.
И так пока граф не опустеет.