1
1
// Copyright 2022 Oxide Computer Company
2
2
3
- use anyhow:: { bail , Result } ;
3
+ use anyhow:: Result ;
4
4
use omicron_zone_package:: config;
5
- use omicron_zone_package:: package:: { PackageOutput , PackageSource } ;
6
5
use omicron_zone_package:: target:: Target ;
7
- use std:: collections:: BTreeMap ;
8
6
use std:: fs:: create_dir_all;
9
7
use std:: path:: Path ;
10
- use topological_sort:: TopologicalSort ;
11
8
12
9
#[ tokio:: main]
13
10
async fn main ( ) -> Result < ( ) > {
@@ -16,61 +13,14 @@ async fn main() -> Result<()> {
16
13
let output_dir = Path :: new ( "out" ) ;
17
14
create_dir_all ( output_dir) ?;
18
15
19
- // Reverse lookup of "output" -> "package creating this output".
20
- let all_packages = cfg
21
- . packages
22
- . iter ( )
23
- . map ( |( name, package) | ( package. get_output_file ( name) , ( name, package) ) )
24
- . collect :: < BTreeMap < _ , _ > > ( ) ;
25
-
26
- // Collect all packages, and sort them in dependency order,
27
- // so we know which ones to build first.
28
- let mut outputs = TopologicalSort :: < String > :: new ( ) ;
29
- for ( package_output, ( _, package) ) in & all_packages {
30
- match & package. source {
31
- PackageSource :: Local { .. }
32
- | PackageSource :: Prebuilt { .. }
33
- | PackageSource :: Manual => {
34
- // Skip intermediate leaf packages; if necessary they'll be
35
- // added to the dependency graph by whatever composite package
36
- // actually depends on them.
37
- if !matches ! (
38
- package. output,
39
- PackageOutput :: Zone {
40
- intermediate_only: true
41
- }
42
- ) {
43
- outputs. insert ( package_output) ;
44
- }
45
- }
46
- PackageSource :: Composite { packages : deps } => {
47
- for dep in deps {
48
- outputs. add_dependency ( dep, package_output) ;
49
- }
50
- }
51
- }
52
- }
53
-
54
- while !outputs. is_empty ( ) {
55
- let batch = outputs. pop_all ( ) ;
56
- assert ! (
57
- !batch. is_empty( ) || outputs. is_empty( ) ,
58
- "cyclic dependency in package manifest!"
59
- ) ;
60
-
61
- for output in & batch {
62
- println ! ( "Creating '{output}'" ) ;
63
-
64
- let Some ( ( name, package) ) = all_packages. get ( output) else {
65
- bail ! (
66
- "Cannot find a package to create output: '{output}' \n \
67
- \t This can happen when building a composite package, where one of \n \
68
- \t the 'source.packages' has not been found."
69
- ) ;
70
- } ;
16
+ let packages = cfg. packages_to_deploy ( & Target :: default ( ) ) ;
17
+ let package_iter = packages. build_order ( ) ;
71
18
19
+ for batch in package_iter {
20
+ for ( name, package) in & batch {
21
+ println ! ( "Building '{name}'" ) ;
72
22
package
73
- . create_for_target ( & Target :: default ( ) , & name, output_dir)
23
+ . create_for_target ( & Target :: default ( ) , name, output_dir)
74
24
. await ?;
75
25
}
76
26
}
0 commit comments