Source code for craft_platforms.rock._build

# This file is part of craft-platforms.
#
# Copyright 2024 Canonical Ltd.
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License version 3, as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
# SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License along
# with this program.  If not, see <http://www.gnu.org/licenses/>.
"""Rockcraft-specific platforms information."""

from typing import Optional, Sequence

from craft_platforms import _buildinfo, _errors, _platforms

_LEGACY_BASES_MAP = {
    "ubuntu:20.04": "[email protected]",
    "ubuntu:22.04": "[email protected]",
}


[docs]def get_rock_build_plan( base: str, platforms: _platforms.Platforms, build_base: Optional[str] = None, ) -> Sequence[_buildinfo.BuildInfo]: """Generate the build plan for a rock. This function uses the default build planner, but filters it to prevent the use of ``build-for: all`` :param base: the rock base (e.g. ``'[email protected]'``) :param platforms: the platforms structure in ``rockcraft.yaml`` :param build_base: the build base, if provided in ``rockcraft.yaml``. :raises NeedsBuildBaseError: If base is bare and no build base is specified """ # Bare bases require a build_base if base == "bare" and build_base is None: raise _errors.NeedBuildBaseError(base=base) if base in _LEGACY_BASES_MAP: base = _LEGACY_BASES_MAP[base] if build_base in _LEGACY_BASES_MAP: build_base = _LEGACY_BASES_MAP[build_base] for name, platform in platforms.items(): if platform and "all" in platform.get("build-for", []): raise _errors.InvalidPlatformError( name, details="Rockcraft cannot build platform-independent images.", resolution="Replace 'build-for: [all]' with a valid architecture", ) return _platforms.get_platforms_build_plan(base, platforms, build_base)