Skip to content
23 changes: 14 additions & 9 deletions craft_platforms/charm/_build.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,14 +86,18 @@ def _validate_base_definition( # noqa: PLR0912
"the incompatible 'build-for' entry for the platform."
),
)
# create a set of the bases defined in the build-on and build-for entries
# create a set of the bases defined in the build-on and build-for entries.
# devel series bases in build-on are allowed to differ from build-for bases,
# so they are excluded from the consistency check.
bases = set()
for entry in [
*_utils.vectorize(platform.get("build-on", [platform_name])),
*_utils.vectorize(platform.get("build-for", [platform_name])),
]:
for entry in _utils.vectorize(platform.get("build-for", [platform_name])):
distro_base, _ = _architectures.parse_base_and_architecture(arch=entry)
bases.add(str(distro_base) if distro_base else None)
for entry in _utils.vectorize(platform.get("build-on", [platform_name])):
distro_base, _ = _architectures.parse_base_and_architecture(arch=entry)
# Allow devel series in build-on to differ from the build-for base.
if distro_base is None or distro_base.series != "devel":
bases.add(str(distro_base) if distro_base else None)

if len(bases) == 0:
# an empty set means no bases are defined
Expand Down Expand Up @@ -166,8 +170,9 @@ def _get_base_from_build_data(
if platform_base:
return platform_base

# build-on and build-for entries all have the same base, so we only
# need to check one of them
# When build-on and build-for entries share a common base, use it.
# If build-on has a devel base and build-for has a stable base, the product
# loop in get_platforms_charm_build_plan will use the per-entry build-on base.
if platform:
build_for_base, _ = _architectures.parse_base_and_architecture(
arch=_utils.vectorize(platform["build-for"])[0]
Expand Down Expand Up @@ -281,7 +286,7 @@ def get_platforms_charm_build_plan(
_utils.vectorize(platform.get("build-on", [platform_name])),
_utils.vectorize(platform.get("build-for", [platform_name])),
):
_, build_on_arch = _architectures.parse_base_and_architecture(
build_on_base, build_on_arch = _architectures.parse_base_and_architecture(
arch=build_on
)
if build_on_arch == "all":
Expand All @@ -298,7 +303,7 @@ def get_platforms_charm_build_plan(
platform=platform_name,
build_on=build_on_arch,
build_for=build_for_arch,
build_base=distro_base,
build_base=build_on_base if build_on_base is not None else distro_base,
),
)

Expand Down
90 changes: 87 additions & 3 deletions tests/unit/charm/test_build.py
Original file line number Diff line number Diff line change
Expand Up @@ -528,6 +528,88 @@ def test_build_plans_success(
],
id="multi-base-long-multi-build-on",
),
pytest.param(
None,
None,
{
"noble": {
"build-on": ["devel:amd64"],
"build-for": ["ubuntu@24.04:amd64"],
},
},
[
craft_platforms.BuildInfo(
"noble",
craft_platforms.DebianArchitecture("amd64"),
craft_platforms.DebianArchitecture("amd64"),
craft_platforms.DistroBase("ubuntu", "devel"),
),
],
id="multi-base-devel-build-on",
),
pytest.param(
None,
None,
{
"noble": {
"build-on": ["ubuntu@devel:amd64"],
"build-for": ["ubuntu@24.04:amd64"],
},
},
[
craft_platforms.BuildInfo(
"noble",
craft_platforms.DebianArchitecture("amd64"),
craft_platforms.DebianArchitecture("amd64"),
craft_platforms.DistroBase("ubuntu", "devel"),
),
],
id="multi-base-ubuntu-at-devel-build-on",
),
pytest.param(
None,
None,
{
"noble": {
"build-on": ["devel:amd64", "ubuntu@24.04:arm64"],
Comment thread
lengau marked this conversation as resolved.
Outdated
"build-for": ["ubuntu@24.04:amd64"],
},
},
[
craft_platforms.BuildInfo(
"noble",
craft_platforms.DebianArchitecture("amd64"),
craft_platforms.DebianArchitecture("amd64"),
craft_platforms.DistroBase("ubuntu", "devel"),
),
craft_platforms.BuildInfo(
"noble",
craft_platforms.DebianArchitecture("arm64"),
craft_platforms.DebianArchitecture("amd64"),
craft_platforms.DistroBase("ubuntu", "24.04"),
),
],
id="multi-base-devel-and-stable-build-on",
),
pytest.param(
None,
None,
{
"noble": {
"build-on": ["devel:amd64"],
"build-for": ["ubuntu@24.04:all"],
},
},
[
craft_platforms.BuildInfo(
"noble",
craft_platforms.DebianArchitecture("amd64"),
"all",
craft_platforms.DistroBase("ubuntu", "devel"),
),
],
id="multi-base-devel-build-on-all",
),
],
)
def test_build_plans_in_depth(base, build_base, platforms, expected):
Expand Down Expand Up @@ -774,9 +856,11 @@ def test_fuzz_get_platforms_build_plan_single_base(
build_ons=strategies.distro_series_arch_str(strategies.any_distro_base()),
build_fors=strategies.distro_series_arch_str(strategies.any_distro_base()),
).filter(
lambda p: (
{p["build-for"][0].partition(":")[0]}
== {on.partition(":")[0] for on in p["build-on"]}
lambda p: all(
on.partition(":")[0] == p["build-for"][0].partition(":")[0]
or on.partition(":")[0] == "devel"
or on.partition(":")[0].endswith("@devel")
for on in p["build-on"]
Comment thread
lengau marked this conversation as resolved.
Outdated
)
),
),
Expand Down