我想使用CMAKE_EXPORT_COMPILE_COMMANDS来生成compile_commands. json,但是我发现很多文件丢失了。
1.我修改了一个名为ob_join_order.cpp
的文件,然后再次构建项目,然后我看到
Building CXX objectsrc/sql/CMakeFiles/ob_sql.dir/Unity/unity_ob_sql_optimizer/0_cxx.cxx.o
您可以看到它不是ob_join_order. cpp,而是0_cxx.cxx.o。通过检查文件src/sql/CMakeFiles/ob_sql.dir/Unity/unity_ob_sql_optimizer/0_cxx.cxx,我看到了类似的内容。
#include "/u01/yizhi/github/oceanbase/src/sql/optimizer/ob_join_order.cpp"
#ifdef USING_LOG_PREFIX
#undef USING_LOG_PREFIX
#endif
#include "/u01/yizhi/github/oceanbase/src/sql/optimizer/ob_log_monitoring_dump.cpp"
#ifdef USING_LOG_PREFIX
#undef USING_LOG_PREFIX
#endif
所以我认为在编译器编译源文件之前,源文件被合并成一个大文件。这就是为什么CMAKE_EXPORT_COMPILE_COMMANDS失败的原因。
这是CMake中的一些技术吗?我如何禁用它?
所有的东西都可以被复制
git clone https://github.com/oceanbase/oceanbase.git
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 540863a..d12c4e4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -9,6 +9,8 @@ project("OceanBase CE"
HOMEPAGE_URL "https://www.oceanbase.com/"
LANGUAGES CXX C ASM)
+set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE INTERNAL "")
+
ob_define(WITH_OSS OFF)
if(ENABLE_DEBUG_LOG)
diff --git a/build.sh b/build.sh
index 98f91e4..0d17d42 100755
--- a/build.sh
+++ b/build.sh
@@ -94,7 +94,7 @@ function do_build
{
TYPE=$1; shift
prepare_build_dir $TYPE || return
- ${CMAKE_COMMAND} ${TOPDIR} "$@"
+ ${CMAKE_COMMAND} -DCMAKE_EXPORT_COMPILE_COMMANDS=1 ${TOPDIR} "$@"
}
sh build.sh debug --init --make
2条答案
按热度按时间iugsix8n1#
你是对的,所有的文件都被收集到一个文件中,CMake对此负有部分责任。但是这不是CMake的默认行为。
OceanBase被特别配置为一个统一构建,这意味着所有的翻译单元都被收集到一个“统一”翻译单元中。您可以在他们的cmake实用程序中看到他们是在哪里设置的。相关的目标属性是
UNITY_BUILD ON
。vcudknz32#
首先,你应该知道cmake如何编译这个项目。
在oceanbase项目中,您应该更改一个unity_build目标组中的ob_join_order. cpp名称,然后编译该项目。