From patchwork Fri Sep 22 09:09:52 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Uladzimir Bely X-Patchwork-Id: 3109 Return-Path: Received: from shymkent.ilbers.de ([unix socket]) by shymkent (Cyrus 2.5.10-Debian-2.5.10-3+deb9u2) with LMTPA; Fri, 22 Sep 2023 11:10:30 +0200 X-Sieve: CMU Sieve 2.4 Received: from mail-lf1-f55.google.com (mail-lf1-f55.google.com [209.85.167.55]) by shymkent.ilbers.de (8.15.2/8.15.2/Debian-8+deb9u1) with ESMTPS id 38M9ASPS032068 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Fri, 22 Sep 2023 11:10:29 +0200 Received: by mail-lf1-f55.google.com with SMTP id 2adb3069b0e04-5041a779c75sf2446403e87.2 for ; Fri, 22 Sep 2023 02:10:29 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1695373823; cv=pass; d=google.com; s=arc-20160816; b=GFDOglzKbsU92LPcQA/z3NpctDPi2v5FA7Nh8zOd9uOYH6QC3/jBVRYzi7km+pcMQD XjYFPNALTY5r3FpzwAA82SATwRz4krTr+fPIX8P0DtDE3vlu5LW9m/2tnrkMBuCyWOP+ /Yv3A9OpmC3cU1fRZNMaNWEmBnolB6sSEYlpi+fCkZm2DWc6MKkxZWXuHGeaJ3V3LuLj 3JT8c5YH+VU5V3aoe33o4alARbgD0ZF3bcFfoqfLKV3af/8O8y6SWHwc0NMISWnOu2YQ zJPzck+keJ22HgPIDR2w47y09pU1BWA0rIZHjnFLtkBbM7V2Upf01Zn4hUs+1YVmc737 0mKg== 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=2sHiOSF3vSKHTtdySFCK/qwvgoyjnptua5aLuaQ93YU=; fh=7tclEdh7YbwSQowgJ6LNq720O7H5HTEaqj22NJWRE2E=; b=HJnyMMD/T0iIwSRoP6r1ohso/pC8ZBHaLK+NtlbC8bjbEpMRqrdjJgguraPRN/nPod osWL+CU/zrnIOmn6dmFBKXDqkWxuIzQBJJE6XkyWLDpImzd+VVFNT6vlXEqKgCBJkBY+ 2WBxXEfrMVaJl8h2ZE7JL8QLzc6urIm8KHRsThVBmeReQbrgwX7UaGtsLt7zz7E3qpk0 aJI7+kwqtYDg6GS9Gtr/jIamnl98hO+Ms6fSiwvPerIkeKjtghcx3OuK9H/RkrzeFvJN jrqD83x310PvrUBH2+fJIQIa2nHkZdoxm7i94+WmcTWW2yKqxoSYVlTSgcDw2qKWo6/t B64g== 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=1695373823; x=1695978623; 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=2sHiOSF3vSKHTtdySFCK/qwvgoyjnptua5aLuaQ93YU=; b=v9DyQv4HAnorO0mdFaqMFc6riYUb3/bh/2NYvHGkQY8by8xWV5ClUWHTJcYn5XREs3 W8hF3ksSln79nzHQ+9rgTC0ynEaccnL0xQD4pcKJxD8oT/iyHOLfvcYs4ez9acSkEQac 3/0VjOC243/RAMxksr6zw864+HOdTXloCVZiE0JeO2VkJzRFrOiP2w9IQ7D04/GYtvhj SMHuH7S/W3EwaCWqze46hRIZE4lpnExxyy3xZjp9SPxH1miqsJEpcWNmryrNNLkynBg6 vpMfI9vzab4a3dvbxUk0MumyHQCHwcLhVb61FLMoiDPAkD0a1Yai2G/0Qg5SoRZyVTRw fyFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695373823; x=1695978623; 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=2sHiOSF3vSKHTtdySFCK/qwvgoyjnptua5aLuaQ93YU=; b=E0Rujv8q3OgDpCQ6LItNP/DvpXow6udF31r6zqt3pv/suB0zeDy5sjcMlzaQBBwa35 pInj5BciP1p+TBrOYGQNaYrWNRY4QgHx6NwNa3c1WYSULM/ZXdMHqX2jwan2v/YqbByE qhXoC4wbq8ztw3S3SwwdgnLiAQ/+YP3YTeI/JlhkkTkCMWV5TVkBQqUUQo+I56nDEQAN OZbgGx6ZtUgsF7jfzskohMvPVUNiwLiXLEYmD8gIjfnIraFGPmd0vNhS4KEdW1++kMw+ 3qNAusO5ktBWrHZ469ykr4R3yb8Y2O4L5IkHnao95zefPIA0sxoFMCmTUxHGxC1LVziW n55w== Sender: isar-users@googlegroups.com X-Gm-Message-State: AOJu0Yxd19XRH8EcL5bhhWU9lz4NjTX6R/hORWChREOQsLQ5Yqi74YEV Mm19AfSRQaavMlCYmMo36Bw= X-Google-Smtp-Source: AGHT+IESAj6TwuLUNz66w0NhghmRmXKyuhqYrlSGKGnGDOIYdCSkGBGiCp+MQ7CHb3YhRJtUv4kDIA== X-Received: by 2002:ac2:5dd7:0:b0:502:d302:e025 with SMTP id x23-20020ac25dd7000000b00502d302e025mr6590486lfq.2.1695373822547; Fri, 22 Sep 2023 02:10:22 -0700 (PDT) X-BeenThere: isar-users@googlegroups.com Received: by 2002:a19:8c1a:0:b0:504:21fa:eb91 with SMTP id o26-20020a198c1a000000b0050421faeb91ls559897lfd.0.-pod-prod-02-eu; Fri, 22 Sep 2023 02:10:20 -0700 (PDT) X-Received: by 2002:ac2:5a50:0:b0:500:90d1:90a6 with SMTP id r16-20020ac25a50000000b0050090d190a6mr6863851lfn.63.1695373820318; Fri, 22 Sep 2023 02:10:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695373820; cv=none; d=google.com; s=arc-20160816; b=rCoiMEMpDfNI2RHicTZNaK7YEG3BzhmE6iDur8ZlVpGKCBpS8IU2Ji68saEdgQ6OPd pypgLOWFgSnCYuUo+Kqp7eq7HfvTm55v6bGRLIiTeMewE1Z3Q7gvbo0YDsrd9eHffZJ9 qaEx7Cu1Ipn5qpJdZVrCEpbzEWRTqT0Nk8fiiSymYsLyb/Gkwne+cCE9h+1ZBdRok61V T7VcL9YaoBXbwvJLXWpXb76X5/r7EHNYsNO0J7bD666fSeEjE47bLA0d64woCCz3ispl O8L2eer3EzuhwMJXlqFqfUSK8eqtibQ4CdOnXhSHR5nOuJnoZ8bOpCgUxWSXHkyGqauF c/Xw== 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=YMm4AcAL2xgWXQbd9MuZjG8GK/oyNOuCynr09JDO97tuNPoShCIQCJjvYI1amSVqhl UoGVse4fEnXI77XmEhsdt8QkOXnP9iYv/vYUJPCwy6u3AQOoI9lqmSJEkhT82NZpDcaI /jgFVgma6ueEqEIIn+3E8Q4uFEHT03nkz7TozhPcPwovWPEptgkJhlszN37/wwhEnRza sQRIUHvL2r9cg+k0ddXtfxsGWPpQzc/lH3mEso20mdZ/x5M2W60GetJiIEo/PdGxxKuc Ta6BHQL5qemldoloLaUNWcVIm77y9fKlB9JO7jGNh8boA6E0xaxfRCjkJiGLKUskWNSI dzaA== 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 bd19-20020a056402207300b0052e7b1828cfsi308123edb.5.2023.09.22.02.10.20 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Fri, 22 Sep 2023 02:10:20 -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 38M9A3Z5031991 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Fri, 22 Sep 2023 11:10:19 +0200 From: Uladzimir Bely To: isar-users@googlegroups.com Subject: [PATCH v4 02/13] kas: Add a local copy of kas-container script Date: Fri, 22 Sep 2023 11:09:52 +0200 Message-Id: <20230922091003.20763-3-ubely@ilbers.de> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20230922091003.20763-1-ubely@ilbers.de> References: <20230922091003.20763-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 "$@"