[CMake] Don't override find_package() for builtins#22604
Conversation
find_package() for builtins
Test Results 20 files 20 suites 3d 8h 56m 54s ⏱️ For more details on these failures, see this check. Results for commit 3a71c65. ♻️ This comment has been updated with latest results. |
| set(ZLIB_INCLUDE_DIR ${ZLIB_INCLUDE_DIR} CACHE PATH "Path to the builtin zlib headers" FORCE) | ||
| set(ZLIB_LIBRARY ${ROOT_ZLIB_LIBRARY} CACHE FILEPATH "Path to the builtin zlib library" FORCE) |
There was a problem hiding this comment.
| set(ZLIB_INCLUDE_DIR ${ZLIB_INCLUDE_DIR} CACHE PATH "Path to the builtin zlib headers" FORCE) | |
| set(ZLIB_LIBRARY ${ROOT_ZLIB_LIBRARY} CACHE FILEPATH "Path to the builtin zlib library" FORCE) | |
| set(ZLIB_INCLUDE_DIR ${ZLIB_INCLUDE_DIR} PARENT_SCOPE) | |
| set(ZLIB_LIBRARY ${ROOT_ZLIB_LIBRARY} PARENT_SCOPE) |
for consistency with above?
There was a problem hiding this comment.
Ok I'll try! As long as FindPNG (which does find_package(ZLIB) internally) picks up the builtin ZLIB we're good. We just need to set the right variables so find_package(ZLIB) knows ZLIB is already there, and it will not look for it again and find the system ZLIB.
There was a problem hiding this comment.
Alright, indeed it both works. The FindPNG -> find_package(ZLIB) happens in SearchInstalledSoftware, which is the parent scope. So setting these variables in the PARENT_SCOPE is indeed good enough. The global cache would only be needed if we frigger find_package(ZLIB) in arbitrary places, but that's not the case.
ferdymercury
left a comment
There was a problem hiding this comment.
Thanks, just a minor nitpick
builtins/zstd defined the imported ZSTD::ZSTD target but never tied it to the BUILTIN_ZSTD ExternalProject that actually produces libzstd.a. As a result a parallel or targeted build (e.g. building only the Core target) could try to link the archive before it exists. Add the dependency edge, consistent with what builtins/zlib already does for BUILTIN_ZLIB. 🤖 Done with the help of [Claude Code](https://claude.com/claude-code) (Claude Opus 4.8)
ROOT redefined the global find_package() command to no-op for its builtins, so that sub-projects added later (notably the bundled LLVM) and transitive find modules (e.g. FindPNG -> find_package(ZLIB)) would reuse ROOT's builtin imported targets instead of re-discovering a system copy. This relied on undocumented CMake behaviour and recursed infinitely under tools that override find_package() themselves, such as vcpkg (root-project#8633). The override only ever did real work for ZLIB and zstd: every other name in ROOT_BUILTINS was unnecessary (no find_package() consumer downstream). Both are now handled directly, so the override and the ROOT_BUILTINS list can be removed: * ZLIB (used by core/zip's find_package(ZLIB REQUIRED) and the transitive FindPNG -> find_package(ZLIB) of the asimage build): builtins/zlib pre-seeds the singular cache variables ZLIB_LIBRARY and ZLIB_INCLUDE_DIR that FindZLIB.cmake checks, so find_package() short-circuits to the builtin and keeps the ZLIB::ZLIB target. This also avoids the "FORCE specified without CACHE" error from select_library_configurations() that a real FindPNG -> FindZLIB chain would otherwise hit. * zstd (used only by the bundled LLVM): interpreter/CMakeLists.txt sets LLVM_ENABLE_ZSTD=OFF (and LLVM_ENABLE_ZLIB=OFF) for builtin builds, so LLVM never searches for the system copy. We can't point LLVM at the builtins instead, as it probes them with a configure-time compile/link check that the not-yet-built ExternalProject can't pass anyway. This makes ROOT compatible with vcpkg and other dependency providers without changing behaviour: in builtin builds LLVM is still built without zlib/zstd, and a system build is unaffected since find_package() is no longer shadowed. Closes root-project#8633. 🤖 Done with the help of [Claude Code](https://claude.com/claude-code) (Claude Opus 4.8)
Targeted changes to make the
find_packageoverride unnecessary (more detail in inline comments and commit messages).Closes #8633.
🤖 Done with the help of Claude Code (Claude Opus 4.8)