Cyclic dependencies are mostly forbidden: if A imports B (directly or indirectly) then B is not allowed to import A. However, there are cases when cyclic dependencies would be beneficial. For these cases, another form of import between projects exists: the `limited with'. A project A that imports a project B with a straight `with' may also be imported, directly or indirectly, by B through a limited with.
The difference between straight `with' and limited with is that the name of a project imported with a limited with cannot be used in the project importing it. In particular, its packages cannot be renamed and its variables cannot be referred to.
with "b.gpr"; with "c.gpr"; project A is for Exec_Dir use B'Exec_Dir; -- ok end A; limited with "a.gpr"; -- Cyclic dependency: A -> B -> A project B is for Exec_Dir use A'Exec_Dir; -- not ok end B; with "d.gpr"; project C is end C; limited with "a.gpr"; -- Cyclic dependency: A -> C -> D -> A project D is for Exec_Dir use A'Exec_Dir; -- not ok end D;