Commit b835590
authored
feat(deps): walk transitive dependency graph + detect version conflicts (#17)
Before this patch the dep loop only iterated `m->dependencies` once —
direct deps' `[build].include_dirs` propagated, but their own
`[dependencies]` didn't get fetched, didn't appear in the modgraph,
and their includes weren't visible while compiling them. Concretely:
a project depending on `mcpplibs.tinyhttps` would have to also
explicitly list `mbedtls = "3.6.1"`, otherwise tinyhttps's `tls.cppm`
failed to find `<mbedtls/ssl.h>`.
Replace the single-pass loop with a worklist algorithm:
worklist = seed from main manifest's [dependencies]
(and [dev-dependencies] when --tests)
resolved = map<(ns, name), {version, requestedBy, source}>
while worklist not empty:
item = pop
pin SemVer constraint to a concrete version (one shared lambda)
key = (item.ns, item.shortName)
if resolved[key] exists:
compare source kinds (path/git/version) — clash = error
compare exact versions — clash = error
same → skip (already processed)
fetch the dep, load its manifest, propagate its include_dirs,
record into resolved[key] and packages
for each child in dep_manifest.dependencies:
worklist.push(child, requestedBy = this dep)
`[dev-dependencies]` are seeded from the main manifest only; transitive
walks intentionally skip them because dev-deps are private to the
package's own test runs, not part of its public ABI.
Conflict messages name both requesters so users can see the path
through the graph that produced the disagreement, e.g.
dependency 'mcpp.D' has conflicting versions in the transitive graph:
'1.0.0' requested by 'B@2.0'
'2.0.0' requested by 'C@1.5'
C++ modules require a single global version of each package.
(Single-version semantics is forced by C++ modules — module names + ODR
are global, multiple versions of the same package can't coexist in one
build. Same constraint as cargo for non-Rust targets, vcpkg, conan, etc.)
Storage detail: dep manifests are now held by `vector<unique_ptr>` so
PackageRoot's reference into the manifest stays stable when the
worklist appends new entries during the walk.
Coverage:
* `tests/e2e/31_transitive_deps.sh` — three-level path-dep chain
(top → ch → gc): top declares only ch, gc's include_dirs reach ch's
compile rule, link succeeds, runtime returns the right answer.
Also exercises a duplicate-but-consistent dep reachable through two
edges.
* Verified end-to-end against `mcpplibs.llmapi`: a fresh project that
declares only `mcpplibs.llmapi = "0.2.4"` builds and links cleanly,
with mbedtls + mcpplibs.tinyhttps pulled automatically by the
walker.1 parent 6b323eb commit b835590
2 files changed
Lines changed: 245 additions & 40 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1027 | 1027 | | |
1028 | 1028 | | |
1029 | 1029 | | |
1030 | | - | |
1031 | | - | |
| 1030 | + | |
| 1031 | + | |
| 1032 | + | |
| 1033 | + | |
| 1034 | + | |
| 1035 | + | |
| 1036 | + | |
| 1037 | + | |
| 1038 | + | |
| 1039 | + | |
| 1040 | + | |
1032 | 1041 | | |
1033 | 1042 | | |
1034 | 1043 | | |
1035 | | - | |
1036 | | - | |
| 1044 | + | |
| 1045 | + | |
| 1046 | + | |
| 1047 | + | |
| 1048 | + | |
| 1049 | + | |
| 1050 | + | |
| 1051 | + | |
| 1052 | + | |
| 1053 | + | |
| 1054 | + | |
| 1055 | + | |
| 1056 | + | |
| 1057 | + | |
| 1058 | + | |
| 1059 | + | |
| 1060 | + | |
| 1061 | + | |
| 1062 | + | |
| 1063 | + | |
| 1064 | + | |
| 1065 | + | |
| 1066 | + | |
| 1067 | + | |
| 1068 | + | |
| 1069 | + | |
| 1070 | + | |
| 1071 | + | |
| 1072 | + | |
| 1073 | + | |
| 1074 | + | |
| 1075 | + | |
| 1076 | + | |
| 1077 | + | |
| 1078 | + | |
| 1079 | + | |
| 1080 | + | |
| 1081 | + | |
| 1082 | + | |
| 1083 | + | |
| 1084 | + | |
| 1085 | + | |
1037 | 1086 | | |
1038 | | - | |
1039 | | - | |
1040 | | - | |
1041 | | - | |
| 1087 | + | |
| 1088 | + | |
| 1089 | + | |
| 1090 | + | |
| 1091 | + | |
| 1092 | + | |
1042 | 1093 | | |
1043 | | - | |
| 1094 | + | |
| 1095 | + | |
| 1096 | + | |
1044 | 1097 | | |
1045 | 1098 | | |
1046 | | - | |
1047 | | - | |
1048 | | - | |
1049 | | - | |
1050 | | - | |
1051 | | - | |
1052 | | - | |
1053 | | - | |
1054 | | - | |
1055 | | - | |
1056 | | - | |
1057 | | - | |
1058 | | - | |
1059 | | - | |
1060 | | - | |
1061 | | - | |
1062 | | - | |
1063 | | - | |
1064 | | - | |
| 1099 | + | |
| 1100 | + | |
| 1101 | + | |
| 1102 | + | |
| 1103 | + | |
| 1104 | + | |
| 1105 | + | |
| 1106 | + | |
| 1107 | + | |
| 1108 | + | |
| 1109 | + | |
| 1110 | + | |
| 1111 | + | |
| 1112 | + | |
| 1113 | + | |
| 1114 | + | |
| 1115 | + | |
1065 | 1116 | | |
1066 | | - | |
1067 | | - | |
1068 | | - | |
1069 | | - | |
1070 | | - | |
| 1117 | + | |
| 1118 | + | |
| 1119 | + | |
| 1120 | + | |
| 1121 | + | |
| 1122 | + | |
| 1123 | + | |
| 1124 | + | |
| 1125 | + | |
| 1126 | + | |
| 1127 | + | |
| 1128 | + | |
| 1129 | + | |
| 1130 | + | |
| 1131 | + | |
| 1132 | + | |
| 1133 | + | |
| 1134 | + | |
| 1135 | + | |
| 1136 | + | |
| 1137 | + | |
| 1138 | + | |
| 1139 | + | |
| 1140 | + | |
| 1141 | + | |
| 1142 | + | |
| 1143 | + | |
| 1144 | + | |
| 1145 | + | |
| 1146 | + | |
| 1147 | + | |
1071 | 1148 | | |
1072 | | - | |
1073 | 1149 | | |
1074 | | - | |
1075 | | - | |
1076 | | - | |
1077 | | - | |
1078 | 1150 | | |
1079 | 1151 | | |
1080 | 1152 | | |
| |||
1307 | 1379 | | |
1308 | 1380 | | |
1309 | 1381 | | |
1310 | | - | |
1311 | | - | |
| 1382 | + | |
| 1383 | + | |
| 1384 | + | |
| 1385 | + | |
| 1386 | + | |
| 1387 | + | |
| 1388 | + | |
| 1389 | + | |
| 1390 | + | |
| 1391 | + | |
| 1392 | + | |
| 1393 | + | |
| 1394 | + | |
| 1395 | + | |
| 1396 | + | |
| 1397 | + | |
| 1398 | + | |
| 1399 | + | |
| 1400 | + | |
| 1401 | + | |
| 1402 | + | |
| 1403 | + | |
| 1404 | + | |
| 1405 | + | |
| 1406 | + | |
| 1407 | + | |
1312 | 1408 | | |
1313 | 1409 | | |
1314 | 1410 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
0 commit comments