Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Doy-lee/c525f1eca29be74d24b3dfbf6b30a2f5 to your computer and use it in GitHub Desktop.
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
@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