CMAKE_EXPORT_COMPILE_COMMANDS不起作用,因为许多cpp文件以某种方式构建到一个大文件中

dtcbnfnu  于 2022-12-23  发布在  其他
关注(0)|答案(2)|浏览(272)

我想使用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
iugsix8n

iugsix8n1#

你是对的,所有的文件都被收集到一个文件中,CMake对此负有部分责任。但是这不是CMake的默认行为。
OceanBase被特别配置为一个统一构建,这意味着所有的翻译单元都被收集到一个“统一”翻译单元中。您可以在他们的cmake实用程序中看到他们是在哪里设置的。相关的目标属性是UNITY_BUILD ON

vcudknz3

vcudknz32#

首先,你应该知道cmake如何编译这个项目。
在oceanbase项目中,您应该更改一个unity_build目标组中的ob_join_order. cpp名称,然后编译该项目。

相关问题