From patchwork Tue Sep 26 05:37:31 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Uladzimir Bely X-Patchwork-Id: 3124 Return-Path: Received: from shymkent.ilbers.de ([unix socket]) by shymkent (Cyrus 2.5.10-Debian-2.5.10-3+deb9u2) with LMTPA; Tue, 26 Sep 2023 07:37:55 +0200 X-Sieve: CMU Sieve 2.4 Received: from mail-lf1-f63.google.com (mail-lf1-f63.google.com [209.85.167.63]) by shymkent.ilbers.de (8.15.2/8.15.2/Debian-8+deb9u1) with ESMTPS id 38Q5brfg016868 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 26 Sep 2023 07:37:53 +0200 Received: by mail-lf1-f63.google.com with SMTP id 2adb3069b0e04-5041bea78a5sf11297001e87.3 for ; Mon, 25 Sep 2023 22:37:53 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1695706668; cv=pass; d=google.com; s=arc-20160816; b=0lOpbk82MzClR5zW9ypiti9M++XquJinsXXck3kWSxpRiF71iNLoeMxsgeg1VfDJTC YB9l7J6gaA8bh9IiUNK/3kEHH6JBWTVNklaYODOLOUBtvVzzsmcmPvipXlofv0Xc88XR EqTp8yfQK/6QSRTT+0wB9KQH7RBP4ctMWfmCpbxbD4ep97fC3Np5xpn+jnjXaa08gaue RnPezN/miwVKvV5LXLR7G3a55pkRwStGK1Wav7/edcXsWi5JnFHz9f0nyb9AYstvbBBM 54iilM5IALpbK9gS+k8f/YEZ9UDMzUK2J/fv7nKUYvsK78oO8bhN2igtxEL2XlWDpoq0 ++/w== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:mime-version:references:in-reply-to :message-id:date:subject:to:from:sender:dkim-signature; bh=gA88ujdngd0zaSraZIDHnQ+wSOoGO8+8YiwUPkvgd1E=; fh=7tclEdh7YbwSQowgJ6LNq720O7H5HTEaqj22NJWRE2E=; b=mr9dSfLiBKc40YxhZMz6WOxFdYytyuzqJTutaOPUiiDBBSqkPuGge+uzEI7iWVbEwW 4SjlQxR5c2NmhcrCHrb/7MHL9ofdhZXWIxTR3X/9V5IZny6yxEXwFTzwwjQjf/ZOPK+n G1XTorwlE8/JP0KywVyJscmPrRdLdA3IUcR+z462zBK5yxBuL1HR1on+0cNDkcVtuM/6 WLrj3rM7EIgZ3i/fDFU4E5nKqb4cC69iQTkhKzbkyhTf/PcJ/+TM46lu8vAdeEGdv/te XJmk4oq0bj5SKq8pde1HwYdNYj0fzDo58Sm4YfPwu8lldJCRxjLY2LVdR/OgI+Lu4G2o 9W0Q== ARC-Authentication-Results: i=2; gmr-mx.google.com; spf=pass (google.com: domain of ubely@ilbers.de designates 85.214.156.166 as permitted sender) smtp.mailfrom=ubely@ilbers.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20230601; t=1695706668; x=1696311468; darn=isar-build.org; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:x-original-authentication-results :x-original-sender:mime-version:references:in-reply-to:message-id :date:subject:to:from:sender:from:to:cc:subject:date:message-id :reply-to; bh=gA88ujdngd0zaSraZIDHnQ+wSOoGO8+8YiwUPkvgd1E=; b=xPHxrtml4rhGRDksFOu6iHLikYIcwh5rJVcn1KShmOHzCGnm8suzhd5M7BS0OwcDLu 37vVQgu2vz5KwSOM4hvg3vxIVETkd9h5HwaU/kaNMcOTERpXPK4q414Dee+OC9g9ImnU w8bzAD+w8DDXIBNhLjFimdn56Q05mYD0SYHIJM5CKwj/92jR0b/h8W2Oa9YymjDT/Dtg 30ldd9gNMJAF0O8tI/SlqIoWL3npp/rtrhE2+5lK0ry0XlvB/xiGQi4tDOUBUTpy9PC2 lK8fruS3Sd66FjrkNVPb8MGJVvoimpRojiC/RGFk7d7mphyDeoA58i6ieSg0Z4H+rBrj M+2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695706668; x=1696311468; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :x-spam-checked-in-group:list-id:mailing-list:precedence :x-original-authentication-results:x-original-sender:mime-version :references:in-reply-to:message-id:date:subject:to:from:x-beenthere :x-gm-message-state:sender:from:to:cc:subject:date:message-id :reply-to; bh=gA88ujdngd0zaSraZIDHnQ+wSOoGO8+8YiwUPkvgd1E=; b=bXq7KxBjLCYRnNsRtA4uCpUtpkwwngcr8G5sOi40gVcbdG9TasBQ7dl7+kzEcTn007 qjpUHEh96fGgN0PHEWwfM9BXwQPO38MJ+qVWNFu6KMmHTC2M15tWa5JKIf8YDytk0xZ6 iL8YtTcw5fF4UlL3Zl1PqsI26GFdKWZPTkPeff6jW5/vu9UcAg621wlceyao5scrkAfp 6mL+BtuCUee6jHGznaJFUaNH3TqgDmnMHewtGp1yFUlOBj6yH50BmkVgg8pv2pSoCYGE z2zTxqplfFqH/lHZJ5X9nvMj6DUJuk29VRNszt6C/LKetVoxLFyvinVoU+DbFWDEaTUi wYLQ== Sender: isar-users@googlegroups.com X-Gm-Message-State: AOJu0YxixdgLwoecP2KKxmNIsoBsUt6BLgFOSc6k0RRpPvl1x3xJjAt3 YjSN5x4ZP8AvMHmi3RY7czE= X-Google-Smtp-Source: AGHT+IFH/HoQkoQ+9bEslNxb0xJXd3z9ScRPChg+N4pBtoRCJr42tjitFDR5EiLyQhPD6y3yJaZ4Sw== X-Received: by 2002:a05:6512:3415:b0:4fe:94a1:da84 with SMTP id i21-20020a056512341500b004fe94a1da84mr7776150lfr.5.1695706667626; Mon, 25 Sep 2023 22:37:47 -0700 (PDT) X-BeenThere: isar-users@googlegroups.com Received: by 2002:a05:6512:52c:b0:503:7f5:6230 with SMTP id o12-20020a056512052c00b0050307f56230ls57849lfc.1.-pod-prod-09-eu; Mon, 25 Sep 2023 22:37:45 -0700 (PDT) X-Received: by 2002:a05:6512:2246:b0:4fe:db6:cb41 with SMTP id i6-20020a056512224600b004fe0db6cb41mr10285208lfu.39.1695706665586; Mon, 25 Sep 2023 22:37:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695706665; cv=none; d=google.com; s=arc-20160816; b=JpD0hNBkftw/ZT0Q7W6vp8CiI8F+zD9a0xvgR+wZNDeW2bNaUXZxbYxVtG00wko/Uu xTwIVALDbUiWjl95wKqhCxLxiapaPifQhg3ydd0VA8yuXCt1l6pXgbDxptNHVprzZp96 Kh9QFg1P2xZOhRr8nw6bxl9yscPFSfeMqvbkM5dkNCr2ygczn00HvuIbiaM4sOhcWsJW va4dD7G9zWbvoqFw1wzUxeddyesShIjNWs6ph2L+f9YD9pmT0NXv/TVg8mdJT1RLR/fx M7kzhudXlJrcH39fqTT+Xbzd31JtNBgidYHo2FdXYNOlnUrehiS2zodbomXiKLNwc7aC cinA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from; bh=NXDYg5WwIxhuOMF8DyCL8lK+pviZBGD1Q1dgWjVaCmo=; fh=7tclEdh7YbwSQowgJ6LNq720O7H5HTEaqj22NJWRE2E=; b=Rn/RDzYs0q2GfocldqQv2ZM475oYaLwsBzbCS2U1QdlOcYoz8pE5B8LMTYPFbSqMYq Q6J8vKtfGaK7rSDf3w8pCC+z17IDWMN01aYjjuaZVLjvoytLmKMMKzfE+FPExMVxcUFB Iv5CAGa6/m9ET1g6Tg0TedpfL6Keo/tyDBs0ajYt5isPDR40vfb9IU7KUX3n0qTsD6JC EEFWuJZA+2LVkWEBrmd/ord9dXk+4mh8yxUdXoeQNSeYs00M8xMpM/yftGuMYzIz3thM n6mn0SQ0duNlP02o07nuritHvwvsn4jmxiUNsBMnsdUo70nGNTj7xQAmmup+HB9iJZ9V 5syA== ARC-Authentication-Results: i=1; gmr-mx.google.com; spf=pass (google.com: domain of ubely@ilbers.de designates 85.214.156.166 as permitted sender) smtp.mailfrom=ubely@ilbers.de Received: from shymkent.ilbers.de (shymkent.ilbers.de. [85.214.156.166]) by gmr-mx.google.com with ESMTPS id a3-20020ac25e63000000b004ffa23b6e2asi758974lfr.5.2023.09.25.22.37.45 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Mon, 25 Sep 2023 22:37:45 -0700 (PDT) Received-SPF: pass (google.com: domain of ubely@ilbers.de designates 85.214.156.166 as permitted sender) client-ip=85.214.156.166; Received: from baighyz.m.ilbers.de (host-80-81-17-52.static.customer.m-online.net [80.81.17.52]) (authenticated bits=0) by shymkent.ilbers.de (8.15.2/8.15.2/Debian-8+deb9u1) with ESMTPSA id 38Q5bhxm016779 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 26 Sep 2023 07:37:44 +0200 From: Uladzimir Bely To: isar-users@googlegroups.com Subject: [PATCH v5 02/13] kas: Add a local copy of kas-container script Date: Tue, 26 Sep 2023 07:37:31 +0200 Message-Id: <20230926053742.11352-3-ubely@ilbers.de> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20230926053742.11352-1-ubely@ilbers.de> References: <20230926053742.11352-1-ubely@ilbers.de> MIME-Version: 1.0 X-Spam-Status: No, score=-0.9 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_EF,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_MSPIKE_H2,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on shymkent.ilbers.de X-Original-Sender: ubely@ilbers.de X-Original-Authentication-Results: gmr-mx.google.com; spf=pass (google.com: domain of ubely@ilbers.de designates 85.214.156.166 as permitted sender) smtp.mailfrom=ubely@ilbers.de Precedence: list Mailing-list: list isar-users@googlegroups.com; contact isar-users+owners@googlegroups.com List-ID: X-Spam-Checked-In-Group: isar-users@googlegroups.com X-Google-Group-Id: 914930254986 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= Taken from revision `044c7d0` (tag `4.0`) of `kas` project [1]. Basic usage: ``` ./kas/kas-container menu ./kas/kas-container build ./kas/kas-container shell ``` [1] https://github.com/siemens/kas Signed-off-by: Uladzimir Bely --- kas/kas-container | 562 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 562 insertions(+) create mode 100755 kas/kas-container diff --git a/kas/kas-container b/kas/kas-container new file mode 100755 index 00000000..8fa2d16e --- /dev/null +++ b/kas/kas-container @@ -0,0 +1,562 @@ +#!/bin/sh +# +# kas - setup tool for bitbake based projects +# +# Copyright (c) Siemens AG, 2018-2022 +# +# Authors: +# Jan Kiszka +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +set -e + +usage() +{ + printf "%b" "Usage: $0 [OPTIONS] { build | shell } [KASOPTIONS] [KASFILE]\n" + printf "%b" " $0 [OPTIONS] { checkout | dump } [KASOPTIONS] [KASFILE]\n" + printf "%b" " $0 [OPTIONS] for-all-repos [KASOPTIONS] [KASFILE] COMMAND\n" + printf "%b" " $0 [OPTIONS] { clean | cleansstate | cleanall}\n" + printf "%b" " $0 [OPTIONS] menu [KCONFIG]\n" + printf "%b" "\nPositional arguments:\n" + printf "%b" "build\t\t\tCheck out repositories and build target.\n" + printf "%b" "checkout\t\tCheck out repositories but do not build.\n" + printf "%b" "dump\t\t\tCheck out repositories and write flat version\n" + printf "%b" " \t\t\tof config to stdout.\n" + printf "%b" "shell\t\t\tRun a shell in the build environment.\n" + printf "%b" "for-all-repos\t\tRun specified command in each repository.\n" + printf "%b" "clean\t\t\tClean build artifacts, keep sstate cache and " \ + "downloads.\n" + printf "%b" "cleansstate\t\tClean build artifacts and sstate cache, " \ + "keep downloads.\n" + printf "%b" "cleanall\t\tClean build artifacts, sstate cache and " \ + "downloads.\n" + printf "%b" "menu\t\t\tProvide configuration menu and trigger " \ + "configured build.\n" + printf "%b" "\nOptional arguments:\n" + printf "%b" "--isar\t\t\tUse kas-isar container to build Isar image.\n" + printf "%b" "--with-loop-dev Pass a loop device to the " \ + "container. Only required if\n" + printf "%b" "\t\t\tloop-mounting is used by recipes.\n" + printf "%b" "--runtime-args\t\tAdditional arguments to pass to the " \ + "container runtime\n" + printf "%b" "\t\t\tfor running the build.\n" + printf "%b" "-d\t\t\tPrint debug output (deprecated, use -l debug).\n" + printf "%b" "-l, --log-level\t\tSet log level (default=info).\n" + printf "%b" "-v\t\t\tSame as -d (deprecated).\n" + printf "%b" "--version\t\tprint program version.\n" + printf "%b" "--ssh-dir\t\tDirectory containing SSH configurations.\n" + printf "%b" "\t\t\tAvoid \$HOME/.ssh unless you fully trust the " \ + "container.\n" + printf "%b" "--ssh-agent\t\tForward ssh-agent socket to the container.\n" + printf "%b" "--aws-dir\t\tDirectory containing AWScli configuration.\n" + printf "%b" "--git-credential-store\tFile path to the git credential " \ + "store\n" + printf "%b" "--no-proxy-from-env\tDo not inherit proxy settings from " \ + "environment.\n" + printf "%b" "--repo-ro\t\tMount current repository read-only\n" \ + "\t\t\t(default for build command)\n" + printf "%b" "--repo-rw\t\tMount current repository writeable\n" \ + "\t\t\t(default for shell command)\n" + printf "%b" "\n" + printf "%b" "You can force the use of podman over docker using " \ + "KAS_CONTAINER_ENGINE=podman.\n" + exit 1 +} + +trace() +{ + [ -n "${KAS_VERBOSE}" ] && echo "+ $*" >&2 + "$@" +} + +enable_isar_mode() { + if [ -n "${ISAR_MODE}" ]; then + return + fi + ISAR_MODE=1 + + KAS_CONTAINER_IMAGE_NAME_DEFAULT="kas-isar" + KAS_ISAR_ARGS="--privileged" + + if [ "${KAS_CONTAINER_ENGINE}" = "podman" ]; then + # sudo is needed for a privileged podman container + KAS_CONTAINER_COMMAND="sudo --preserve-env ${KAS_CONTAINER_COMMAND}" + # preserved user PATH may lack sbin needed by privileged podman + export PATH="${PATH}:/usr/sbin" + fi +} + +enable_oe_mode() { + if [ "${KAS_CONTAINER_ENGINE}" = "podman" ]; then + # The container entry point expects that the current userid + # calling "podman run" has a 1:1 mapping + KAS_RUNTIME_ARGS="${KAS_RUNTIME_ARGS} --userns=keep-id" + fi +} + +run_clean() { + if [ -n "${KAS_ISAR_ARGS}" ]; then + set_container_image_var + # SC2086: Double quote to prevent globbing and word splitting. + # shellcheck disable=2086 + trace ${KAS_CONTAINER_COMMAND} run -v "${KAS_BUILD_DIR}":/build:rw \ + --workdir=/build --rm ${KAS_ISAR_ARGS} \ + ${KAS_CONTAINER_IMAGE} \ + sudo rm -rf tmp + else + trace rm -rf "${KAS_BUILD_DIR}"/tmp* + fi + + if [ "$1" != "clean" ]; then + SSTATE_DIR=${SSTATE_DIR:-${KAS_BUILD_DIR}/sstate-cache} + trace rm -rf "${SSTATE_DIR}" + + if [ "$1" = "cleanall" ]; then + DL_DIR=${DL_DIR:-${KAS_BUILD_DIR}/downloads} + trace rm -rf "${DL_DIR}" + fi + fi +} + +KAS_IMAGE_VERSION_DEFAULT="4.0" +KAS_CONTAINER_IMAGE_PATH_DEFAULT="ghcr.io/siemens/kas" +KAS_CONTAINER_IMAGE_NAME_DEFAULT="kas" + +set_container_image_var() { + KAS_IMAGE_VERSION="${KAS_IMAGE_VERSION:-${KAS_IMAGE_VERSION_DEFAULT}}" + KAS_CONTAINER_IMAGE_NAME="${KAS_CONTAINER_IMAGE_NAME:-${KAS_CONTAINER_IMAGE_NAME_DEFAULT}}" + KAS_CONTAINER_IMAGE_PATH="${KAS_CONTAINER_IMAGE_PATH:-${KAS_CONTAINER_IMAGE_PATH_DEFAULT}}" + KAS_CONTAINER_IMAGE_DEFAULT="${KAS_CONTAINER_IMAGE_PATH}/${KAS_CONTAINER_IMAGE_NAME}:${KAS_IMAGE_VERSION}" + KAS_CONTAINER_IMAGE="${KAS_CONTAINER_IMAGE:-${KAS_CONTAINER_IMAGE_DEFAULT}}" +} + +KAS_WORK_DIR=$(readlink -fv "${KAS_WORK_DIR:-$(pwd)}") +# KAS_WORK_DIR needs to exist for the subsequent code +trace mkdir -p "${KAS_WORK_DIR}" +KAS_BUILD_DIR=$(readlink -fv "${KAS_BUILD_DIR:-${KAS_WORK_DIR}/build}") +trace mkdir -p "${KAS_BUILD_DIR}" + +KAS_CONTAINER_ENGINE="${KAS_CONTAINER_ENGINE:-${KAS_DOCKER_ENGINE}}" +if [ -z "${KAS_CONTAINER_ENGINE}" ]; then + # Try to auto-detect a container engine + if command -v docker >/dev/null; then + case $(docker -v 2>/dev/null) in + podman*) + # The docker command is an alias for podman + KAS_CONTAINER_ENGINE=podman + ;; + Docker*) + # The docker command is the real docker + KAS_CONTAINER_ENGINE=docker + ;; + *) + # The docker command is an unknown engine + echo "$0: docker command found, but unknown engine detected" >&2 + exit 1 + esac + elif command -v podman >/dev/null; then + KAS_CONTAINER_ENGINE=podman + else + echo "$0: no container engine found, need docker or podman" >&2 + exit 1 + fi +fi + +KAS_RUNTIME_ARGS="--log-driver=none --user=root" + +case "${KAS_CONTAINER_ENGINE}" in +docker) + KAS_CONTAINER_COMMAND="docker" + ;; +podman) + KAS_CONTAINER_COMMAND="podman" + KAS_RUNTIME_ARGS="${KAS_RUNTIME_ARGS} --security-opt label=disable" + ;; +*) + echo "$0: unknown container engine '${KAS_CONTAINER_ENGINE}'" >&2 + exit 1 + ;; +esac + +# parse kas-container options +while [ $# -gt 0 ]; do + case "$1" in + --isar) + enable_isar_mode + shift 1 + ;; + --with-loop-dev) + if ! KAS_LOOP_DEV=$(/sbin/losetup -f 2>/dev/null); then + if [ "$(id -u)" -eq 0 ]; then + echo "Error: loop device not available!" + exit 1 + fi + sudo_command="/sbin/losetup -f" + sudo_message="[sudo] enter password to setup loop" + sudo_message="$sudo_message devices by calling" + sudo_message="$sudo_message '$sudo_command': " + # SC2086: Double quote to prevent globbing and word splitting. + # shellcheck disable=2086 + if ! KAS_LOOP_DEV=$(sudo -p "$sudo_message" $sudo_command \ + 2>/dev/null); then + echo "Error: loop device setup unsuccessful!" + echo "try calling '$sudo_command' with root" \ + "permissions manually." + exit 1 + fi + fi + KAS_WITH_LOOP_DEV="--device ${KAS_LOOP_DEV}" + shift 1 + ;; + --runtime-args|--docker-args) + [ $# -gt 0 ] || usage + KAS_RUNTIME_ARGS="${KAS_RUNTIME_ARGS} $2" + shift 2 + ;; + --ssh-dir) + [ $# -gt 2 ] || usage + KAS_SSH_DIR="$2" + shift 2 + ;; + --ssh-agent) + KAS_SSH_AUTH_SOCK=$(readlink -fv "$SSH_AUTH_SOCK") + shift 1 + ;; + --aws-dir) + [ $# -gt 2 ] || usage + KAS_AWS_DIR="$2" + shift 2 + ;; + --git-credential-store) + [ $# -gt 2 ] || usage + KAS_GIT_CREDENTIAL_STORE="$2" + shift 2 + ;; + --no-proxy-from-env) + KAS_NO_PROXY_FROM_ENV=1 + shift 1 + ;; + --repo-ro) + KAS_REPO_MOUNT_OPT="ro" + shift 1 + ;; + --repo-rw) + KAS_REPO_MOUNT_OPT="rw" + shift 1 + ;; + -v | -d) + KAS_VERBOSE=1 + KAS_OPTIONS_DIRECT="${KAS_OPTIONS_DIRECT} -d" + shift 1 + ;; + -l | --log-level) + if [ "$2" = "debug" ]; then + KAS_VERBOSE=1 + fi + KAS_OPTIONS_DIRECT="${KAS_OPTIONS_DIRECT} -l $2" + shift 2 + ;; + --version) + echo "$(basename "$0") $KAS_IMAGE_VERSION_DEFAULT" + exit 0 + ;; + --*) + usage + ;; + clean|cleansstate|cleanall) + [ $# -eq 1 ] || usage + run_clean "$1" + exit 0 + ;; + shell) + KAS_REPO_MOUNT_OPT_DEFAULT="rw" + KAS_CMD=$1 + shift 1 + break + ;; + build|checkout|for-all-repos|menu) + KAS_REPO_MOUNT_OPT_DEFAULT="ro" + KAS_CMD=$1 + shift 1 + break + ;; + dump) + if printf '%s\0' "$@" | grep -xqz -- '--inplace\|-i'; then + KAS_REPO_MOUNT_OPT_DEFAULT="rw" + else + KAS_REPO_MOUNT_OPT_DEFAULT="ro" + fi + KAS_CMD=$1 + shift 1 + break + ;; + *) + usage + ;; + esac +done + +[ -n "${KAS_CMD}" ] || usage + +KAS_EXTRA_BITBAKE_ARGS=0 + +# parse kas sub-command options +while [ $# -gt 0 ] && [ $KAS_EXTRA_BITBAKE_ARGS -eq 0 ]; do + case "$1" in + --skip|--target|--task) + KAS_OPTIONS="${KAS_OPTIONS} $1 $2" + shift 2 + ;; + -c|--cmd|--command) + KAS_BITBAKE_C_OPTION_ARGS="$2" + shift 2 + ;; + -E|--preserve-env) + echo "$1 is not supported with kas-container" + exit 1 + ;; + --) + KAS_EXTRA_BITBAKE_ARGS=$# + ;; + -*) + KAS_OPTIONS="${KAS_OPTIONS} $1" + shift 1 + ;; + *) + KAS_FILES= + # SC2086: Double quote to prevent globbing and word splitting. + # shellcheck disable=2086 + for FILE in $(IFS=':'; echo $1); do + if ! KAS_REAL_FILE="$(realpath -qe "$FILE")"; then + echo "Error: configuration file '${FILE}' not found" + exit 1 + fi + if [ -z "${KAS_FILES}" ]; then + KAS_FIRST_FILE="${KAS_REAL_FILE}" + KAS_FILES="${KAS_REAL_FILE}" + else + KAS_FILES="${KAS_FILES}:${KAS_REAL_FILE}" + fi + done + shift 1 + if [ "$KAS_CMD" = "for-all-repos" ]; then + KAS_REPO_CMD="$1" + shift 1 + fi + ;; + esac +done + +if [ -n "${KAS_FIRST_FILE}" ]; then + KAS_FILE_DIR="$(dirname "${KAS_FIRST_FILE}")" + KAS_REPO_DIR=$(git -C "${KAS_FILE_DIR}" rev-parse --show-toplevel 2>/dev/null) \ + || KAS_REPO_DIR=$(hg --cwd "${KAS_FILE_DIR}" root 2>/dev/null) \ + || KAS_REPO_DIR=${KAS_FILE_DIR} +else + KAS_REPO_DIR=$(pwd) +fi + +SOURCE_DIR_HOST=$( + grep -e "^_source_dir_host: " "${KAS_WORK_DIR}/.config.yaml" 2>/dev/null | \ + sed 's/_source_dir_host:[ ]\+//') +if [ -n "${SOURCE_DIR_HOST}" ]; then + KAS_REPO_DIR="${SOURCE_DIR_HOST}" +fi + +if [ "${KAS_CMD}" = "menu" ]; then + if [ -z "${KAS_FIRST_FILE}" ]; then + KAS_FIRST_FILE="Kconfig" + fi + + # When using the menu plugin, we need to track the KAS_REPO_DIR outside + # of the container to later allow a simple `kas-container build`. For + # that, we tell the kas menu plugin via an env-var about the location + # on the host. This data is then added to the .config.yaml where it can + # be evaluated by the next invocation of kas-container. + + if ! [ "$(realpath -qe "${KAS_REPO_DIR}")" = "$(realpath -qe "${KAS_WORK_DIR}")" ]; then + set -- "$@" -e _KAS_REPO_DIR_HOST="$(readlink -fv "${KAS_REPO_DIR}")" + fi + + BUILD_SYSTEM=$(tr '\n' '\f' 2>/dev/null < ${KAS_FIRST_FILE} | \ + sed -e 's/\(.*\fconfig KAS_BUILD_SYSTEM\f\(.*\)\|.*\)/\2/' \ + -e 's/\f\([[:alpha:]].*\|$\)//' \ + -e 's/.*default \"\(.*\)\".*/\1/') +else + if [ -z "${KAS_FIRST_FILE}" ]; then + KAS_FIRST_FILE="${KAS_WORK_DIR}/.config.yaml" + fi + + BUILD_SYSTEM=$(grep -e "^build_system: " "${KAS_FIRST_FILE}" 2>/dev/null | \ + sed 's/build_system:[ ]\+//') +fi + +if [ "${BUILD_SYSTEM}" = "isar" ]; then + enable_isar_mode +elif [ -z "${ISAR_MODE}" ]; then + enable_oe_mode +fi + +set_container_image_var + +KAS_REPO_MOUNT_OPT="${KAS_REPO_MOUNT_OPT:-${KAS_REPO_MOUNT_OPT_DEFAULT}}" + +KAS_FILES="$(echo "${KAS_FILES}" | sed 's|'"${KAS_REPO_DIR}"'/|/repo/|g')" + +if [ "$(id -u)" -eq 0 ] && [ "${KAS_ALLOW_ROOT}" != "yes" ] ; then + echo "Error: Running as root - may break certain recipes." + echo "Better give a regular user docker access. Set" \ + "KAS_ALLOW_ROOT=yes to override." + exit 1 +fi + +set -- "$@" -v "${KAS_REPO_DIR}":/repo:${KAS_REPO_MOUNT_OPT} \ + -v "${KAS_WORK_DIR}":/work:rw -e KAS_WORK_DIR=/work \ + -v "${KAS_BUILD_DIR}":/build:rw \ + --workdir=/repo \ + -e KAS_BUILD_DIR=/build \ + -e USER_ID="$(id -u)" -e GROUP_ID="$(id -g)" --rm --init + +if [ -n "${KAS_SSH_DIR}" ] ; then + if [ ! -d "${KAS_SSH_DIR}" ]; then + echo "Passed KAS_SSH_DIR '${KAS_SSH_DIR}' is not a directory" + exit 1 + fi + set -- "$@" -v "$(readlink -fv "${KAS_SSH_DIR}")":/var/kas/userdata/.ssh:ro +fi + +if [ -n "${KAS_SSH_AUTH_SOCK}" ]; then + if [ ! -S "${KAS_SSH_AUTH_SOCK}" ]; then + echo "Passed SSH_AUTH_SOCK '${KAS_SSH_AUTH_SOCK}' is not a socket" + exit 1 + fi + set -- "$@" -v "${KAS_SSH_AUTH_SOCK}":/ssh-agent/ssh-auth-sock \ + -e SSH_AUTH_SOCK=/ssh-agent/ssh-auth-sock +fi + +if [ -n "${KAS_AWS_DIR}" ] ; then + if [ ! -d "${KAS_AWS_DIR}" ]; then + echo "Passed KAS_AWS_DIR '${KAS_AWS_DIR}' is not a directory" + exit 1 + fi + set -- "$@" -v "$(readlink -fv "${KAS_AWS_DIR}")":/var/kas/userdata/.aws:ro \ + -e AWS_CONFIG_FILE="${AWS_CONFIG_FILE:-/var/kas/userdata/.aws/config}" \ + -e AWS_SHARED_CREDENTIALS_FILE="${AWS_SHARED_CREDENTIALS_FILE:-/var/kas/userdata/.aws/credentials}" +fi + +KAS_GIT_CREDENTIAL_HELPER_DEFAULT="" + +if [ -n "${KAS_GIT_CREDENTIAL_STORE}" ] ; then + if [ ! -f "${KAS_GIT_CREDENTIAL_STORE}" ]; then + echo "Passed KAS_GIT_CREDENTIAL_STORE '${KAS_GIT_CREDENTIAL_STORE}' is not a file" + exit 1 + fi + KAS_GIT_CREDENTIAL_HELPER_DEFAULT="store --file=/var/kas/userdata/.git-credentials" + set -- "$@" -v "$(readlink -fv "${KAS_GIT_CREDENTIAL_STORE}")":/var/kas/userdata/.git-credentials:ro +fi + +GIT_CREDENTIAL_HELPER="${GIT_CREDENTIAL_HELPER:-${KAS_GIT_CREDENTIAL_HELPER_DEFAULT}}" + +if [ -n "${GIT_CREDENTIAL_HELPER}" ] ; then + set -- "$@" -e GIT_CREDENTIAL_HELPER="${GIT_CREDENTIAL_HELPER}" +fi + +if [ -f "${NETRC_FILE}" ]; then + set -- "$@" -v "$(readlink -fv "${NETRC_FILE}")":/var/kas/userdata/.netrc:ro \ + -e NETRC_FILE="/var/kas/userdata/.netrc" +fi + +if [ -t 1 ]; then + set -- "$@" -t -i +fi + +if [ -n "${DL_DIR}" ]; then + trace mkdir -p "${DL_DIR}" + set -- "$@" \ + -v "$(readlink -fv "${DL_DIR}")":/downloads:rw \ + -e DL_DIR=/downloads +fi + +if [ -n "${SSTATE_DIR}" ]; then + trace mkdir -p "${SSTATE_DIR}" + set -- "$@" \ + -v "$(readlink -fv "${SSTATE_DIR}")":/sstate:rw \ + -e SSTATE_DIR=/sstate +fi + +if [ -n "${KAS_REPO_REF_DIR}" ]; then + if [ ! -d "${KAS_REPO_REF_DIR}" ]; then + echo "Passed KAS_REPO_REF_DIR '${KAS_REPO_REF_DIR}' is not a directory" + exit 1 + fi + set -- "$@" \ + -v "$(readlink -fv "${KAS_REPO_REF_DIR}")":/repo-ref:rw \ + -e KAS_REPO_REF_DIR=/repo-ref +fi + +for var in TERM KAS_DISTRO KAS_MACHINE KAS_TARGET KAS_TASK \ + KAS_PREMIRRORS DISTRO_APT_PREMIRRORS BB_NUMBER_THREADS PARALLEL_MAKE \ + GIT_CREDENTIAL_USEHTTPPATH; do + if [ -n "$(eval echo \$${var})" ]; then + set -- "$@" -e "${var}=$(eval echo \"\$${var}\")" + fi +done + +# propagate only supported SHELL settings +case "$SHELL" in +/bin/sh|/bin/bash|/bin/dash) + set -- "$@" -e "SHELL=$SHELL" + ;; +*) + set -- "$@" -e "SHELL=/bin/bash" + ;; +esac + +if [ -z "${KAS_NO_PROXY_FROM_ENV+x}" ]; then + for var in http_proxy https_proxy ftp_proxy no_proxy NO_PROXY; do + if [ -n "$(eval echo \$${var})" ]; then + set -- "$@" -e "${var}=$(eval echo \$${var})" + fi + done +fi + +# SC2086: Double quote to prevent globbing and word splitting. +# shellcheck disable=2086 +set -- "$@" ${KAS_ISAR_ARGS} ${KAS_WITH_LOOP_DEV} ${KAS_RUNTIME_ARGS} \ + ${KAS_CONTAINER_IMAGE} ${KAS_OPTIONS_DIRECT} ${KAS_CMD} ${KAS_OPTIONS} +if [ -n "${KAS_BITBAKE_C_OPTION_ARGS}" ]; then + set -- "$@" -c "${KAS_BITBAKE_C_OPTION_ARGS}" +fi +# SC2086: Double quote to prevent globbing and word splitting. +# shellcheck disable=2086 +set -- "$@" ${KAS_FILES} +if [ "$KAS_CMD" = "for-all-repos" ]; then + set -- "$@" "${KAS_REPO_CMD}" +fi + +# rotate any extra bitbake args from the front to the end of the argument list +while [ $KAS_EXTRA_BITBAKE_ARGS -gt 0 ]; do + arg="$1" + shift 1 + set -- "$@" "$arg" + KAS_EXTRA_BITBAKE_ARGS=$((KAS_EXTRA_BITBAKE_ARGS - 1)) +done + +trace ${KAS_CONTAINER_COMMAND} run "$@"