* Dependencies form a simple directed graph: - Modules can depend (or interface-depend) on any module, except itself. - Cyclic dependencies ARE allowed! (unlike in many other languages) * Method 1 to handle multi-versioned modules/dependencies: - Module-Version combinations are the nodes. - Dependencies (from module A ver X to module B ver Y) are the edges. - Versions "depend" on the earlier version - XXX this does not work with implementation-depends because we may want to eliminate old dependencies in old versions. - Maybe this can be used for interface-depends though? * Method 2 to handle multi-versioned modules/dependencies: - Modules are the nodes - Dependencies are the edges - This can be used for implementation-depends. * "Local" dependencies between files/symbols form a directed graph - Loops and cycles are allowed, but a structure may not contain itself except indirectly via pointers (including via function pointers).