Ниже я прилагаю простой список зависимостей в качестве примера. Я использую Unix TSORT, чтобы решить то же самое, нумерация узлов
Root 0
File1 1
File2 2
File1.cpp 3
File2.cpp 4
> tsort
0 1
0 2
1 3
2 4
Generates:
0 2 1 3 4
Что я не могу понять, так это как эффективно использовать этот список зависимостей, чтобы перекомпилировать только измененные файлы?
Я просто пытаюсь понять, как это работает внутри, и пытаюсь создать свой собственный маленький прототип для того же самого.
Любой другой подход, кроме топологической сортировки, приветствуется.
На самом деле, make, вероятно, больше не использует топологический порядок: наивный вывод линейного списка рабочих элементов таким способом не поддается параллелизму.
Я не знаю, что на самом деле делает make, но идея состоит в том, чтобы сначала удалить дерево зависимостей (удалить листья, чьи зависимости не изменились, что может создать новые листья, поэтому повторяйте, пока больше ничего не будет удалено), а затем выполните параллельную глубину. первое посещение, чтобы построить каждый узел.
Других решений пока нет …