akshatgupta08 opened a new issue, #1028:
URL: https://github.com/apache/iceberg-cpp/issues/1028

   After #1021 (commit 31659e7), configuring iceberg-cpp with vendored Arrow 
fails on CMake 3.28 (Ubuntu 24.04 LTS). The rename of the FetchContent content 
name from VendoredArrow to Arrow creates a variable-name collision with Arrow's 
own project(arrow) call, which Arrow's 
cpp/cmake_modules/ThirdpartyToolchain.cmake relies on.
   
   Environment
   
   - Ubuntu 24.04 LTS
   - CMake 3.28.3
   - GCC 14.2.0
   - Fresh clone of main
   
   Reproduction
   
   git clone https://github.com/apache/iceberg-cpp.git
   cd iceberg-cpp
   cmake -S . -B build -G Ninja -DCMAKE_C_COMPILER=gcc-14 
-DCMAKE_CXX_COMPILER=g++-14
   
   Error
   
   CMake Error at 
build/_deps/arrow-src/cpp/cmake_modules/ThirdpartyToolchain.cmake:446 (file):
     file STRINGS file
     "<build>/_deps/arrow-src/thirdparty/versions.txt"
     cannot be read.
   
   The file actually lives at _deps/arrow-src/cpp/thirdparty/versions.txt 
(inside cpp/). Because versions.txt can't be read, all *_BUILD_SHA256_CHECKSUM 
variables become empty and the subsequent Boost ExternalProject_Add fails with 
URL_HASH SHA256= (empty).
   
   Root cause
   
   Arrow's cpp/cmake_modules/ThirdpartyToolchain.cmake sets:
   
   set(THIRDPARTY_DIR "${arrow_SOURCE_DIR}/thirdparty")
   
   In a standalone Arrow build, project(arrow) in cpp/CMakeLists.txt sets 
arrow_SOURCE_DIR to the cpp/ directory. But when Arrow is pulled in by 
iceberg-cpp via FetchContent_Declare(Arrow ...), CMake pre-sets 
arrow_SOURCE_DIR to the tarball root (parent of cpp/). On CMake 3.28, the 
subsequent project(arrow) does not override the inherited arrow_SOURCE_DIR — 
PROJECT_SOURCE_DIR is updated, but arrow_SOURCE_DIR keeps the FetchContent 
value.
   
   Verified with a minimal repro:
   
   cmake_minimum_required(VERSION 3.25)
   project(TestFC)
   
   cmake_minimum_required(VERSION 3.25)
   project(TestFC)
   include(FetchContent)
   FetchContent_Declare(Arrow URL file:///path/to/apache-arrow-25.0.0.tar.gz 
SOURCE_SUBDIR cpp)
   FetchContent_Populate(Arrow)
   # arrow_SOURCE_DIR is set by FetchContent to the tarball root
   
   # Add a subdir that calls project(arrow)
   # → PROJECT_SOURCE_DIR updates to <root>/subdir, but arrow_SOURCE_DIR does 
NOT change
   
   Before #1021 this worked because the FetchContent name was VendoredArrow 
(variable vendoredarrow_SOURCE_DIR), separate from Arrow's own arrow_SOURCE_DIR.
   
   Why CI didn't catch it
   
   CI runs on ubuntu-26.04, which ships a newer CMake. Either the newer CMake 
behaves differently for project() overrides, or a system Arrow is picked up by 
FIND_PACKAGE_ARGS CONFIG. Either way, CMake 3.28 on Ubuntu 24.04 LTS — the 
current widely-used LTS — isn't exercised.
   
   Suggested fix
   
   Rename back to VendoredArrow (or any name other than Arrow/arrow) to avoid 
the collision. Alternatively, consider adding ubuntu-24.04 with its stock CMake 
to the CI matrix.
   
   Workaround
   
   git revert 31659e7 locally.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to