From 093655c60783321c786a8e69632f185d37520f4d Mon Sep 17 00:00:00 2001 From: Jacob Wujciak-Jens Date: Fri, 8 Nov 2024 02:25:29 +0100 Subject: [PATCH] GH-44606: [C++] Add find module for abseil that handles missing version (#44613) ### Rationale for this change Abseil's recommended usage is to build from trunk, this version does not provide a package version in CMake which breaks `resolve_dependency`. ### What changes are included in this PR? Add `FindabslAlt.cmake` that adds a big version if it is missing to compare against our minimal version requirements. ### Are these changes tested? CI ### Are there any user-facing changes? Abseil build from head should now work without workaround. * GitHub Issue: #44606 Lead-authored-by: Jacob Wujciak-Jens Co-authored-by: Sutou Kouhei Signed-off-by: Jacob Wujciak-Jens --- cpp/cmake_modules/FindabslAlt.cmake | 46 +++++++++++++++++++++ cpp/cmake_modules/ThirdpartyToolchain.cmake | 2 +- 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 cpp/cmake_modules/FindabslAlt.cmake diff --git a/cpp/cmake_modules/FindabslAlt.cmake b/cpp/cmake_modules/FindabslAlt.cmake new file mode 100644 index 0000000000000..a7ebe63f5eb49 --- /dev/null +++ b/cpp/cmake_modules/FindabslAlt.cmake @@ -0,0 +1,46 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +if(abslAlt_FOUND) + return() +endif() + +set(find_package_args) + +if(abslAlt_FIND_QUIETLY) + list(APPEND find_package_args QUIET) +endif() +if(abslAlt_FIND_REQUIRED) + list(APPEND find_package_args REQUIRED) +endif() + +find_package(absl ${find_package_args}) + +if(NOT DEFINED absl_VERSION) + # Abseil does not define a version when build 'live at head'. + # As this is their recommended path we need to define a large version to pass version checks. + # CMake removes the '_head' suffix for version comparison but it will show up in the logs + # and matches the abseil-cpp.pc version of 'head' + set(absl_VERSION 99999999_head) +endif() + +set(abslAlt_VERSION ${absl_VERSION}) + +find_package_handle_standard_args( + abslAlt + REQUIRED_VARS absl_FOUND + VERSION_VAR abslAlt_VERSION) diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake index 0b215b5b25c62..e07e13cab5db8 100644 --- a/cpp/cmake_modules/ThirdpartyToolchain.cmake +++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake @@ -4169,7 +4169,7 @@ if(ARROW_WITH_GOOGLE_CLOUD_CPP OR ARROW_WITH_GRPC) ARROW_PC_PACKAGE_NAME ${ARROW_ABSL_PC_PACKAGE_NAME} HAVE_ALT - FALSE + TRUE FORCE_ANY_NEWER_VERSION TRUE REQUIRED_VERSION