Забывание циклов ... (это часть, о которой я больше всего думаю):
Автоматическое определение необходимого порядка компиляции НЕ подразумевает компиляцию файлов более одного раза.
Все, что для этого требуется, - это определить, был ли файл B, от которого зависит A, (a) уже скомпилирован, или (b) находится в процессе компиляции, или (c) еще не начал компилироваться. И я полагаю, (г) вы, возможно, даже не планировали компилировать B.
Если (а), хорошо, нет проблем.
Если в любом другом случае компиляция A должна быть приостановлена до тех пор, пока компиляция B не будет завершена. Это все.
Я предполагаю, что у вас есть какой-то параллельный менеджер заданий или планировщик. Если (d), вы указываете менеджеру работ запланировать компиляцию B. Если (c), вы говорите, чтобы компиляция B имела более высокий приоритет, чем она уже есть. Если (b), вы просто ждете, когда компиляция B уже выполняется, и / или приостанавливаете компиляцию A, возможно, переключитесь на выполнение чего-то еще, пока компиляция B не будет завершена.
Если у вас нет сложного менеджера заданий, возможно, просто наберите -j 8, вы можете зайти в тупик, потому что все ваши 8 параллельных заданий могут ожидать какого-то зависимого. В этом случае вам, возможно, придется остановить один из них, и latyer перезапустить его полностью.
Но если у вас есть менеджер заданий, который поддерживает перевод любого числа, если задания находятся в спящем режиме, вам не нужно компилировать дважды. (Запрещающие циклы, требующие релаксации.)
Я испытываю желание предложить вам вспомнить граф зависимостей от одной компиляции до следующей перекомпиляции. Это было бы хорошей эвристикой. А простые не совсем полные компиляции, такие как сканирование на #include, могут помочь получить правильный порядок. Но вы могли бы расценить это как дух.