4747# This version will receive the ':v1' tag.
4848DEFAULT_VERSION = 'legacy'
4949
50+ # Defines the dependency graph for base images.
51+ IMAGE_DEPENDENCIES = {
52+ 'base-clang' : ['base-image' ],
53+ 'base-clang-full' : ['base-clang' ],
54+ 'base-builder' : ['base-clang' ],
55+ 'base-builder-go' : ['base-builder' ],
56+ 'base-builder-javascript' : ['base-builder' ],
57+ 'base-builder-jvm' : ['base-builder' ],
58+ 'base-builder-python' : ['base-builder' ],
59+ 'base-builder-ruby' : ['base-builder' ],
60+ 'base-builder-rust' : ['base-builder' ],
61+ 'base-builder-swift' : ['base-builder' ],
62+ 'base-runner' : ['base-image' , 'base-builder' ],
63+ 'base-runner-debug' : ['base-runner' ],
64+ 'indexer' : ['base-clang-full' ],
65+ }
66+
5067
5168class ImageConfig :
5269 """Configuration for a specific base image version."""
@@ -85,6 +102,8 @@ def _resolve_dockerfile(self) -> str:
85102 if os .path .exists (versioned_dockerfile ):
86103 logging .info ('Using versioned Dockerfile: %s' , versioned_dockerfile )
87104 return versioned_dockerfile
105+ raise FileNotFoundError (
106+ f'Versioned Dockerfile not found for { self .name } :{ self .version } ' )
88107
89108 legacy_dockerfile = os .path .join (self .path , 'Dockerfile' )
90109 logging .info ('Using legacy Dockerfile: %s' , legacy_dockerfile )
@@ -156,6 +175,8 @@ def full_image_name_with_tag(self) -> str:
156175def get_base_image_steps (images : Sequence [ImageConfig ]) -> list [dict ]:
157176 """Returns build steps for a given list of image configurations."""
158177 steps = [build_lib .get_git_clone_step ()]
178+ build_ids = {}
179+
159180 for image_config in images :
160181 # The final tag is ':v1' for the default version, or the version name
161182 # (e.g., ':ubuntu-24-04') for others.
@@ -167,11 +188,20 @@ def get_base_image_steps(images: Sequence[ImageConfig]) -> list[dict]:
167188 tags .append (f'{ IMAGE_NAME_PREFIX } { image_config .name } :latest' )
168189
169190 dockerfile_path = os .path .join ('oss-fuzz' , image_config .dockerfile_path )
170- steps .append (
171- build_lib .get_docker_build_step (tags ,
172- image_config .path ,
173- dockerfile_path = dockerfile_path ,
174- build_args = image_config .build_args ))
191+ step = build_lib .get_docker_build_step (tags ,
192+ image_config .path ,
193+ dockerfile_path = dockerfile_path ,
194+ build_args = image_config .build_args )
195+
196+ # Check for dependencies and add 'waitFor' if necessary.
197+ dependencies = IMAGE_DEPENDENCIES .get (image_config .name , [])
198+ wait_for = [build_ids [dep ] for dep in dependencies if dep in build_ids ]
199+ if wait_for :
200+ step ['waitFor' ] = wait_for
201+
202+ build_ids [image_config .name ] = step ['id' ]
203+ steps .append (step )
204+
175205 return steps
176206
177207
0 commit comments