diff --git a/docs/en/api-guides/tools/idf-tools-notes.inc b/docs/en/api-guides/tools/idf-tools-notes.inc index 7baaca01a99..37a2b631c22 100644 --- a/docs/en/api-guides/tools/idf-tools-notes.inc +++ b/docs/en/api-guides/tools/idf-tools-notes.inc @@ -47,6 +47,9 @@ On Linux and macOS, it is recommended to install CMake using the OS-specific pac .. tool-esp-clang-libs-notes +--- + +.. tool-esp-clangd-notes --- diff --git a/docs/zh_CN/api-guides/tools/idf-tools-notes.inc b/docs/zh_CN/api-guides/tools/idf-tools-notes.inc index 73582b6f988..da663966cc4 100644 --- a/docs/zh_CN/api-guides/tools/idf-tools-notes.inc +++ b/docs/zh_CN/api-guides/tools/idf-tools-notes.inc @@ -48,6 +48,11 @@ On Linux and macOS, it is recommended to install CMake using the OS-specific pac .. tool-esp-clang-libs-notes +--- + +.. tool-esp-clangd-notes + + --- .. tool-ninja-notes diff --git a/tools/test_idf_tools/test_idf_tools.py b/tools/test_idf_tools/test_idf_tools.py index 6fd848a9ce5..bce1276151b 100755 --- a/tools/test_idf_tools/test_idf_tools.py +++ b/tools/test_idf_tools/test_idf_tools.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -# SPDX-FileCopyrightText: 2019-2025 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2019-2026 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 import json import os @@ -57,6 +57,8 @@ RISCV_ESP_GDB = 'riscv32-esp-elf-gdb' ESP_ROM_ELFS = 'esp-rom-elfs' QEMU_RISCV = 'qemu-riscv32' QEMU_XTENSA = 'qemu-xtensa' +CLANGD = 'esp-clangd' +CLANGD_ARCHIVE = 'clangd' # Win tools CMAKE = 'cmake' NINJA = 'ninja' @@ -89,6 +91,7 @@ RISCV_ESP_GDB_VERSION = version_dict[RISCV_ESP_GDB] ESP_ROM_ELFS_VERSION = version_dict[ESP_ROM_ELFS] QEMU_RISCV_VERSION = version_dict[QEMU_RISCV] QEMU_XTENSA_VERSION = version_dict[QEMU_XTENSA] +CLANGD_VERSION = version_dict[CLANGD] # Win tools CMAKE_VERSION = version_dict[CMAKE] NINJA_VERSION = version_dict[NINJA] @@ -377,8 +380,10 @@ class TestUsageUnix(TestUsage): self.assertIn(f'- {RISCV_ELF_VERSION} (recommended)', output) self.assertIn(f'* {XTENSA_ELF}:', output) self.assertIn(f'- {XTENSA_ELF_VERSION} (recommended)', output) + self.assertIn(f'* {CLANGD}:', output) + self.assertIn(f'- {CLANGD_VERSION} (recommended)', output) - required_tools_installed = 7 + required_tools_installed = 8 output = self.run_idf_tools_with_action(['install']) self.assert_tool_installed(output, OPENOCD, OPENOCD_VERSION) self.assert_tool_installed(output, RISCV_ELF, RISCV_ELF_VERSION, RISCV_ELF_ARCHIVE_PATTERN) @@ -387,6 +392,7 @@ class TestUsageUnix(TestUsage): self.assert_tool_installed(output, XTENSA_ESP_GDB, XTENSA_ESP_GDB_VERSION) self.assert_tool_installed(output, RISCV_ESP_GDB, RISCV_ESP_GDB_VERSION) self.assert_tool_installed(output, ESP_ROM_ELFS, ESP_ROM_ELFS_VERSION) + self.assert_tool_installed(output, CLANGD, CLANGD_VERSION, CLANGD_ARCHIVE) self.assertIn('Destination: {}'.format(os.path.join(self.temp_tools_dir, 'dist')), output) self.assertEqual(required_tools_installed, output.count('Done')) @@ -399,6 +405,7 @@ class TestUsageUnix(TestUsage): XTENSA_ESP_GDB_VERSION, RISCV_ESP_GDB_VERSION, ESP_ROM_ELFS_VERSION, + CLANGD_VERSION, ]: self.assertIn('version installed in tools directory: ' + tool_version, output) @@ -416,6 +423,7 @@ class TestUsageUnix(TestUsage): output, ) self.assertIn(f'{self.temp_tools_dir}/tools/esp-rom-elfs/{ESP_ROM_ELFS_VERSION}/', output) + self.assertIn(f'{self.temp_tools_dir}/tools/esp-clangd/{CLANGD_VERSION}/esp-clangd/bin', output) output = self.run_idf_tools_with_action(['list', '--outdated']) self.assertEqual('', output) @@ -443,7 +451,7 @@ class TestUsageUnix(TestUsage): self.assertIn((f'{XTENSA_ELF}: version {XTENSA_ELF_VERSION} is outdated by {new_version}'), output) def test_tools_for_esp32(self): - required_tools_installed = 5 + required_tools_installed = 6 output = self.run_idf_tools_with_action(['install', '--targets=esp32']) self.assert_tool_installed(output, XTENSA_ELF, XTENSA_ELF_VERSION, XTENSA_ELF_ARCHIVE_PATTERN) self.assert_tool_installed(output, OPENOCD, OPENOCD_VERSION) @@ -452,6 +460,7 @@ class TestUsageUnix(TestUsage): self.assert_tool_not_installed(output, RISCV_ELF, RISCV_ELF_VERSION, RISCV_ELF_ARCHIVE_PATTERN) self.assert_tool_not_installed(output, RISCV_ESP_GDB, RISCV_ESP_GDB_VERSION) self.assert_tool_installed(output, ESP_ROM_ELFS, ESP_ROM_ELFS_VERSION) + self.assert_tool_installed(output, CLANGD, CLANGD_VERSION, CLANGD_ARCHIVE) self.assertIn('Destination: {}'.format(os.path.join(self.temp_tools_dir, 'dist')), output) self.assertEqual(required_tools_installed, output.count('Done')) @@ -462,6 +471,7 @@ class TestUsageUnix(TestUsage): XTENSA_ELF_VERSION, XTENSA_ESP_GDB_VERSION, ESP_ROM_ELFS_VERSION, + CLANGD_VERSION, ]: self.assertIn('version installed in tools directory: ' + tool_version, output) @@ -479,9 +489,10 @@ class TestUsageUnix(TestUsage): output, ) self.assertIn(f'{self.temp_tools_dir}/tools/esp-rom-elfs/{ESP_ROM_ELFS_VERSION}/', output) + self.assertIn(f'{self.temp_tools_dir}/tools/esp-clangd/{CLANGD_VERSION}/esp-clangd/bin', output) def test_tools_for_esp32c3(self): - required_tools_installed = 4 + required_tools_installed = 5 output = self.run_idf_tools_with_action(['install', '--targets=esp32c3']) self.assert_tool_installed(output, OPENOCD, OPENOCD_VERSION) self.assert_tool_installed(output, RISCV_ELF, RISCV_ELF_VERSION, RISCV_ELF_ARCHIVE_PATTERN) @@ -490,6 +501,7 @@ class TestUsageUnix(TestUsage): self.assert_tool_not_installed(output, ESP32ULP, ESP32ULP_VERSION) self.assert_tool_not_installed(output, XTENSA_ESP_GDB, XTENSA_ESP_GDB_VERSION) self.assert_tool_installed(output, ESP_ROM_ELFS, ESP_ROM_ELFS_VERSION) + self.assert_tool_installed(output, CLANGD, CLANGD_VERSION, CLANGD_ARCHIVE) self.assertIn('Destination: {}'.format(os.path.join(self.temp_tools_dir, 'dist')), output) self.assertEqual(required_tools_installed, output.count('Done')) @@ -507,9 +519,10 @@ class TestUsageUnix(TestUsage): output, ) self.assertIn(f'{self.temp_tools_dir}/tools/esp-rom-elfs/{ESP_ROM_ELFS_VERSION}/', output) + self.assertIn(f'{self.temp_tools_dir}/tools/esp-clangd/{CLANGD_VERSION}/esp-clangd/bin', output) def test_tools_for_esp32s2(self): - required_tools_installed = 6 + required_tools_installed = 7 output = self.run_idf_tools_with_action(['install', '--targets=esp32s2']) self.assert_tool_installed(output, XTENSA_ELF, XTENSA_ELF_VERSION, XTENSA_ELF_ARCHIVE_PATTERN) self.assert_tool_installed(output, OPENOCD, OPENOCD_VERSION) @@ -518,6 +531,7 @@ class TestUsageUnix(TestUsage): self.assert_tool_installed(output, XTENSA_ESP_GDB, XTENSA_ESP_GDB_VERSION) self.assert_tool_installed(output, ESP_ROM_ELFS, ESP_ROM_ELFS_VERSION) self.assert_tool_not_installed(output, RISCV_ESP_GDB, RISCV_ESP_GDB_VERSION) + self.assert_tool_installed(output, CLANGD, CLANGD_VERSION, CLANGD_ARCHIVE) self.assertIn('Destination: {}'.format(os.path.join(self.temp_tools_dir, 'dist')), output) self.assertEqual(required_tools_installed, output.count('Done')) @@ -539,9 +553,10 @@ class TestUsageUnix(TestUsage): output, ) self.assertIn(f'{self.temp_tools_dir}/tools/esp-rom-elfs/{ESP_ROM_ELFS_VERSION}/', output) + self.assertIn(f'{self.temp_tools_dir}/tools/esp-clangd/{CLANGD_VERSION}/esp-clangd/bin', output) def test_tools_for_esp32s3(self): - required_tools_installed = 6 + required_tools_installed = 7 output = self.run_idf_tools_with_action(['install', '--targets=esp32s3']) self.assert_tool_installed(output, XTENSA_ELF, XTENSA_ELF_VERSION, XTENSA_ELF_ARCHIVE_PATTERN) self.assert_tool_installed(output, OPENOCD, OPENOCD_VERSION) @@ -550,6 +565,7 @@ class TestUsageUnix(TestUsage): self.assert_tool_installed(output, XTENSA_ESP_GDB, XTENSA_ESP_GDB_VERSION) self.assert_tool_installed(output, ESP_ROM_ELFS, ESP_ROM_ELFS_VERSION) self.assert_tool_not_installed(output, RISCV_ESP_GDB, RISCV_ESP_GDB_VERSION) + self.assert_tool_installed(output, CLANGD, CLANGD_VERSION, CLANGD_ARCHIVE) self.assertIn('Destination: {}'.format(os.path.join(self.temp_tools_dir, 'dist')), output) self.assertEqual(required_tools_installed, output.count('Done')) @@ -560,6 +576,7 @@ class TestUsageUnix(TestUsage): XTENSA_ESP_GDB_VERSION, RISCV_ESP_GDB_VERSION, ESP_ROM_ELFS_VERSION, + CLANGD_VERSION, ]: self.assertIn('version installed in tools directory: ' + tool_version, output) @@ -577,9 +594,10 @@ class TestUsageUnix(TestUsage): output, ) self.assertIn(f'{self.temp_tools_dir}/tools/esp-rom-elfs/{ESP_ROM_ELFS_VERSION}/', output) + self.assertIn(f'{self.temp_tools_dir}/tools/esp-clangd/{CLANGD_VERSION}/esp-clangd/bin', output) def test_tools_for_esp32p4(self): - required_tools_installed = 4 + required_tools_installed = 5 output = self.run_idf_tools_with_action(['install', '--targets=esp32p4']) self.assert_tool_installed(output, OPENOCD, OPENOCD_VERSION) self.assert_tool_installed(output, RISCV_ELF, RISCV_ELF_VERSION, RISCV_ELF_ARCHIVE_PATTERN) @@ -588,6 +606,7 @@ class TestUsageUnix(TestUsage): self.assert_tool_not_installed(output, XTENSA_ELF, XTENSA_ELF_VERSION, XTENSA_ELF_ARCHIVE_PATTERN) self.assert_tool_not_installed(output, ESP32ULP, ESP32ULP_VERSION) self.assert_tool_not_installed(output, XTENSA_ESP_GDB, XTENSA_ESP_GDB_VERSION) + self.assert_tool_installed(output, CLANGD, CLANGD_VERSION, CLANGD_ARCHIVE) self.assertEqual(required_tools_installed, output.count('Done')) output = self.run_idf_tools_with_action(['check']) @@ -614,10 +633,11 @@ class TestUsageUnix(TestUsage): os.path.join(self.temp_tools_dir, 'tools', XTENSA_ESP_GDB, XTENSA_ESP_GDB_VERSION, XTENSA_ESP_GDB, 'bin'), output, ) + self.assertIn(os.path.join(self.temp_tools_dir, 'tools', CLANGD, CLANGD_VERSION, CLANGD, 'bin'), output) # a different test for qemu because of "on_request" def test_tools_for_qemu_with_required(self): - required_tools_installed = 9 + required_tools_installed = 10 output = self.run_idf_tools_with_action(['install', 'required', 'qemu-xtensa', 'qemu-riscv32']) self.assert_tool_installed(output, OPENOCD, OPENOCD_VERSION) self.assert_tool_installed(output, RISCV_ELF, RISCV_ELF_VERSION, RISCV_ELF_ARCHIVE_PATTERN) @@ -628,6 +648,7 @@ class TestUsageUnix(TestUsage): self.assert_tool_installed(output, ESP_ROM_ELFS, ESP_ROM_ELFS_VERSION) self.assert_tool_installed(output, QEMU_RISCV, QEMU_RISCV_VERSION) self.assert_tool_installed(output, QEMU_XTENSA, QEMU_XTENSA_VERSION) + self.assert_tool_installed(output, CLANGD, CLANGD_VERSION, CLANGD_ARCHIVE) self.assertIn('Destination: {}'.format(os.path.join(self.temp_tools_dir, 'dist')), output) self.assertEqual(required_tools_installed, output.count('Done')) @@ -652,7 +673,8 @@ class TestUsageWin(TestUsage): self.assertIn(f'- {RISCV_ELF_VERSION} (recommended)', output) self.assertIn(f'* {XTENSA_ELF}:', output) self.assertIn(f'- {XTENSA_ELF_VERSION} (recommended)', output) - + self.assertIn(f'* {CLANGD}:', output) + self.assertIn(f'- {CLANGD_VERSION} (recommended)', output) required_tools_installed = 12 output = self.run_idf_tools_with_action(['install']) self.assert_tool_installed(output, OPENOCD, OPENOCD_VERSION) @@ -667,6 +689,7 @@ class TestUsageWin(TestUsage): self.assert_tool_installed(output, IDF_EXE, IDF_EXE_VERSION) self.assert_tool_installed(output, CCACHE, CCACHE_VERSION) self.assert_tool_installed(output, DFU_UTIL, DFU_UTIL_VERSION) + self.assert_tool_installed(output, CLANGD, CLANGD_VERSION, CLANGD_ARCHIVE) self.assertIn('Destination: {}'.format(os.path.join(self.temp_tools_dir, 'dist')), output) self.assertEqual(required_tools_installed, output.count('Done')) @@ -684,6 +707,7 @@ class TestUsageWin(TestUsage): IDF_EXE_VERSION, CCACHE_VERSION, DFU_UTIL_VERSION, + CLANGD_VERSION, ]: self.assertIn('version installed in tools directory: ' + tool_version, output) @@ -724,6 +748,7 @@ class TestUsageWin(TestUsage): self.assertIn( os.path.join(self.temp_tools_dir, 'tools', DFU_UTIL, DFU_UTIL_VERSION, 'dfu-util-0.11-win64'), output ) + self.assertIn(os.path.join(self.temp_tools_dir, 'tools', CLANGD, CLANGD_VERSION, CLANGD, 'bin'), output) output = self.run_idf_tools_with_action(['list', '--outdated']) self.assertEqual('', output) @@ -751,7 +776,7 @@ class TestUsageWin(TestUsage): self.assertIn((f'{XTENSA_ELF}: version {XTENSA_ELF_VERSION} is outdated by {new_version}'), output) def test_tools_for_esp32_win(self): - required_tools_installed = 9 + required_tools_installed = 10 output = self.run_idf_tools_with_action(['install', '--targets=esp32']) self.assert_tool_installed(output, XTENSA_ELF, XTENSA_ELF_VERSION, XTENSA_ELF_ARCHIVE_PATTERN) self.assert_tool_installed(output, OPENOCD, OPENOCD_VERSION) @@ -765,6 +790,7 @@ class TestUsageWin(TestUsage): self.assert_tool_installed(output, IDF_EXE, IDF_EXE_VERSION) self.assert_tool_installed(output, CCACHE, CCACHE_VERSION) self.assert_tool_not_installed(output, DFU_UTIL, DFU_UTIL_VERSION) + self.assert_tool_installed(output, CLANGD, CLANGD_VERSION, CLANGD_ARCHIVE) self.assertIn('Destination: {}'.format(os.path.join(self.temp_tools_dir, 'dist')), output) self.assertEqual(required_tools_installed, output.count('Done')) @@ -779,6 +805,7 @@ class TestUsageWin(TestUsage): NINJA_VERSION, IDF_EXE_VERSION, CCACHE_VERSION, + CLANGD_VERSION, ]: self.assertIn('version installed in tools directory: ' + tool_version, output) self.assertNotIn('version installed in tools directory: ' + DFU_UTIL_VERSION, output) @@ -828,9 +855,10 @@ class TestUsageWin(TestUsage): self.assertNotIn( os.path.join(self.temp_tools_dir, 'tools', DFU_UTIL, DFU_UTIL_VERSION, 'dfu-util-0.11-win64'), output ) + self.assertNotIn(os.path.join(self.temp_tools_dir, 'tools', CLANGD, CLANGD_VERSION, CLANGD, 'bin'), output) def test_tools_for_esp32c3_win(self): - required_tools_installed = 8 + required_tools_installed = 9 output = self.run_idf_tools_with_action(['install', '--targets=esp32c3']) self.assert_tool_installed(output, OPENOCD, OPENOCD_VERSION) self.assert_tool_installed(output, RISCV_ELF, RISCV_ELF_VERSION, RISCV_ELF_ARCHIVE_PATTERN) @@ -844,6 +872,7 @@ class TestUsageWin(TestUsage): self.assert_tool_installed(output, IDF_EXE, IDF_EXE_VERSION) self.assert_tool_installed(output, CCACHE, CCACHE_VERSION) self.assert_tool_not_installed(output, DFU_UTIL, DFU_UTIL_VERSION) + self.assert_tool_installed(output, CLANGD, CLANGD_VERSION, CLANGD_ARCHIVE) self.assertIn('Destination: {}'.format(os.path.join(self.temp_tools_dir, 'dist')), output) self.assertEqual(required_tools_installed, output.count('Done')) @@ -857,6 +886,7 @@ class TestUsageWin(TestUsage): NINJA_VERSION, IDF_EXE_VERSION, CCACHE_VERSION, + CLANGD_VERSION, ]: self.assertIn('version installed in tools directory: ' + tool_version, output) self.assertNotIn('version installed in tools directory: ' + DFU_UTIL_VERSION, output) @@ -900,9 +930,10 @@ class TestUsageWin(TestUsage): self.assertNotIn( os.path.join(self.temp_tools_dir, 'tools', DFU_UTIL, DFU_UTIL_VERSION, 'dfu-util-0.11-win64'), output ) + self.assertNotIn(os.path.join(self.temp_tools_dir, 'tools', CLANGD, CLANGD_VERSION, CLANGD, 'bin'), output) def test_tools_for_esp32s2_win(self): - required_tools_installed = 11 + required_tools_installed = 12 output = self.run_idf_tools_with_action(['install', '--targets=esp32s2']) self.assert_tool_installed(output, XTENSA_ELF, XTENSA_ELF_VERSION, XTENSA_ELF_ARCHIVE_PATTERN) self.assert_tool_installed(output, OPENOCD, OPENOCD_VERSION) @@ -916,6 +947,7 @@ class TestUsageWin(TestUsage): self.assert_tool_installed(output, IDF_EXE, IDF_EXE_VERSION) self.assert_tool_installed(output, CCACHE, CCACHE_VERSION) self.assert_tool_installed(output, DFU_UTIL, DFU_UTIL_VERSION) + self.assert_tool_installed(output, CLANGD, CLANGD_VERSION, CLANGD_ARCHIVE) self.assertIn('Destination: {}'.format(os.path.join(self.temp_tools_dir, 'dist')), output) self.assertEqual(required_tools_installed, output.count('Done')) @@ -930,6 +962,7 @@ class TestUsageWin(TestUsage): NINJA_VERSION, IDF_EXE_VERSION, CCACHE_VERSION, + CLANGD_VERSION, ]: self.assertIn('version installed in tools directory: ' + tool_version, output) @@ -978,9 +1011,10 @@ class TestUsageWin(TestUsage): self.assertIn( os.path.join(self.temp_tools_dir, 'tools', DFU_UTIL, DFU_UTIL_VERSION, 'dfu-util-0.11-win64'), output ) + self.assertIn(os.path.join(self.temp_tools_dir, 'tools', CLANGD, CLANGD_VERSION, CLANGD, 'bin'), output) def test_tools_for_esp32s3_win(self): - required_tools_installed = 11 + required_tools_installed = 12 output = self.run_idf_tools_with_action(['install', '--targets=esp32s3']) print(output) self.assert_tool_installed(output, XTENSA_ELF, XTENSA_ELF_VERSION, XTENSA_ELF_ARCHIVE_PATTERN) @@ -995,6 +1029,7 @@ class TestUsageWin(TestUsage): self.assert_tool_installed(output, IDF_EXE, IDF_EXE_VERSION) self.assert_tool_installed(output, CCACHE, CCACHE_VERSION) self.assert_tool_installed(output, DFU_UTIL, DFU_UTIL_VERSION) + self.assert_tool_installed(output, CLANGD, CLANGD_VERSION, CLANGD_ARCHIVE) self.assertIn('Destination: {}'.format(os.path.join(self.temp_tools_dir, 'dist')), output) self.assertEqual(required_tools_installed, output.count('Done')) @@ -1010,6 +1045,7 @@ class TestUsageWin(TestUsage): NINJA_VERSION, IDF_EXE_VERSION, CCACHE_VERSION, + CLANGD_VERSION, ]: self.assertIn('version installed in tools directory: ' + tool_version, output) @@ -1058,9 +1094,10 @@ class TestUsageWin(TestUsage): self.assertIn( os.path.join(self.temp_tools_dir, 'tools', DFU_UTIL, DFU_UTIL_VERSION, 'dfu-util-0.11-win64'), output ) + self.assertIn(os.path.join(self.temp_tools_dir, 'tools', CLANGD, CLANGD_VERSION, CLANGD, 'bin'), output) def test_tools_for_esp32p4_win(self): - required_tools_installed = 8 + required_tools_installed = 9 output = self.run_idf_tools_with_action(['install', '--targets=esp32p4']) self.assert_tool_installed(output, RISCV_ELF, RISCV_ELF_VERSION, RISCV_ELF_ARCHIVE_PATTERN) self.assert_tool_installed(output, RISCV_ESP_GDB, RISCV_ESP_GDB_VERSION) @@ -1074,6 +1111,7 @@ class TestUsageWin(TestUsage): self.assert_tool_not_installed(output, ESP32ULP, ESP32ULP_VERSION) self.assert_tool_not_installed(output, XTENSA_ESP_GDB, XTENSA_ESP_GDB_VERSION) self.assert_tool_not_installed(output, DFU_UTIL, DFU_UTIL_VERSION) + self.assert_tool_installed(output, CLANGD, CLANGD_VERSION, CLANGD_ARCHIVE) self.assertEqual(required_tools_installed, output.count('Done')) output = self.run_idf_tools_with_action(['check']) @@ -1086,6 +1124,7 @@ class TestUsageWin(TestUsage): NINJA_VERSION, IDF_EXE_VERSION, CCACHE_VERSION, + CLANGD_VERSION, ]: self.assertIn(f'version installed in tools directory: {tool_version}', output) @@ -1118,10 +1157,11 @@ class TestUsageWin(TestUsage): self.assertNotIn( os.path.join(self.temp_tools_dir, 'tools', DFU_UTIL, DFU_UTIL_VERSION, 'dfu-util-0.11-win64'), output ) + self.assertNotIn(os.path.join(self.temp_tools_dir, 'tools', CLANGD, CLANGD_VERSION, CLANGD, 'bin'), output) # a different test for qemu because of "on_request" def test_tools_for_qemu_with_required_win(self): - required_tools_installed = 14 + required_tools_installed = 15 output = self.run_idf_tools_with_action(['install', 'required', 'qemu-xtensa', 'qemu-riscv32']) self.assert_tool_installed(output, OPENOCD, OPENOCD_VERSION) self.assert_tool_installed(output, RISCV_ELF, RISCV_ELF_VERSION, RISCV_ELF_ARCHIVE_PATTERN) @@ -1137,6 +1177,7 @@ class TestUsageWin(TestUsage): self.assert_tool_installed(output, IDF_EXE, IDF_EXE_VERSION) self.assert_tool_installed(output, CCACHE, CCACHE_VERSION) self.assert_tool_installed(output, DFU_UTIL, DFU_UTIL_VERSION) + self.assert_tool_installed(output, CLANGD, CLANGD_VERSION, CLANGD_ARCHIVE) self.assertIn('Destination: {}'.format(os.path.join(self.temp_tools_dir, 'dist')), output) self.assertEqual(required_tools_installed, output.count('Done')) diff --git a/tools/tools.json b/tools/tools.json index 17252ab4de3..f067adba1a9 100644 --- a/tools/tools.json +++ b/tools/tools.json @@ -1080,6 +1080,76 @@ } } ] + }, + { + "description": "Clangd for all Espressif chips", + "export_paths": [ + [ + "esp-clangd", + "bin" + ] + ], + "export_vars": {}, + "info_url": "https://github.com/espressif/llvm-project", + "install": "always", + "license": "Apache-2.0", + "name": "esp-clangd", + "supported_targets": [ + "esp32", + "esp32s2", + "esp32s3", + "esp32c3", + "esp32c2", + "esp32c6", + "esp32c5", + "esp32h2", + "esp32p4", + "esp32c61", + "esp32h21", + "esp32h4", + "esp32s31" + ], + "version_cmd": [ + "clangd", + "--version" + ], + "version_regex": "\\([^\\s]+\\s+([0-9a-zA-Z\\.\\-_]+)\\)", + "versions": [ + { + "linux-amd64": { + "sha256": "f0573d773f24e78ab798b25d877ffd3d8caeab3dfafeb48a4f99315cd473dd08", + "size": 17078156, + "url": "https://github.com/espressif/llvm-project/releases/download/esp-21.1.3_20260304/clangd-esp-21.1.3_20260304-x86_64-linux-gnu.tar.xz" + }, + "linux-arm64": { + "sha256": "b443919f06882d8035f4c2b28fb72826e9b08b89d46abbb7b55f5a1432804d02", + "size": 14706352, + "url": "https://github.com/espressif/llvm-project/releases/download/esp-21.1.3_20260304/clangd-esp-21.1.3_20260304-aarch64-linux-gnu.tar.xz" + }, + "linux-armhf": { + "sha256": "9700a9652341e38982e677a688a2d075956613b98a8535fa7e4c22db0685291e", + "size": 15363732, + "url": "https://github.com/espressif/llvm-project/releases/download/esp-21.1.3_20260304/clangd-esp-21.1.3_20260304-arm-linux-gnueabihf.tar.xz" + }, + "macos": { + "sha256": "89a1bf9cc570cab7e2632535badb9035126f440c1c64795bb19a74bdf76551d3", + "size": 12660720, + "url": "https://github.com/espressif/llvm-project/releases/download/esp-21.1.3_20260304/clangd-esp-21.1.3_20260304-x86_64-apple-darwin.tar.xz" + }, + "macos-arm64": { + "sha256": "53e3ea1abffc7127646b694b4683f6a4dd1a5d89ccfc354d4b136b78ac722ba5", + "size": 10996336, + "url": "https://github.com/espressif/llvm-project/releases/download/esp-21.1.3_20260304/clangd-esp-21.1.3_20260304-aarch64-apple-darwin.tar.xz" + }, + "name": "esp-21.1.3_20260304", + "status": "recommended", + "win64": { + "sha256": "492f75478eaf2fbb7c5f970518a244fe3ef68a03cea24755634c7af892f41b85", + "size": 14081448, + "url": "https://github.com/espressif/llvm-project/releases/download/esp-21.1.3_20260304/clangd-esp-21.1.3_20260304-x86_64-w64-mingw32.tar.xz" + } + } + ] } ], "version": 3