Created
June 27, 2022 13:10
-
-
Save Doy-lee/c525f1eca29be74d24b3dfbf6b30a2f5 to your computer and use it in GitHub Desktop.
Merge clang compilation command files (i.e. clang -MJ) into compile_command.json compatible files using pure Windows batch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@echo off | |
REM NOTE: Overview (Version 1) | |
REM ---------------------------------------------------------------------------- | |
REM | |
REM Merge multiple compilation command files generated by clang -MJ and dump it | |
REM to standard output as a JSON array. This script lets you merge the output | |
REM files clang dumps on execution of this command without relying on any | |
REM external tools, just pure batch scripting. | |
REM | |
REM An entry generated by clang -MJ, looks like this: | |
REM | |
REM { | |
REM "directory": "/home/user/dev/llvm/build", | |
REM "file": "/tmp/foo.cpp", | |
REM "output": "foo.o", | |
REM "arguments": ["/usr/bin/clang-5.0", "-xc++", "/tmp/foo.cpp", "--driver-mode=g++", "-Wall", "-I", "/home/user/dev/libcpp/libcpp/include", "-c", "--target=x86_64-unknown-linux-gnu"] | |
REM } | |
REM | |
REM See: https://sarcasm.github.io/notes/dev/compilation-database.html#clang | |
REM | |
REM NOTE: Examples/Integration | |
REM ---------------------------------------------------------------------------- | |
REM On Windows you can generate this file easily on MSVC projects by utilising | |
REM the Clang MSVC CL wrapper in clang-cl which converts MSVC flags into Clang | |
REM compatible flags. | |
REM | |
REM clang-cl -clang:-MJcompile.json -nologo -W4 -Z7 your_cpp_file.cpp | |
REM | |
REM If you already use clang on Windows | |
REM | |
REM clang -MJcompile.json your_cpp_file.cpp | |
REM | |
REM You may merge the generated files into a valid compile_commands.json via | |
REM this script (by default it dumps to standard out) i.e. | |
REM | |
REM clang_merge_compilation_command_files.bat compile.json > compile_commands.json | |
REM | |
REM NOTE: What's it for? | |
REM ---------------------------------------------------------------------------- | |
REM Compilation commands can be used by LSP so that LSP daemons, like clangd are | |
REM able to semantically understand the code and provide code completion, hints | |
REM AST operations and so forth. | |
setlocal EnableDelayedExpansion | |
if [%1]==[] ( | |
echo Usage: %0 [compilation command files...] | |
exit /b -1 | |
) | |
REM Count the number of arguments we received | |
set arg_count=0 | |
for %%x in (%*) do ( set /A arg_count+=1 ) | |
REM Open a JSON array to splat the JSON compile commands objects into | |
echo [ | |
REM Append the compile commands in | |
set arg_next_index=0 | |
for %%x in (%*) do ( | |
set /A arg_next_index+=1 | |
set /P contents=<%%x | |
REM On the last compile command to append to the array, remove the trailing | |
REM comma on the JSON object | |
if !arg_next_index! == !arg_count! ( | |
set contents=!contents:~0,-1! | |
) | |
echo !contents! | |
) | |
REM Close the JSON array | |
echo ] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment