| ... | ... | @@ -981,27 +981,35 @@ fn configure(graph: *Graph, options: ConfigureOptions) !ScannedConfig { |
| 981 | 981 | // This loop is re-evaluated when the build script exits with an indication that it |
| 982 | 982 | // could not continue due to missing lazy dependencies. |
| 983 | 983 | const configuration_path: Path, var configuration_lock: ?Cache.Lock = cp: while (true) { |
| 984 | build_mod.deps.clearRetainingCapacity(); |
| 985 | deps_mod.deps.clearRetainingCapacity(); |
| 986 | |
| 984 | 987 | // Cache lookup for configure options. If we get a match, we can skip |
| 985 | 988 | // execution of the configure script. If not, we get the file path to pass |
| 986 | 989 | // to the configure process. |
| 987 | 990 | // |
| 988 | 991 | // In the hot path, we only check this cache, which means that also |
| 989 | 992 | // configure source files need to go in here. |
| 990 | | var config_man = graph.cache.obtain(); |
| 991 | | defer config_man.deinit(); |
| 993 | var config_man_allocation: Cache.Manifest = undefined; |
| 994 | const config_man: ?*Cache.Manifest = switch (options.cache_poison) { |
| 995 | .pure, .disallowed, .ignored => m: { |
| 996 | config_man_allocation = graph.cache.obtain(); |
| 992 | 997 | |
| 993 | | for (options.cached_passthru_configure) |i| |
| 994 | | config_man.hash.addBytes(configure_argv[i]); |
| 998 | for (options.cached_passthru_configure) |i| |
| 999 | config_man_allocation.hash.addBytes(configure_argv[i]); |
| 995 | 1000 | |
| 996 | | if (target_arch_os_abi) |triple| |
| 997 | | config_man.hash.addBytes(triple); |
| 1001 | if (target_arch_os_abi) |triple| |
| 1002 | config_man_allocation.hash.addBytes(triple); |
| 998 | 1003 | |
| 999 | | // Prevents a `zig build` from getting a false positive cache hit following |
| 1000 | | // a `zig build --cache-poison=ignored`. |
| 1001 | | config_man.hash.add(options.cache_poison == .ignored); |
| 1004 | // Prevents a `zig build` from getting a false positive cache hit following |
| 1005 | // a `zig build --cache-poison=ignored`. |
| 1006 | config_man_allocation.hash.add(options.cache_poison == .ignored); |
| 1002 | 1007 | |
| 1003 | | build_mod.deps.clearRetainingCapacity(); |
| 1004 | | deps_mod.deps.clearRetainingCapacity(); |
| 1008 | break :m &config_man_allocation; |
| 1009 | }, |
| 1010 | .poisoned => null, |
| 1011 | }; |
| 1012 | defer if (config_man) |man| man.deinit(); |
| 1005 | 1013 | |
| 1006 | 1014 | // We want to release all the locks before executing the child process, so we make a nice |
| 1007 | 1015 | // big block here to ensure the cleanup gets run when we extract out our argv. |
| ... | ... | @@ -1217,26 +1225,24 @@ fn configure(graph: *Graph, options: ConfigureOptions) !ScannedConfig { |
| 1217 | 1225 | const compile_prog_node = options.parent_progress_node.start("Compile Configure Script", 0); |
| 1218 | 1226 | defer compile_prog_node.end(); |
| 1219 | 1227 | |
| 1220 | | switch (options.cache_poison) { |
| 1221 | | .pure, .disallowed, .ignored => if (try config_man.hit(compile_prog_node)) { |
| 1222 | | const digest = config_man.final(); |
| 1228 | if (config_man) |man| { |
| 1229 | if (try man.hit(compile_prog_node)) { |
| 1230 | const digest = man.final(); |
| 1223 | 1231 | break :cp .{ |
| 1224 | 1232 | .{ |
| 1225 | 1233 | .root_dir = graph.local_cache_root, |
| 1226 | 1234 | .sub_path = try arena.print("c/{s}", .{&digest}), |
| 1227 | 1235 | }, |
| 1228 | | config_man.toOwnedLock(), |
| 1236 | man.toOwnedLock(), |
| 1229 | 1237 | }; |
| 1230 | | }, |
| 1231 | | .poisoned => {}, // Don't bother checking for cache hit. |
| 1238 | } |
| 1232 | 1239 | } |
| 1233 | | |
| 1234 | 1240 | const configure_exe_path: Path = if (std.zig.buildExeSubprocess(gpa, io, .{ |
| 1235 | 1241 | .argv = build_configurer_argv.items, |
| 1236 | 1242 | .cache_root = graph.local_cache_root, |
| 1237 | 1243 | .root_name = configurer_exe_name, |
| 1238 | 1244 | .environ_map = &graph.environ_map, |
| 1239 | | .cache_manifest = &config_man, |
| 1245 | .cache_manifest = config_man, |
| 1240 | 1246 | .arch_os_abi = target_arch_os_abi, |
| 1241 | 1247 | .progress_node = compile_prog_node, |
| 1242 | 1248 | .skip_log_cmdline_on_compile_errors = !graph.verbose, |
| ... | ... | @@ -1318,20 +1324,21 @@ fn configure(graph: *Graph, options: ConfigureOptions) !ScannedConfig { |
| 1318 | 1324 | continue :cp; |
| 1319 | 1325 | } |
| 1320 | 1326 | |
| 1321 | | for (configuration.path_deps) |path_dep| { |
| 1327 | if (config_man) |man| for (configuration.path_deps) |path_dep| { |
| 1322 | 1328 | switch (path_dep.flags.mode) { |
| 1323 | 1329 | .directory => {}, // TODO |
| 1324 | | .contents => try config_man.addPathPost(confPathDepToCachePath(graph, &configuration, path_dep)), |
| 1330 | .contents => try man.addPathPost(confPathDepToCachePath(graph, &configuration, path_dep)), |
| 1325 | 1331 | .metadata => {}, // TODO |
| 1326 | 1332 | } |
| 1327 | | } |
| 1333 | }; |
| 1328 | 1334 | |
| 1329 | 1335 | // If it is poisoned, there is no point in moving it to cached |
| 1330 | 1336 | // location. Just leave it in the tmp directory. |
| 1331 | 1337 | if (configuration.poisoned) { |
| 1332 | 1338 | break :cp .{ config_tmp_path, null }; |
| 1333 | 1339 | } else { |
| 1334 | | const digest = config_man.final(); |
| 1340 | const man = config_man.?; |
| 1341 | const digest = man.final(); |
| 1335 | 1342 | const final_path: Path = .{ |
| 1336 | 1343 | .root_dir = graph.local_cache_root, |
| 1337 | 1344 | .sub_path = try arena.print("c/{s}", .{&digest}), |
| ... | ... | @@ -1362,8 +1369,8 @@ fn configure(graph: *Graph, options: ConfigureOptions) !ScannedConfig { |
| 1362 | 1369 | config_tmp_path, final_path, e, |
| 1363 | 1370 | }); |
| 1364 | 1371 | }; |
| 1365 | | config_man.writeManifest() catch |err| log.warn("failed to write cache manifest: {t}", .{err}); |
| 1366 | | break :cp .{ final_path, config_man.toOwnedLock() }; |
| 1372 | man.writeManifest() catch |err| log.warn("failed to write cache manifest: {t}", .{err}); |
| 1373 | break :cp .{ final_path, man.toOwnedLock() }; |
| 1367 | 1374 | } |
| 1368 | 1375 | }; |
| 1369 | 1376 | // Hang on to the configuration file lock until we finish loading the configuration file. |