From nobody Mon Feb 9 01:26:53 2026 Received: from mail-pf1-f174.google.com (mail-pf1-f174.google.com [209.85.210.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 63A9528B7DA for ; Sun, 28 Dec 2025 07:57:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766908645; cv=none; b=g4TA7zt0Gp+mP3/SU2hK2d77zJEPtM23O9GAA9C3EmQFMZsMyQeCeu691277V872Vhntcu5S7MG5DQrSLPA9Csx6mytPrIvLbhb8tVuxOzghDfNqRhotviSn9x/+I6yRI6ualvjz59OQJdhrZPp3eyk1/kudv7ola69yqzd2WV8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766908645; c=relaxed/simple; bh=29CsS8jUPXfxnqDG52zqX8oAaxTCHMIVUG84xalQVuo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=YT2cBDexRyCK0aLCggeiP8VhOlfagdi8fjnF9/26YvfLJnEc00d1iVvqi/NSjhw67QFAwhSySyOdcwSivkpmx7LfEP8d6RAeoicjuoo8iFvrfWqGDHqVxDQERpDLGyejOg0SH93PaQVp0nDqykba3y8BPu86BBjKRl3E57UBkok= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=csITLKjq; arc=none smtp.client-ip=209.85.210.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="csITLKjq" Received: by mail-pf1-f174.google.com with SMTP id d2e1a72fcca58-7b8bbf16b71so8147889b3a.2 for ; Sat, 27 Dec 2025 23:57:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1766908643; x=1767513443; darn=vger.kernel.org; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:from:to:cc:subject:date:message-id:reply-to; bh=sH/mQxpGQvHgNSDd7bXpPUMJDojJ2SOxK5UAXsSsuAA=; b=csITLKjqEMk5tPgwRoOIgzRywYFe3xEKpLvnza+NXjd+7bwMkeFTGM9lu5BbRv3gD6 ZShv3VsbFYWwrRYScvvvgvNSRae4C7p1NoByBld/sgPTYaaDDInoh+CY19GZ3rAZfSyd fDlJTVehQfqcW5doCAA8uk26NChAHeoTlhLAcbkOjSq9NoIYryy9sRXOy2ULeNtJmP7k A+x/DIPjdvbQNC8v7W5YyF9iT1HSQ9kfaGXZatt96YuTx7AiIURu7xMWjj2/atB1+qb1 pcsxf3wonjrxwLTkt4XmeQIPbxEcjw7pjoUZs5k7+9rs1StGEm9iU5Dcns6D8INg7iiX 7huA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766908643; x=1767513443; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=sH/mQxpGQvHgNSDd7bXpPUMJDojJ2SOxK5UAXsSsuAA=; b=ai3gkml0Oi80cH2ljtlkVoweoWOGE/NGShwjyqxAy2w9NWvETihHza0PesGVK/0OnF cAPOj2xjMTTr6K0M/+FWpZRd4RtYmD11mkLJyVzOoll1xJN/VbFTzl/N9j/UvF/Q4clo CawFVO44x6wbN9SQ4X/8BRQbVRmnLa9gGtYL8wP9bQmbSp2uwIKVHkx71zT6dDxdeRwP wvRzNaaQcfyarH8F20xUUBqAS/+D9tear25kzdDwOde1k9qYDjNxAsKb1OuyS6BYFS7w RQeOv8pfGGe0LdNXu7Wu0XqqFoUNy6nF56VodyMqfsXKl1D5LOqzlxGPeSbWmYvsOxcv vV6g== X-Forwarded-Encrypted: i=1; AJvYcCVqSp/DTb3p1Jt5zUynUIMKR6aksxffFSL7AJ5lnKWDgXOrhmP5wZyVzXZ6bCYu2/uAXa0XEFmursvjezE=@vger.kernel.org X-Gm-Message-State: AOJu0Yy6KX/Lg9xAR5Qawj56gVCSt65SUj/1z6wOzogGq4fJmbCcCULB 0e53HuYKWRALRTLGAFVfWoZHUnUJ8dcIl6re5fSylFXsbkCRbLFo5CkFXq/dtFSn X-Gm-Gg: AY/fxX6lvmHlBVjp1b6l6PSHI0/ZX+vco4jVP9uW5MtWZkISydJh9JLZENt7CNkjGBt 6i0FK8r47tRcmmFwfSoUZlTJOfxvGgAonGm4fYVcbMFcVoCMSa4PEXn8KSARUxw6wf9gia8+EtY bs5TUrhIAV+pCiJc50qC64M1ER5itC+Zwwl0XH78z2AClQ2EtvgezPiqjpQQl1XewuKS5NxNJEz 5gAF/5FpTJBppU0GP22N30IqpJzeWrBz4a547APlcwmyDdqQnpXH1HAwq285LK2exHTj9U2PJAu fK/Cr1M2ygPYcn9bkycYMG8c/aVx+4kICk5eiArcQd17JogJuzV2kwf8kM1LB/rayfPFuLfkY+2 q8E4/5AdXxBRUnuIrjyDw7qpaf6K0Y1N5yEJbS4XI0V4ARb9WcFQsypFwCMUzdtuGwRTEBKy/FZ utFUGGI//jLyyDnFUpo4M= X-Google-Smtp-Source: AGHT+IEG1fi8JdvUOklOm4ZBYm40p24T/KBfn4xEROwDBzEt48vaxSZxhJoFgs/MPre7m5jHI6WlxA== X-Received: by 2002:a05:6a00:4c0e:b0:7e8:450c:61bb with SMTP id d2e1a72fcca58-7ff6607e24amr22824991b3a.43.1766908643406; Sat, 27 Dec 2025 23:57:23 -0800 (PST) Received: from [172.16.80.107] ([210.228.119.9]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-80d8d93f7f0sm140936b3a.22.2025.12.27.23.57.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 27 Dec 2025 23:57:22 -0800 (PST) From: Ryota Sakamoto Date: Sun, 28 Dec 2025 16:55:19 +0900 Subject: [PATCH RFC] kunit: respect KBUILD_OUTPUT env variable by default Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251228-kunit-kbuild_output-v1-1-f1fb30fe060f@gmail.com> X-B4-Tracking: v=1; b=H4sIAAAAAAAC/6tWKk4tykwtVrJSqFYqSi3LLM7MzwNyDHUUlJIzE vPSU3UzU4B8JSMDI1NDIyML3ezSvMwS3eyk0syclPj80pKC0hJd0xQjw0QLy7REMwNjJaDOgqL UtMwKsKnRSkFuzkqxtbUAa9bXlmoAAAA= X-Change-ID: 20251228-kunit-kbuild_output-5d21a89fa603 To: Brendan Higgins , David Gow , Rae Moar Cc: linux-kselftest@vger.kernel.org, kunit-dev@googlegroups.com, linux-kernel@vger.kernel.org, Ryota Sakamoto X-Mailer: b4 0.14.2 Currently, kunit.py ignores the KBUILD_OUTPUT env variable and always defaults to .kunit in the working directory. This behavior is inconsistent with standard Kbuild behavior, where KBUILD_OUTPUT defines the build artifact location. This patch modifies kunit.py to respect KBUILD_OUTPUT if set. A .kunit subdirectory is created inside KBUILD_OUTPUT to avoid polluting the build directory. Signed-off-by: Ryota Sakamoto Reviewed-by: David Gow --- tools/testing/kunit/kunit.py | 7 ++++++- tools/testing/kunit/kunit_tool_test.py | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/tools/testing/kunit/kunit.py b/tools/testing/kunit/kunit.py index cd99c1956331dbbfb06cf4ddf130db3dcf2a7c31..e3d82a038f93df0e86952da9246= 1bc2e02f69ed1 100755 --- a/tools/testing/kunit/kunit.py +++ b/tools/testing/kunit/kunit.py @@ -323,11 +323,16 @@ def get_default_jobs() -> int: return ncpu raise RuntimeError("os.cpu_count() returned None") =20 +def get_default_build_dir() -> str: + if 'KBUILD_OUTPUT' in os.environ: + return os.path.join(os.environ['KBUILD_OUTPUT'], '.kunit') + return '.kunit' + def add_common_opts(parser: argparse.ArgumentParser) -> None: parser.add_argument('--build_dir', help=3D'As in the make command, it specifies the build ' 'directory.', - type=3Dstr, default=3D'.kunit', metavar=3D'DIR') + type=3Dstr, default=3Dget_default_build_dir(), metavar=3D'DIR') parser.add_argument('--make_options', help=3D'X=3DY make option, can be repeated.', action=3D'append', metavar=3D'X=3DY') diff --git a/tools/testing/kunit/kunit_tool_test.py b/tools/testing/kunit/k= unit_tool_test.py index bbba921e0eacb18663abfcabb2bccf330d8666f5..a55b5085310d1bc54a549d3f36a= 83f7697fb8881 100755 --- a/tools/testing/kunit/kunit_tool_test.py +++ b/tools/testing/kunit/kunit_tool_test.py @@ -601,6 +601,7 @@ class KUnitMainTest(unittest.TestCase): all_passed_log =3D file.readlines() =20 self.print_mock =3D mock.patch('kunit_printer.Printer.print').start() + mock.patch.dict(os.environ, clear=3DTrue).start() self.addCleanup(mock.patch.stopall) =20 self.mock_linux_init =3D mock.patch.object(kunit_kernel, 'LinuxSourceTre= e').start() @@ -723,6 +724,24 @@ class KUnitMainTest(unittest.TestCase): args=3DNone, build_dir=3Dbuild_dir, filter_glob=3D'', filter=3D'', filt= er_action=3DNone, timeout=3D300) self.print_mock.assert_any_call(StrContains('Testing complete.')) =20 + @mock.patch.dict(os.environ, {'KBUILD_OUTPUT': '/tmp'}) + def test_run_builddir_from_env(self): + build_dir =3D '/tmp/.kunit' + kunit.main(['run']) + self.assertEqual(self.linux_source_mock.build_reconfig.call_count, 1) + self.linux_source_mock.run_kernel.assert_called_once_with( + args=3DNone, build_dir=3Dbuild_dir, filter_glob=3D'', filter=3D'', filt= er_action=3DNone, timeout=3D300) + self.print_mock.assert_any_call(StrContains('Testing complete.')) + + @mock.patch.dict(os.environ, {'KBUILD_OUTPUT': '/tmp'}) + def test_run_builddir_override(self): + build_dir =3D '.kunit' + kunit.main(['run', '--build_dir=3D.kunit']) + self.assertEqual(self.linux_source_mock.build_reconfig.call_count, 1) + self.linux_source_mock.run_kernel.assert_called_once_with( + args=3DNone, build_dir=3Dbuild_dir, filter_glob=3D'', filter=3D'', filt= er_action=3DNone, timeout=3D300) + self.print_mock.assert_any_call(StrContains('Testing complete.')) + def test_config_builddir(self): build_dir =3D '.kunit' kunit.main(['config', '--build_dir', build_dir]) --- base-commit: ccd1cdca5cd433c8a5dff78b69a79b31d9b77ee1 change-id: 20251228-kunit-kbuild_output-5d21a89fa603 Best regards, --=20 Ryota Sakamoto