Skip to content

Commit

Permalink
[Runtimes] Merge 'compile_commands.json' files from runtimes build
Browse files Browse the repository at this point in the history
Summary:
When building a project in a runtime mode, the compilation database is a
separate CMake invocation. So its `compile_commands.json` file will be
placed elsewhere in the `runtimes/runtime-bins` directory. This is
somewhat annoying for ongoing development when a runtimes build is
necessary. This patch adds some CMake magic to merge the two files.
  • Loading branch information
jhuber6 committed Nov 15, 2024
1 parent 3a20a5f commit 11aab09
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 0 deletions.
42 changes: 42 additions & 0 deletions llvm/utils/merge-json.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#!/usr/bin/env python
"""A command line utility to merge two JSON files.
This is a python program that merges two JSON files into a single one. The
intended use for this is to combine generated 'compile_commands.json' files
created by CMake when performing an LLVM runtime build.
"""

import argparse
import json

def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument(
"-o", type=str,
help="The output file to write JSON data to",
default=None, nargs="?",
)
parser.add_argument(
"json_files", type=str, nargs='+', help="Input JSON files to merge"
)
args = parser.parse_args()

merged_data = []

for json_file in args.json_files:
try:
with open(json_file, 'r') as f:
data = json.load(f)
merged_data.extend(data)
except (IOError, json.JSONDecodeError):
continue

# Deduplicate by converting each entry to a tuple of sorted key-value pairs
unique_data = list({json.dumps(entry, sort_keys=True) for entry in merged_data})
unique_data = [json.loads(entry) for entry in unique_data]

with open(args.o, 'w') as f:
json.dump(unique_data, f, indent=2)

if __name__ == "__main__":
main()
15 changes: 15 additions & 0 deletions runtimes/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -313,3 +313,18 @@ if(SUB_COMPONENTS)
${LLVM_BINARY_DIR}/runtimes/Components.cmake)
endif()
endif()

# If the user requested 'compile_commands.json' we merge the generated JSON from
# the created directories.
if(CMAKE_EXPORT_COMPILE_COMMANDS)
file(TO_NATIVE_PATH "${LLVM_MAIN_SRC_DIR}/utils/merge-json.py" MERGE_JSON_PATH)
add_custom_command(OUTPUT ${LLVM_BINARY_DIR}/compile_commands.json
COMMAND ${CMAKE_COMMAND} -E touch ${LLVM_BINARY_DIR}/compile_commands.json
COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_BINARY_DIR}/compile_commands.json
COMMAND ${Python3_EXECUTABLE} ${MERGE_JSON_PATH}
${LLVM_BINARY_DIR}/compile_commands.json
${CMAKE_BINARY_DIR}/compile_commands.json
-o ${LLVM_BINARY_DIR}/compile_commands.json
DEPENDS ${CMAKE_BINARY_DIR}/compile_commands.json)
add_custom_target(merge_runtime_commands ALL DEPENDS ${LLVM_BINARY_DIR}/compile_commands.json)
endif()

0 comments on commit 11aab09

Please sign in to comment.