Using ninja multi-config and exporting compile commands produces duplicates in compile_commands.json
Hi. Running this:
export CMAKE_BIN=path/to/cmake
${CMAKE_BIN} \
-G "Ninja Multi-Config" \
-DCMAKE_CROSS_CONFIGS=all \
-DCMAKE_DEFAULT_CONFIGS="Release" \
-DCMAKE_CONFIGURATION_TYPES="Release;Debug" \
-DCMAKE_VERIFY_INTERFACE_HEADER_SETS=TRUE \
-DCMAKE_EXPORT_COMPILE_COMMANDS=TRUE \
.
cat compile_commands.json
Produced this output
[
{
"directory": "/root/minimal/minimal",
"command": "/usr/local/bin/clang++ -DFOO_BAR -DCMAKE_INTDIR=\\\"Release\\\" -I/root/minimal/minimal/. -O3 -DNDEBUG -o CMakeFiles/blah.dir/Release/blah.cpp.o -c /root/minimal/minimal/blah.cpp",
"file": "/root/minimal/minimal/blah.cpp"
},
{
"directory": "/root/minimal/minimal",
"command": "/usr/local/bin/clang++ -DFOO_BAR -DCMAKE_INTDIR=\\\"Release\\\" -I/root/minimal/minimal/. -O3 -DNDEBUG -o CMakeFiles/blah.dir/Release/blah.cpp.o -c /root/minimal/minimal/blah.cpp",
"file": "/root/minimal/minimal/blah.cpp"
},
{
"directory": "/root/minimal/minimal",
"command": "/usr/local/bin/clang++ -DFOO_BAR -DCMAKE_INTDIR=\\\"Debug\\\" -I/root/minimal/minimal/. -g -o CMakeFiles/blah.dir/Debug/blah.cpp.o -c /root/minimal/minimal/blah.cpp",
"file": "/root/minimal/minimal/blah.cpp"
},
{
"directory": "/root/minimal/minimal",
"command": "/usr/local/bin/clang++ -DFOO_BAR -DCMAKE_INTDIR=\\\"Debug\\\" -I/root/minimal/minimal/. -g -o CMakeFiles/blah.dir/Debug/blah.cpp.o -c /root/minimal/minimal/blah.cpp",
"file": "/root/minimal/minimal/blah.cpp"
},
{
"directory": "/root/minimal/minimal",
"command": "/usr/local/bin/clang++ -DCMAKE_INTDIR=\\\"Release\\\" -I/root/minimal/minimal/. -x c++ -O3 -DNDEBUG -o CMakeFiles/blah_verify_interface_header_sets.dir/Release/blah_verify_interface_header_sets/blah.h.cxx.o -c /root/minimal/minimal/blah_verify_interface_header_sets/blah.h.cxx",
"file": "/root/minimal/minimal/blah_verify_interface_header_sets/blah.h.cxx"
},
{
"directory": "/root/minimal/minimal",
"command": "/usr/local/bin/clang++ -DCMAKE_INTDIR=\\\"Release\\\" -I/root/minimal/minimal/. -x c++ -O3 -DNDEBUG -o CMakeFiles/blah_verify_interface_header_sets.dir/Release/blah_verify_interface_header_sets/blah.h.cxx.o -c /root/minimal/minimal/blah_verify_interface_header_sets/blah.h.cxx",
"file": "/root/minimal/minimal/blah_verify_interface_header_sets/blah.h.cxx"
},
{
"directory": "/root/minimal/minimal",
"command": "/usr/local/bin/clang++ -DCMAKE_INTDIR=\\\"Debug\\\" -I/root/minimal/minimal/. -x c++ -g -o CMakeFiles/blah_verify_interface_header_sets.dir/Debug/blah_verify_interface_header_sets/blah.h.cxx.o -c /root/minimal/minimal/blah_verify_interface_header_sets/blah.h.cxx",
"file": "/root/minimal/minimal/blah_verify_interface_header_sets/blah.h.cxx"
},
{
"directory": "/root/minimal/minimal",
"command": "/usr/local/bin/clang++ -DCMAKE_INTDIR=\\\"Debug\\\" -I/root/minimal/minimal/. -x c++ -g -o CMakeFiles/blah_verify_interface_header_sets.dir/Debug/blah_verify_interface_header_sets/blah.h.cxx.o -c /root/minimal/minimal/blah_verify_interface_header_sets/blah.h.cxx",
"file": "/root/minimal/minimal/blah_verify_interface_header_sets/blah.h.cxx"
}
]
on this codebase blah.h
int ab(int a, int b);
blah.cpp
#include <blah.h>
#include <iostream>
int ab(int a, int b)
{
return a + b;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.24.0)
project(MINIMAL)
add_library(blah blah.cpp)
add_compile_definitions(FOO_BAR)
target_include_directories(blah PUBLIC .)
target_sources(blah PUBLIC
FILE_SET internal_h_files
TYPE HEADERS
BASE_DIRS .
FILES blah.h)
#set_property(TARGET blah PROPERTY EXPORT_COMPILE_COMMANDS FALSE)
I am using the latest cmake release candidate for what it's worth
Edited by Daniel Hannon