diff options
author | Evan Wilde <etceterawilde@gmail.com> | 2023-12-02 02:23:16 (GMT) |
---|---|---|
committer | Evan Wilde <etceterawilde@gmail.com> | 2024-01-03 22:57:46 (GMT) |
commit | 44f29a4291c9de6f8a1ff9097cd36576d987da14 (patch) | |
tree | 23b24e51924f002deb2415b68ec35e165a8edc3b /Tests | |
parent | 9090d340b45fa5092443d1abcf959a9a35a4d0e7 (diff) | |
download | CMake-44f29a4291c9de6f8a1ff9097cd36576d987da14.zip CMake-44f29a4291c9de6f8a1ff9097cd36576d987da14.tar.gz CMake-44f29a4291c9de6f8a1ff9097cd36576d987da14.tar.bz2 |
Swift/Ninja: Fix multifile module compile commands
Swift compile commands need to have all source files in the module
specified in the compile command or LSP systems will report errors on
missing types that are defined in other source files in the same module.
Issue: #25491
Diffstat (limited to 'Tests')
-rw-r--r-- | Tests/RunCMake/Swift/CompileCommands-check.cmake | 30 | ||||
-rw-r--r-- | Tests/RunCMake/Swift/CompileCommands.cmake | 9 | ||||
-rw-r--r-- | Tests/RunCMake/Swift/RunCMakeTest.cmake | 5 |
3 files changed, 44 insertions, 0 deletions
diff --git a/Tests/RunCMake/Swift/CompileCommands-check.cmake b/Tests/RunCMake/Swift/CompileCommands-check.cmake new file mode 100644 index 0000000..6450745 --- /dev/null +++ b/Tests/RunCMake/Swift/CompileCommands-check.cmake @@ -0,0 +1,30 @@ +if(NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/compile_commands.json") + set(RunCMake_TEST_FAILED "compile_commands.json not generated") + return() +endif() + +# The compile command for both files should contain all Swift source files in +# the module +set(expected_compile_commands +[==[^\[ +{ + "directory": ".*(/Tests/RunCMake/Swift/CompileCommands-build|\\\\Tests\\\\RunCMake\\\\Swift\\\\CompileCommands-build)", + "command": ".*swiftc .* (\\")?.*(/Tests/RunCMake/Swift/E.swift|\\\\Tests\\\\RunCMake\\\\Swift\\\\E.swift)(\\")? (\\")?.*(/Tests/RunCMake/Swift/L.swift|\\\\Tests\\\\RunCMake\\\\Swift\\\\L.swift)(\\")?", + "file": ".*(/Tests/RunCMake/Swift/E.swift|\\\\Tests\\\\RunCMake\\\\Swift\\\\E.swift)", + "output": "CMakeFiles/CompileCommandLib.dir/E.swift.o|CMakeFiles\\\\CompileCommandLib.dir\\\\E.swift.obj" +}, +{ + "directory": ".*(/Tests/RunCMake/Swift/CompileCommands-build|\\\\Tests\\\\RunCMake\\\\Swift\\\\CompileCommands-build)", + "command": ".*swiftc .* (\\")?.*(/Tests/RunCMake/Swift/E.swift|\\\\Tests\\\\RunCMake\\\\Swift\\\\E.swift)(\\")? (\\")?.*(/Tests/RunCMake/Swift/L.swift|\\\\Tests\\\\RunCMake\\\\Swift\\\\L.swift)(\\")?", + "file": ".*/Tests/RunCMake/Swift/L.swift", + "output": "CMakeFiles/CompileCommandLib.dir/L.swift.o|CMakeFiles\\\\CompileCommandLib.dir\\\\L.swift.obj" +} +]$]==] +) + +file(READ "${RunCMake_TEST_BINARY_DIR}/compile_commands.json" compile_commands) +if(NOT compile_commands MATCHES "${expected_compile_commands}") + string(REPLACE "\n" "\n " expected_compile_commands_formatted "${expected_compile_commands}") + string(REPLACE "\n" "\n " compile_commands_formatted "${compile_commands}") + string(APPEND RunCMake_TEST_FAILED "Expected compile_commands.json to match:\n ${expected_compile_commands_formatted}\nActual compile_commands.json:\n ${compile_commands_formatted}\n") +endif() diff --git a/Tests/RunCMake/Swift/CompileCommands.cmake b/Tests/RunCMake/Swift/CompileCommands.cmake new file mode 100644 index 0000000..f859693 --- /dev/null +++ b/Tests/RunCMake/Swift/CompileCommands.cmake @@ -0,0 +1,9 @@ +if(POLICY CMP0157) + cmake_policy(SET CMP0157 NEW) +endif() +set(CMAKE_Swift_COMPILATION_MODE "singlefile") + +enable_language(Swift) + +add_library(CompileCommandLib STATIC E.swift L.swift) +set_target_properties(CompileCommandLib PROPERTIES EXPORT_COMPILE_COMMANDS YES) diff --git a/Tests/RunCMake/Swift/RunCMakeTest.cmake b/Tests/RunCMake/Swift/RunCMakeTest.cmake index 184b461..500bf76 100644 --- a/Tests/RunCMake/Swift/RunCMakeTest.cmake +++ b/Tests/RunCMake/Swift/RunCMakeTest.cmake @@ -61,6 +61,11 @@ elseif(RunCMake_GENERATOR STREQUAL Ninja) run_cmake(CMP0157-WARN) endblock() + block() + set(CompileCommands_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/CompileCommands-build) + run_cmake(CompileCommands) + run_cmake_command(CompileCommands-check ${CMAKE_COMMAND} --build ${CompileCommands_TEST_BINARY_DIR}) + endblock() endif() elseif(RunCMake_GENERATOR STREQUAL "Ninja Multi-Config") if(CMake_TEST_Swift) |