]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
kunit: respect KBUILD_OUTPUT env variable by default
authorRyota Sakamoto <sakamo.ryota@gmail.com>
Mon, 5 Jan 2026 16:41:01 +0000 (01:41 +0900)
committerShuah Khan <skhan@linuxfoundation.org>
Mon, 5 Jan 2026 22:35:22 +0000 (15:35 -0700)
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.

Link: https://lore.kernel.org/r/20260106-kunit-kbuild_output-v2-1-582281797343@gmail.com
Reviewed-by: David Gow <davidgow@google.com>
Signed-off-by: Ryota Sakamoto <sakamo.ryota@gmail.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
tools/testing/kunit/kunit.py
tools/testing/kunit/kunit_tool_test.py

index cd99c1956331dbbfb06cf4ddf130db3dcf2a7c31..e3d82a038f93df0e86952da92461bc2e02f69ed1 100755 (executable)
@@ -323,11 +323,16 @@ def get_default_jobs() -> int:
                return ncpu
        raise RuntimeError("os.cpu_count() returned None")
 
+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='As in the make command, it specifies the build '
                            'directory.',
-                           type=str, default='.kunit', metavar='DIR')
+                           type=str, default=get_default_build_dir(), metavar='DIR')
        parser.add_argument('--make_options',
                            help='X=Y make option, can be repeated.',
                            action='append', metavar='X=Y')
index bbba921e0eacb18663abfcabb2bccf330d8666f5..a55b5085310d1bc54a549d3f36a83f7697fb8881 100755 (executable)
@@ -601,6 +601,7 @@ class KUnitMainTest(unittest.TestCase):
                        all_passed_log = file.readlines()
 
                self.print_mock = mock.patch('kunit_printer.Printer.print').start()
+               mock.patch.dict(os.environ, clear=True).start()
                self.addCleanup(mock.patch.stopall)
 
                self.mock_linux_init = mock.patch.object(kunit_kernel, 'LinuxSourceTree').start()
@@ -723,6 +724,24 @@ class KUnitMainTest(unittest.TestCase):
                        args=None, build_dir=build_dir, filter_glob='', filter='', filter_action=None, timeout=300)
                self.print_mock.assert_any_call(StrContains('Testing complete.'))
 
+       @mock.patch.dict(os.environ, {'KBUILD_OUTPUT': '/tmp'})
+       def test_run_builddir_from_env(self):
+               build_dir = '/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=None, build_dir=build_dir, filter_glob='', filter='', filter_action=None, timeout=300)
+               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 = '.kunit'
+               kunit.main(['run', '--build_dir=.kunit'])
+               self.assertEqual(self.linux_source_mock.build_reconfig.call_count, 1)
+               self.linux_source_mock.run_kernel.assert_called_once_with(
+                       args=None, build_dir=build_dir, filter_glob='', filter='', filter_action=None, timeout=300)
+               self.print_mock.assert_any_call(StrContains('Testing complete.'))
+
        def test_config_builddir(self):
                build_dir = '.kunit'
                kunit.main(['config', '--build_dir', build_dir])