| ... | @@ -96,6 +96,16 @@ initialized_deps: *InitializedDepMap, | ... | @@ -96,6 +96,16 @@ initialized_deps: *InitializedDepMap, |
| 96 | /// A mapping from dependency names to package hashes. | 96 | /// A mapping from dependency names to package hashes. |
| 97 | available_deps: AvailableDeps, | 97 | available_deps: AvailableDeps, |
| 98 | | 98 | |
| | 99 | release_mode: ReleaseMode, |
| | 100 | |
| | 101 | pub const ReleaseMode = enum { |
| | 102 | off, |
| | 103 | any, |
| | 104 | fast, |
| | 105 | safe, |
| | 106 | small, |
| | 107 | }; |
| | 108 | |
| 99 | /// Shared state among all Build instances. | 109 | /// Shared state among all Build instances. |
| 100 | /// Settings that are here rather than in Build are not configurable per-package. | 110 | /// Settings that are here rather than in Build are not configurable per-package. |
| 101 | pub const Graph = struct { | 111 | pub const Graph = struct { |
| ... | @@ -295,6 +305,7 @@ pub fn create( | ... | @@ -295,6 +305,7 @@ pub fn create( |
| 295 | .named_writefiles = std.StringArrayHashMap(*Step.WriteFile).init(arena), | 305 | .named_writefiles = std.StringArrayHashMap(*Step.WriteFile).init(arena), |
| 296 | .initialized_deps = initialized_deps, | 306 | .initialized_deps = initialized_deps, |
| 297 | .available_deps = available_deps, | 307 | .available_deps = available_deps, |
| | 308 | .release_mode = .off, |
| 298 | }; | 309 | }; |
| 299 | try self.top_level_steps.put(arena, self.install_tls.step.name, &self.install_tls); | 310 | try self.top_level_steps.put(arena, self.install_tls.step.name, &self.install_tls); |
| 300 | try self.top_level_steps.put(arena, self.uninstall_tls.step.name, &self.uninstall_tls); | 311 | try self.top_level_steps.put(arena, self.uninstall_tls.step.name, &self.uninstall_tls); |
| ... | @@ -386,6 +397,7 @@ fn createChildOnly( | ... | @@ -386,6 +397,7 @@ fn createChildOnly( |
| 386 | .named_writefiles = std.StringArrayHashMap(*Step.WriteFile).init(allocator), | 397 | .named_writefiles = std.StringArrayHashMap(*Step.WriteFile).init(allocator), |
| 387 | .initialized_deps = parent.initialized_deps, | 398 | .initialized_deps = parent.initialized_deps, |
| 388 | .available_deps = pkg_deps, | 399 | .available_deps = pkg_deps, |
| | 400 | .release_mode = parent.release_mode, |
| 389 | }; | 401 | }; |
| 390 | try child.top_level_steps.put(allocator, child.install_tls.step.name, &child.install_tls); | 402 | try child.top_level_steps.put(allocator, child.install_tls.step.name, &child.install_tls); |
| 391 | try child.top_level_steps.put(allocator, child.uninstall_tls.step.name, &child.uninstall_tls); | 403 | try child.top_level_steps.put(allocator, child.uninstall_tls.step.name, &child.uninstall_tls); |
| ... | @@ -1230,20 +1242,33 @@ pub const StandardOptimizeOptionOptions = struct { | ... | @@ -1230,20 +1242,33 @@ pub const StandardOptimizeOptionOptions = struct { |
| 1230 | preferred_optimize_mode: ?std.builtin.OptimizeMode = null, | 1242 | preferred_optimize_mode: ?std.builtin.OptimizeMode = null, |
| 1231 | }; | 1243 | }; |
| 1232 | | 1244 | |
| 1233 | pub fn standardOptimizeOption(self: *Build, options: StandardOptimizeOptionOptions) std.builtin.OptimizeMode { | 1245 | pub fn standardOptimizeOption(b: *Build, options: StandardOptimizeOptionOptions) std.builtin.OptimizeMode { |
| 1234 | if (options.preferred_optimize_mode) |mode| { | 1246 | if (options.preferred_optimize_mode) |mode| { |
| 1235 | if (self.option(bool, "release", "optimize for end users") orelse false) { | 1247 | if (b.option(bool, "release", "optimize for end users") orelse (b.release_mode != .off)) { |
| 1236 | return mode; | 1248 | return mode; |
| 1237 | } else { | 1249 | } else { |
| 1238 | return .Debug; | 1250 | return .Debug; |
| 1239 | } | 1251 | } |
| 1240 | } else { | | |
| 1241 | return self.option( | | |
| 1242 | std.builtin.OptimizeMode, | | |
| 1243 | "optimize", | | |
| 1244 | "Prioritize performance, safety, or binary size (-O flag)", | | |
| 1245 | ) orelse .Debug; | | |
| 1246 | } | 1252 | } |
| | 1253 | |
| | 1254 | if (b.option( |
| | 1255 | std.builtin.OptimizeMode, |
| | 1256 | "optimize", |
| | 1257 | "Prioritize performance, safety, or binary size (-O flag)", |
| | 1258 | )) |mode| { |
| | 1259 | return mode; |
| | 1260 | } |
| | 1261 | |
| | 1262 | return switch (b.release_mode) { |
| | 1263 | .off => .Debug, |
| | 1264 | .any => { |
| | 1265 | std.debug.print("the project does not declare a preferred optimization mode. choose: --release=fast, --release=safe, or --release=small\n", .{}); |
| | 1266 | process.exit(1); |
| | 1267 | }, |
| | 1268 | .fast => .ReleaseFast, |
| | 1269 | .safe => .ReleaseSafe, |
| | 1270 | .small => .ReleaseSmall, |
| | 1271 | }; |
| 1247 | } | 1272 | } |
| 1248 | | 1273 | |
| 1249 | pub const StandardTargetOptionsArgs = struct { | 1274 | pub const StandardTargetOptionsArgs = struct { |