https://github.com/runewalsh/fpc-unit-prioritizer
Пример использования:
UnitA.pas
- Код: Выделить всё
unit UnitA;
interface
uses
Prioritizer;
implementation
initialization
RegisterUnit('UnitA', +1);
writeln('UnitA(+1) инициализирован');
end.
UnitB.pas
- Код: Выделить всё
unit UnitB;
interface
uses
Prioritizer;
implementation
initialization
RegisterUnit('UnitB', 0);
writeln('UnitB(0) инициализирован');
end.
UnitC.pas
- Код: Выделить всё
unit UnitC;
interface
uses
Prioritizer;
implementation
initialization
RegisterUnit('UnitC', -1);
writeln('UnitC(-1) инициализирован');
end.
main.pas
- Код: Выделить всё
uses
UnitB, UnitC, UnitA;
begin
end.
— вызовет секции initialization в порядке UnitA → UnitB → UnitC, независимо от чьего бы то ни было порядка подключения или взаимных зависимостей.
Решение опирается на недокументированные структуры и гвоздями прибито к каким-то платформам и версиям FPC, так что не думаю, что вызовет интерес помимо академического. Но однозначно буду использовать сам, т. к. до этого строил список модулей, которому руками нужно было дёрнуть SortAndInitialize в начале основной программы, что ну очень неудобно.