@@ -5,10 +5,9 @@ the repository's top-level Dockerfile.
55
66*/
77pub ( crate ) mod error;
8- use error:: Result ;
98
10- use crate :: constants:: { SDK_VAR , TOOLCHAIN_VAR } ;
119use duct:: cmd;
10+ use error:: Result ;
1211use lazy_static:: lazy_static;
1312use nonzero_ext:: nonzero;
1413use rand:: Rng ;
@@ -23,6 +22,7 @@ use std::path::{Path, PathBuf};
2322use std:: process:: Output ;
2423use walkdir:: { DirEntry , WalkDir } ;
2524
25+ use crate :: args:: { BuildPackageArgs , BuildVariantArgs } ;
2626use buildsys:: manifest:: { ImageFeature , ImageFormat , ImageLayout , PartitionPlan , SupportedArch } ;
2727
2828const TOOLS_DIR : & str = "TWOLITER_TOOLS_DIR" ;
@@ -91,20 +91,20 @@ pub(crate) struct PackageBuilder;
9191impl PackageBuilder {
9292 /// Build RPMs for the specified package.
9393 pub ( crate ) fn build (
94+ build_packages_args : & BuildPackageArgs ,
9495 package : & str ,
9596 image_features : Option < HashSet < & ImageFeature > > ,
9697 ) -> Result < Self > {
97- let output_dir: PathBuf = getenv ( "BUILDSYS_PACKAGES_DIR" ) ?. into ( ) ;
98- let arch = getenv ( "BUILDSYS_ARCH" ) ?;
99- let goarch = serde_plain:: from_str :: < SupportedArch > ( & arch)
100- . context ( error:: UnsupportedArchSnafu { arch : & arch } ) ?
98+ let arch = & build_packages_args. common . arch ;
99+ let goarch = serde_plain:: from_str :: < SupportedArch > ( arch)
100+ . context ( error:: UnsupportedArchSnafu { arch } ) ?
101101 . goarch ( ) ;
102102
103103 let mut args = Vec :: new ( ) ;
104104 args. push ( "--network" . into ( ) ) ;
105105 args. push ( "none" . into ( ) ) ;
106106 args. build_arg ( "PACKAGE" , package) ;
107- args. build_arg ( "ARCH" , & arch) ;
107+ args. build_arg ( "ARCH" , arch) ;
108108 args. build_arg ( "GOARCH" , goarch) ;
109109
110110 // Pass certain environment variables into the build environment. These variables aren't
@@ -136,7 +136,18 @@ impl PackageBuilder {
136136 }
137137 }
138138
139- build ( BuildType :: Package , package, & arch, args, & tag, & output_dir) ?;
139+ build (
140+ BuildType :: Package ,
141+ package,
142+ arch,
143+ args,
144+ & tag,
145+ & build_packages_args. packages_dir ,
146+ & build_packages_args. common . root_dir ,
147+ & build_packages_args. common . state_dir ,
148+ & build_packages_args. common . sdk_image ,
149+ & build_packages_args. common . toolchain ,
150+ ) ?;
140151
141152 Ok ( Self )
142153 }
@@ -147,18 +158,16 @@ pub(crate) struct VariantBuilder;
147158impl VariantBuilder {
148159 /// Build a variant with the specified packages installed.
149160 pub ( crate ) fn build (
161+ build_variant_args : & BuildVariantArgs ,
150162 packages : & [ String ] ,
151163 image_format : Option < & ImageFormat > ,
152164 image_layout : Option < & ImageLayout > ,
153165 kernel_parameters : Option < & Vec < String > > ,
154166 image_features : Option < HashSet < & ImageFeature > > ,
155167 ) -> Result < Self > {
156- let output_dir: PathBuf = getenv ( "BUILDSYS_OUTPUT_DIR" ) ?. into ( ) ;
157-
158- let variant = getenv ( "BUILDSYS_VARIANT" ) ?;
159- let arch = getenv ( "BUILDSYS_ARCH" ) ?;
160- let goarch = serde_plain:: from_str :: < SupportedArch > ( & arch)
161- . context ( error:: UnsupportedArchSnafu { arch : & arch } ) ?
168+ let arch = & build_variant_args. common . arch ;
169+ let goarch = serde_plain:: from_str :: < SupportedArch > ( arch)
170+ . context ( error:: UnsupportedArchSnafu { arch } ) ?
162171 . goarch ( ) ;
163172
164173 let image_layout = image_layout. cloned ( ) . unwrap_or_default ( ) ;
@@ -176,13 +185,13 @@ impl VariantBuilder {
176185 args. push ( "--network" . into ( ) ) ;
177186 args. push ( "host" . into ( ) ) ;
178187 args. build_arg ( "PACKAGES" , packages. join ( " " ) ) ;
179- args. build_arg ( "ARCH" , & arch) ;
188+ args. build_arg ( "ARCH" , arch) ;
180189 args. build_arg ( "GOARCH" , goarch) ;
181- args. build_arg ( "VARIANT" , & variant) ;
182- args. build_arg ( "VERSION_ID" , getenv ( "BUILDSYS_VERSION_IMAGE" ) ? ) ;
183- args. build_arg ( "BUILD_ID" , getenv ( "BUILDSYS_VERSION_BUILD" ) ? ) ;
184- args. build_arg ( "PRETTY_NAME" , getenv ( "BUILDSYS_PRETTY_NAME" ) ? ) ;
185- args. build_arg ( "IMAGE_NAME" , getenv ( "BUILDSYS_NAME" ) ? ) ;
190+ args. build_arg ( "VARIANT" , & build_variant_args . variant ) ;
191+ args. build_arg ( "VERSION_ID" , & build_variant_args . version_image ) ;
192+ args. build_arg ( "BUILD_ID" , & build_variant_args . version_build ) ;
193+ args. build_arg ( "PRETTY_NAME" , & build_variant_args . pretty_name ) ;
194+ args. build_arg ( "IMAGE_NAME" , & build_variant_args . name ) ;
186195 args. build_arg (
187196 "IMAGE_FORMAT" ,
188197 match image_format {
@@ -222,17 +231,24 @@ impl VariantBuilder {
222231 // Add known secrets to the build argments.
223232 add_secrets ( & mut args) ?;
224233
225- // Always rebuild variants since they are located in a different workspace,
226- // and don't directly track changes in the underlying packages.
227- getenv ( "BUILDSYS_TIMESTAMP" ) ?;
228-
229234 let tag = format ! (
230235 "buildsys-var-{variant}-{arch}" ,
231- variant = variant,
236+ variant = build_variant_args . variant,
232237 arch = arch
233238 ) ;
234239
235- build ( BuildType :: Variant , & variant, & arch, args, & tag, & output_dir) ?;
240+ build (
241+ BuildType :: Variant ,
242+ & build_variant_args. variant ,
243+ arch,
244+ args,
245+ & tag,
246+ & build_variant_args. common . output_dir ,
247+ & build_variant_args. common . root_dir ,
248+ & build_variant_args. common . state_dir ,
249+ & build_variant_args. common . sdk_image ,
250+ & build_variant_args. common . toolchain ,
251+ ) ?;
236252
237253 Ok ( Self )
238254 }
@@ -246,33 +262,34 @@ enum BuildType {
246262}
247263
248264/// Invoke a series of `docker` commands to drive a package or variant build.
265+ // TODO - refactor this and the builders a bit to have fewer arguments
266+ #[ allow( clippy:: too_many_arguments) ]
249267fn build (
250268 kind : BuildType ,
251269 what : & str ,
252270 arch : & str ,
253271 build_args : Vec < String > ,
254272 tag : & str ,
255273 output_dir : & PathBuf ,
274+ root : & PathBuf ,
275+ state_dir : & Path ,
276+ sdk : & str ,
277+ toolchain : & str ,
256278) -> Result < ( ) > {
257- let root = getenv ( "BUILDSYS_ROOT_DIR" ) ?;
258- env:: set_current_dir ( & root) . context ( error:: DirectoryChangeSnafu { path : & root } ) ?;
279+ env:: set_current_dir ( root) . context ( error:: DirectoryChangeSnafu { path : root } ) ?;
259280
260281 // Compute a per-checkout prefix for the tag to avoid collisions.
261282 let mut d = Sha512 :: new ( ) ;
262- d. update ( & root) ;
283+ d. update ( root. display ( ) . to_string ( ) ) ;
263284 let digest = hex:: encode ( d. finalize ( ) ) ;
264285 let token = & digest[ ..12 ] ;
265286 let tag = format ! ( "{}-{}" , tag, token) ;
266287
267- // Our SDK and toolchain are picked by the external `cargo make` invocation.
268- let sdk = getenv ( SDK_VAR ) ?;
269- let toolchain = getenv ( TOOLCHAIN_VAR ) ?;
270-
271288 // Avoid using a cached layer from a previous build.
272289 let nocache = rand:: thread_rng ( ) . gen :: < u32 > ( ) ;
273290
274291 // Create a directory for tracking outputs before we move them into position.
275- let build_dir = create_build_dir ( & kind, what, arch) ?;
292+ let build_dir = create_build_dir ( & kind, what, arch, state_dir ) ?;
276293
277294 // Clean up any previous outputs we have tracked.
278295 clean_build_files ( & build_dir, output_dir) ?;
@@ -428,13 +445,13 @@ fn add_secrets(args: &mut Vec<String>) -> Result<()> {
428445// =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^=
429446
430447/// Create a directory for build artifacts.
431- fn create_build_dir ( kind : & BuildType , name : & str , arch : & str ) -> Result < PathBuf > {
448+ fn create_build_dir ( kind : & BuildType , name : & str , arch : & str , state_dir : & Path ) -> Result < PathBuf > {
432449 let prefix = match kind {
433450 BuildType :: Package => "packages" ,
434451 BuildType :: Variant => "variants" ,
435452 } ;
436453
437- let path = [ & getenv ( "BUILDSYS_STATE_DIR" ) ? , arch, prefix, name]
454+ let path = [ & state_dir . display ( ) . to_string ( ) , arch, prefix, name]
438455 . iter ( )
439456 . collect ( ) ;
440457
@@ -590,14 +607,6 @@ where
590607 . filter ( |e| e. is_file ( ) || e. is_symlink ( ) )
591608}
592609
593- /// Retrieve a BUILDSYS_* variable that we expect to be set in the environment,
594- /// and ensure that we track it for changes, since it will directly affect the
595- /// output.
596- fn getenv ( var : & str ) -> Result < String > {
597- println ! ( "cargo:rerun-if-env-changed={}" , var) ;
598- env:: var ( var) . context ( error:: EnvironmentSnafu { var } )
599- }
600-
601610// =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^=
602611
603612/// Helper trait for constructing buildkit --build-arg arguments.
0 commit comments