From nobody Sun Dec 14 06:34:19 2025 Received: from relay9-d.mail.gandi.net (relay9-d.mail.gandi.net [217.70.183.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 62D4F325705; Wed, 10 Dec 2025 13:58:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765375131; cv=none; b=WsB9y1D4y6r8GNofIt3NSUmr5YF7PkoEYt03yQfiWtyWPXQbyIsSuAVXwPit2umZXtZExcjBN4PRrvW3UkL80e8N33JCw5jOamhKst79ohatA63NN2MliAw0v6XQoCAaBnNdmpvfjoGXU432Sw29yFc5aKCY/ZSNVrSUUrb/KZ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765375131; c=relaxed/simple; bh=0a6Ptg1kURzTDxYxmRdjuKY2Wu04CIx9/4ak33SQP3Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KXghxyRb4MP3xiQANQu4mkhRccVsU4r/VQ98l/ovcWlvWwtS757NveCP7f6PZh6NLzK/upGXxa5We25a4R+moWNL3bE/rYBvQ5H5zioKMxcS0P5d/8EKOnqHcSZomaAzziVhBocLDxtNTwBMX+1pW0nmWv+J5R9Av1E26K9g/PI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gtucker.io; spf=pass smtp.mailfrom=gtucker.io; dkim=pass (2048-bit key) header.d=gtucker.io header.i=@gtucker.io header.b=jWZohoP5; arc=none smtp.client-ip=217.70.183.199 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gtucker.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gtucker.io Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gtucker.io header.i=@gtucker.io header.b="jWZohoP5" Received: by mail.gandi.net (Postfix) with ESMTPSA id B63E544413; Wed, 10 Dec 2025 13:58:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gtucker.io; s=gm1; t=1765375122; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=oQT3akhpCKQ1CDdSMpWBnnx3/WKcW/oI1Ny3o1MMouk=; b=jWZohoP5A0uxZK+uEA3mD2K+D+VE8HmkdgO3M5YwAppnOPiFjJFmr0CUnkcClAnh9xPDnk F1ANCU94zugOgLpNAf7jokDjS3Jr6J/FhtBsdC8ovy9pgMWX7gJT247eFUOxUeB5ohrT7B 81ENYctyk3sdMJsUEKJiQzC5KPFpWQkQmkq/id2TrTfT4Fp9dqlWeBFMvQCtq7SEnicny1 eDoGDJniRMJct3CpohhCiLnt5WZxQbiG8/McVULMtm9OiOpMyfx3B8Jr8f+oH9UCDeKZ7Q 2R8YRSqyEpdqQnUs/bhNKD5Hm1tHM0nLg1ZTDSohqRtFBcDRtYID0tih5KlaIQ== From: Guillaume Tucker To: Nathan Chancellor , Miguel Ojeda Cc: linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-kbuild@vger.kernel.org, automated-testing@lists.yoctoproject.org, workflows@vger.kernel.org, llvm@lists.linux.dev, Arnd Bergmann , Guillaume Tucker Subject: [PATCH v1 1/2] scripts: add tool to run containerized builds Date: Wed, 10 Dec 2025 14:58:28 +0100 Message-ID: <97dec58ebe4161027f13f2215ed9da4a43bc8c47.1765374789.git.gtucker@gtucker.io> X-Mailer: git-send-email 2.47.3 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-GND-Sasl: gtucker@gtucker.io X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgddvvdeiudcutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfitefpfffkpdcuggftfghnshhusghstghrihgsvgenuceurghilhhouhhtmecufedtudenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvvefufffkofgjfhgggfestdekredtredttdenucfhrhhomhepifhuihhllhgruhhmvgcuvfhutghkvghruceoghhtuhgtkhgvrhesghhtuhgtkhgvrhdrihhoqeenucggtffrrghtthgvrhhnpedvhfffvddvgfeffefhhfelueegjedtkeduveffteeijeeivdfhffdtkeefkedutdenucffohhmrghinhepkhgvrhhnvghlrdhorhhgnecukfhppedvtddtudemkeeiudemgegrgedtmeekiedvtdemjeekrggsmeekfhekudemvdekledumeegsggvgeenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepihhnvghtpedvtddtudemkeeiudemgegrgedtmeekiedvtdemjeekrggsmeekfhekudemvdekledumeegsggvgedphhgvlhhopehsthgrrhguuhhsthdrlhgrnhdpmhgrihhlfhhrohhmpehgthhutghkvghrsehgthhutghkvghrrdhiohdpqhhiugepueeifefgheeggeegudefpdhmohguvgepshhmthhpohhuthdpnhgspghrtghpthhtohepuddtpdhrtghpthhtohepnhgrthhhrghnsehkvghrnhgvlhdrohhrghdprhgtphhtthhopehojhgvuggrsehkvghrnhgvlhdrohhrghdprhgtphhtthhopehlihhnuhigq dhkvghrnhgvlhesvhhgvghrrdhkvghrnhgvlhdrohhrghdprhgtphhtthhopehruhhsthdqfhhorhdqlhhinhhugiesvhhgvghrrdhkvghrnhgvlhdrohhrghdprhgtphhtthhopehlihhnuhigqdhksghuihhlugesvhhgvghrrdhkvghrnhgvlhdrohhrghdprhgtphhtthhopegruhhtohhmrghtvgguqdhtvghsthhinhhgsehlihhsthhsrdihohgtthhophhrohhjvggtthdrohhrgh X-GND-State: clean Content-Type: text/plain; charset="utf-8" Add a 'scripts/container' tool written in Python to run any command in the source tree from within a container. This can typically be used to call 'make' with a compiler toolchain image to run reproducible builds but any arbitrary command can be run too. Only Docker and Podman are supported for this initial version. Cc: Nathan Chancellor Cc: Miguel Ojeda Link: https://lore.kernel.org/all/affb7aff-dc9b-4263-bbd4-a7965c19ac4e@gtuc= ker.io/ Signed-off-by: Guillaume Tucker --- scripts/container | 112 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100755 scripts/container diff --git a/scripts/container b/scripts/container new file mode 100755 index 000000000000..74644ac33685 --- /dev/null +++ b/scripts/container @@ -0,0 +1,112 @@ +#!/bin/env python3 +# SPDX-License-Identifier: GPL-2.0-only +# Copyright (C) 2025 Guillaume Tucker + +"""Containerized builds""" + +import argparse +import logging +import os +import subprocess +import sys + + +def get_logger(verbose): + """Set up a logger with the appropriate level""" + logger =3D logging.getLogger('container') + handler =3D logging.StreamHandler() + handler.setFormatter(logging.Formatter( + fmt=3D'[container {levelname}] {message}', style=3D'{' + )) + logger.addHandler(handler) + logger.setLevel(logging.DEBUG if verbose is True else logging.INFO) + return logger + + +def run_docker(args): + """Run a command in a Docker container""" + uid =3D args.uid or os.getuid() + gid =3D args.gid or args.uid or os.getgid() + cmd =3D [ + 'docker', 'run', + '--interactive', + '--volume', f'{os.getcwd()}:/src', + '--workdir', '/src', + '--user', f'{uid}:{gid}' + ] + if args.env_file: + cmd +=3D ['--env-file', args.env_file] + cmd.append(args.image) + cmd +=3D args.cmd + return subprocess.call(cmd) + + +def run_podman(args): + """Run a command in a Podman container""" + uid =3D args.uid or 1000 + gid =3D args.gid or args.uid or 1000 + cmd =3D [ + 'podman', 'run', + '--interactive', + '--volume', f'{os.getcwd()}:/src', + '--workdir', '/src', + '--userns', f'keep-id:uid=3D{uid},gid=3D{gid}', + ] + if args.env_file: + cmd +=3D ['--env-file', args.env_file] + cmd.append(args.image) + cmd +=3D args.cmd + return subprocess.call(cmd) + + +def main(args): + """Main entry point for the container tool""" + logger =3D get_logger(args.verbose) + logger.debug("runtime=3D%s, image=3D%s", args.runtime, args.image) + runtimes =3D { + 'docker': run_docker, + 'podman': run_podman, + } + handler =3D runtimes.get(args.runtime) + if not handler: + logger.error("Unknown container runtime: %s", args.runtime) + return 1 + try: + return handler(args) + except KeyboardInterrupt: + logger.error("aborted") + return 1 + + +if __name__ =3D=3D '__main__': + parser =3D argparse.ArgumentParser("Containerized builds") + parser.add_argument( + '-e', '--env-file', + help=3D"Path to an environment file to load in the container." + ) + parser.add_argument( + '-g', '--gid', + help=3D"Group ID to use inside the container." + ) + parser.add_argument( + '-i', '--image', default=3D'gcc', + help=3D"Container image, default is gcc." + ) + parser.add_argument( + '-r', '--runtime', choices=3D['docker', 'podman'], default=3D'dock= er', + help=3D"Container runtime, default is docker." + ) + parser.add_argument( + '-u', '--uid', + help=3D"User ID to use inside the container. If the -g option is = not" + "specified, the user ID will also be used for the group ID." + ) + parser.add_argument( + '-v', '--verbose', action=3D'store_true', + help=3D"Enable verbose output." + ) + parser.add_argument( + 'cmd', nargs=3D'+', + help=3D"Command to run in the container" + ) + sys.exit(main(parser.parse_args(sys.argv[1:]))) --=20 2.47.3 From nobody Sun Dec 14 06:34:19 2025 Received: from relay9-d.mail.gandi.net (relay9-d.mail.gandi.net [217.70.183.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4C59A325734; Wed, 10 Dec 2025 13:58:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765375133; cv=none; b=jt92bNg02JMFyFUHX1l2m8YpmAejf34V93rP+H47H62f+SnuEZ7LgloJeBeIW9rfrdETxqE/HZyrwO8+03q7+kvOBxvukrqQ0vno9jEnMnrwXErrUOl5jJ4kikNDywMnoeUFCPIWTbWXrnWJGFZKvjMzCnjTaZ2mZbk1DNChQzs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765375133; c=relaxed/simple; bh=/JzziIh37MwT/Lfc9x2Hc7McrdTQf1fNaek9/J7N4B4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Nd3mc/U9LdrHwLxNQi/Rwy1GlLHPrr6uouVBwod8LBcln9oobH+GnHqBTSPqFMO8SfFFm3uWcJbLHTNQ53v3LuqoBlZ896jnF/dRSYnhrUyPdpfs3W3DwS0YMPgRdzsDfVf4uSWq2Zqv6/Wq1yjL9534CzZnIbTVhIEy0vRwzgs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gtucker.io; spf=pass smtp.mailfrom=gtucker.io; dkim=pass (2048-bit key) header.d=gtucker.io header.i=@gtucker.io header.b=ikrjS9wn; arc=none smtp.client-ip=217.70.183.199 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=gtucker.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gtucker.io Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gtucker.io header.i=@gtucker.io header.b="ikrjS9wn" Received: by mail.gandi.net (Postfix) with ESMTPSA id 92CC64441A; Wed, 10 Dec 2025 13:58:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gtucker.io; s=gm1; t=1765375124; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=NFTzSy6FXFZbxrTvw84HxQJWfiUUGwmuc4pWf0PrSYI=; b=ikrjS9wnllx6lvLrWk5y5uI86Y9rXEB6BMOdoK1CR0y47zqbfnkvsshIeu29oraAuQ3Eh6 AVlMsTil4uvj6UjulZFUZQVFdWZm0iQF85ZuO4b9blatYCShMHocIf3tlXQRXD66XPUrb6 Ph80YiSUX4y6MMnE+F5Gbmr7HpjeCxih1+w4vAYnSiNRj8yWZdJ4ch8bTaXf4KtD8taDCq Wny8vIc3AQ27BZiZyHevvTDdXH4GXrxkayliaWXB7UEwF8h65qrPYfSIRFrQdsLB+mxOUO hpVpgXgkLQI54IZ8a7rReHjzh2lStJICSRFXINtLdqSbR1miaVJUhkgTARQ0oA== From: Guillaume Tucker To: Nathan Chancellor , Miguel Ojeda Cc: linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-kbuild@vger.kernel.org, automated-testing@lists.yoctoproject.org, workflows@vger.kernel.org, llvm@lists.linux.dev, Arnd Bergmann , Guillaume Tucker Subject: [PATCH v1 2/2] Documentation: dev-tools: add container.rst page Date: Wed, 10 Dec 2025 14:58:29 +0100 Message-ID: <97fb956ee0d303c8e41f4266f25ebadc9ce295d7.1765374789.git.gtucker@gtucker.io> X-Mailer: git-send-email 2.47.3 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-GND-Sasl: gtucker@gtucker.io X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgddvvdeiudcutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfitefpfffkpdcuggftfghnshhusghstghrihgsvgenuceurghilhhouhhtmecufedtudenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephffvvefufffkofgjfhgggfestdekredtredttdenucfhrhhomhepifhuihhllhgruhhmvgcuvfhutghkvghruceoghhtuhgtkhgvrhesghhtuhgtkhgvrhdrihhoqeenucggtffrrghtthgvrhhnpedvgfevuedtteeiudduffetgedtkeeigfegffdvledutdeviedvkeegleetkeefudenucffohhmrghinhepkhgvrhhnvghlrdhorhhgpdhgihhtlhgrsgdrtghomhenucfkphepvddttddumeekiedumeegrgegtdemkeeivddtmeejkegrsgemkehfkedumedvkeeludemgegsvgegnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehinhgvthepvddttddumeekiedumeegrgegtdemkeeivddtmeejkegrsgemkehfkedumedvkeeludemgegsvgegpdhhvghlohepshhtrghrughushhtrdhlrghnpdhmrghilhhfrhhomhepghhtuhgtkhgvrhesghhtuhgtkhgvrhdrihhopdhqihgupeelvdevveeigeeggedutedpmhhouggvpehsmhhtphhouhhtpdhnsggprhgtphhtthhopedutddprhgtphhtthhopehnrghthhgrnheskhgvrhhnvghlrdhorhhgpdhrtghpthhtohepohhjvggurgeskhgvrhhnvghlrdhorhhgpdhrt ghpthhtoheplhhinhhugidqkhgvrhhnvghlsehvghgvrhdrkhgvrhhnvghlrdhorhhgpdhrtghpthhtoheprhhushhtqdhfohhrqdhlihhnuhigsehvghgvrhdrkhgvrhhnvghlrdhorhhgpdhrtghpthhtoheplhhinhhugidqkhgsuhhilhgusehvghgvrhdrkhgvrhhnvghlrdhorhhgpdhrtghpthhtoheprghuthhomhgrthgvugdqthgvshhtihhngheslhhishhtshdrhihotghtohhprhhojhgvtghtrdhorhhg X-GND-State: clean Content-Type: text/plain; charset="utf-8" Add a dev-tools/container.rst documentation page for the scripts/container tool. This covers the basic usage with additional information about environment variables and user IDs. It also includes a number of practical examples with a reference to the experimental kernel.org toolchain images. Cc: Nathan Chancellor Cc: Miguel Ojeda Signed-off-by: Guillaume Tucker --- Documentation/dev-tools/container.rst | 175 ++++++++++++++++++++++++++ Documentation/dev-tools/index.rst | 1 + 2 files changed, 176 insertions(+) create mode 100644 Documentation/dev-tools/container.rst diff --git a/Documentation/dev-tools/container.rst b/Documentation/dev-tool= s/container.rst new file mode 100644 index 000000000000..2a56f256f648 --- /dev/null +++ b/Documentation/dev-tools/container.rst @@ -0,0 +1,175 @@ +.. SPDX-License-Identifier: GPL-2.0-only +.. Copyright (C) 2025 Guillaume Tucker + +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +Containerized Builds +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +The ``container`` tool can be used to run any command in the kernel source= tree +from within a container. Doing so facilitates reproducing builds across +various platforms, for example when a test bot has reported an issue which +requires a specific version of a compiler or an external test suite. While +this can already be done by users who are familiar with containers, having= a +dedicated tool in the kernel tree lowers the barrier to entry by solving c= ommon +problems once and for all (e.g. user id management). It also makes it eas= ier +to share an exact command line leading to a particular result. The main u= se +case is likely to be kernel builds but virtually anything can be run: KUni= t, +checkpatch etc. provided a suitable image is available. + + +Options +=3D=3D=3D=3D=3D=3D=3D + +Command line syntax:: + + scripts/container [OPTION]... CMD... + +Available options: + +``-e, --env-file ENV_FILE`` + + Path to an environment file to load in the container. + +``-g, --gid GID`` + + Group id to use inside the container. + +``-i, --image IMAGE`` + + Container image, default is ``gcc``. + +``-r, --runtime RUNTIME`` + + Container runtime, default is ``docker``. Supported runtimes: ``docke= r``, + ``podman``. + +``-u, --uid UID`` + + User id to use inside the container. If the ``-g`` option is not + specified, the user id will also be used for the group id. + +``-v, --verbose`` + + Enable verbose output. + +``-h, --help`` + + Show the help message and exit. + + +Usage +=3D=3D=3D=3D=3D + +It's entirely up to the user to choose which image to use and the ``CMD`` +arguments are passed directly as an arbitrary command line to run in the +container. The tool will take care of mounting the source tree as the cur= rent +working directory and adjust the user and group id as needed. + +The container images are provided by the user and selected via the ``-i`` +option. They will typically include a compiler toolchain to build the ker= nel +and as such, the default image tag is set to ``gcc`` to give a convenient = way +of running builds. Any local image with a GCC compiler toolchain could be +tagged as ``gcc`` to make it point to it. For example:: + + docker tag my-user/gcc:15 gcc + +The container runtime can be selected with the ``-r`` option, which can be +either Docker or Podman. Support for other runtimes may be added later +depending on their popularity among users. + + +Environment Variables +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Environment variables are not propagated to the container so they have to = be +either defined in the image itself or via the ``-e`` option using an +environment file. In some cases it makes more sense to have them defined = in +the Containerfile used to create the image. For example, a Clang-only com= piler +toolchain image would most likely have ``LLVM=3D1`` defined. The local +environment file is more useful for user-specific variables during develop= ment. + +Please note that ``make`` options can still be passed on the command line,= so +while this can't be done as the first argument needs to be the executable:: + + scripts/container INSTALL_MOD_STRIP=3D1 make modules_install + +this will work:: + + scripts/container make modules_install INSTALL_MOD_STRIP=3D1 + + +User IDs +=3D=3D=3D=3D=3D=3D=3D=3D + +This is an area where the behaviour will vary slightly depending on the +container runtime. The goal is to run commands as the user invoking the t= ool. +With Podman, a namespace is created to map the current user id to a differ= ent +one in the container (1000 by default). With Docker, while this is also +possible with recent versions it requires a special feature to be enabled = in +the daemon so it's not used here for simplicity. Instead, the container i= s run +with the current user id directly. In both cases, this will provide the s= ame +file permissions for the kernel source tree mounted as a volume. The only +difference is that when using Docker without a namespace, the user id may = not +be the same as the default one set in the image. + +Say, we're using an image which sets up a default user with id 1000 and the +current user calling the ``container`` tool has id 1234. The kernel source +tree was checked out by this same user so the files belong to user 1234. = With +Podman, the container will be running as user id 1000 with a mapping to id= 1234 +so that the files from the mounted volume appear to belong to id 1000 insi= de +the container. With Docker and no namespace, the container will be running +with user id 1234 which can access the files in the volume but not in the = user +1000 home directory. This shouldn't be an issue when running commands onl= y in +the kernel tree but it is worth highlighting here as it might matter for +special corner cases. + + +Examples +=3D=3D=3D=3D=3D=3D=3D=3D + +The shortest example is to run a basic kernel build using Docker and the +default ``gcc`` image:: + + scripts/container -- make defconfig + scripts/container -- make -j$(nproc) + +.. note:: + + When running a command with options within the container, it should be + separated with a double dash ``--`` to not confuse them with the + ``container`` tool options. Simple make targets with no options don't + strictly require the double dashes e.g.:: + + scripts/container make mrproper + +To run ``checkpatch.pl`` in a ``patches`` directory with a generic image:: + + scripts/container -i perl:slim-trixie scripts/checkpatch.pl patches/* + +To build using the TuxMake Clang image:: + + scripts/container -i tuxmake/x86_64_korg-clang -- make LLVM=3D1 -j$(npro= c) + +The examples below refer to ``kernel.org`` images which are based on the +`kernel.org compiler toolchains +`__. These aren't (yet) avail= able +in any public registry but users can build their own locally instead using= this +`experimental repository `__ by +running ``make PREFIX=3Dkernel.org/``. + +To build just ``bzImage`` using Clang:: + + scripts/container -i kernel.org/clang -- make bzImage -j$(nproc) + +To run KUnit:: + + scripts/container -i kernel.org/gcc:kunit -- \ + tools/testing/kunit/kunit.py \ + run \ + --arch=3Dx86_64 \ + --cross_compile=3Dx86_64-linux- + +To build the HTML documentation, which requires the ``kdocs`` image built = with +``make PREFIX=3Dkernel.org/ extra`` as it's not a compiler toolchain:: + + scripts/container -i kernel.org/kdocs make htmldocs diff --git a/Documentation/dev-tools/index.rst b/Documentation/dev-tools/in= dex.rst index 4b8425e348ab..527a0e4cf2ed 100644 --- a/Documentation/dev-tools/index.rst +++ b/Documentation/dev-tools/index.rst @@ -38,6 +38,7 @@ Documentation/process/debugging/index.rst gpio-sloppy-logic-analyzer autofdo propeller + container =20 =20 .. only:: subproject and html --=20 2.47.3