From c39b1c2500f5a6e26dccd5ef691029e06252bd20 Mon Sep 17 00:00:00 2001 From: joeyyjwang Date: Thu, 3 Sep 2026 21:56:16 +0800 Subject: [PATCH] fix(cmake): generate version.h under PROJECT_BINARY_DIR to support add_subdirectory() builds CMakeLists.txt generates the versioned header at ${CMAKE_BINARY_DIR}/src/iceberg/version.h, but the include path used to compile the iceberg target (ICEBERG_INCLUDES in src/iceberg/CMakeLists.txt) is ${PROJECT_BINARY_DIR}/src. This change makes both consistently use PROJECT_BINARY_DIR. When iceberg-cpp is built as the top-level project, CMAKE_BINARY_DIR and PROJECT_BINARY_DIR happen to be the same directory, so this mismatch is invisible. When iceberg-cpp is consumed via add_subdirectory() from another CMake project (e.g. vendoring it under third/iceberg-cpp/), CMAKE_BINARY_DIR resolves to the outermost project's build directory, while PROJECT_BINARY_DIR correctly resolves to the build directory nested under the outer project (e.g. /third/iceberg-cpp/). The generated version.h then ends up in the wrong place and any translation unit that does #include "iceberg/version.h" (e.g. catalog/rest/constant.h, deletes/dv_util.cc, deletes/dv_writer.cc) fails with a missing header when building as a nested dependency. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0882be68f..4a0ad8a99 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,7 +30,7 @@ project(Iceberg include(IcebergBuildUtils) iceberg_configure_version_header("${CMAKE_CURRENT_SOURCE_DIR}/src/iceberg/version.h.in" - "${CMAKE_BINARY_DIR}/src/iceberg/version.h") + "${PROJECT_BINARY_DIR}/src/iceberg/version.h") set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON)