From b4e29c383c03928c61fc1f86ba87dfed8e0225d5 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Wed, 20 Apr 2022 01:43:10 -0400 Subject: [PATCH 01/20] Create individual Python virtualenv's in cmake builds (copied from https://github.com/firebase/firebase-ios-sdk/pull/9662) --- CMakeLists.txt | 3 - analytics/CMakeLists.txt | 9 +- app/CMakeLists.txt | 11 +- cmake/binary_to_array.cmake | 9 +- cmake/python_setup.cmake | 183 ++++++++++++++++++ .../toolchains/linux_32.cmake | 8 +- .../toolchains/macos_arm64.cmake | 8 +- 7 files changed, 222 insertions(+), 9 deletions(-) create mode 100644 cmake/python_setup.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d3410f251..cb84c0e6df 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,9 +86,6 @@ if (NOT FIREBASE_ANDROID_STL STREQUAL "") set(ANDROID_STL ${FIREBASE_ANDROID_STL}) endif() -set(FIREBASE_PYTHON_EXECUTABLE "python" CACHE FILEPATH - "The Python interpreter to use, such as one from a venv") - set(FIREBASE_XCODE_TARGET_FORMAT "frameworks" CACHE STRING "Format to output, 'frameworks' or 'libraries'") diff --git a/analytics/CMakeLists.txt b/analytics/CMakeLists.txt index 6bc41fbc51..e511c7edb0 100644 --- a/analytics/CMakeLists.txt +++ b/analytics/CMakeLists.txt @@ -14,6 +14,13 @@ # CMake file for the firebase_analytics library +include(python_setup) +FirebaseSetupPythonInterpreter( + OUTVAR MY_PYTHON_EXECUTABLE + KEY Analytics + REQUIREMENTS absl-py +) + # Analytics generates header files for default events, parameters, and # properties based on the iOS SDK, that are used across all platforms. set(analytics_generated_headers_dir @@ -29,7 +36,7 @@ file(MAKE_DIRECTORY ${analytics_generated_headers_dir}) function(generate_analytics_header OBJC_FILE CPP_FILE) add_custom_command( OUTPUT ${CPP_FILE} - COMMAND ${FIREBASE_PYTHON_EXECUTABLE} "${CMAKE_CURRENT_LIST_DIR}/generate_constants.py" + COMMAND ${MY_PYTHON_EXECUTABLE} "${CMAKE_CURRENT_LIST_DIR}/generate_constants.py" "--objc_header=${OBJC_FILE}" "--cpp_header=${CPP_FILE}" DEPENDS ${OBJC_FILE} diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index f2d1eba528..113a1d32b1 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -14,6 +14,13 @@ # CMake file for the firebase_app library +include(python_setup) +FirebaseSetupPythonInterpreter( + OUTVAR MY_PYTHON_EXECUTABLE + KEY App + REQUIREMENTS absl-py +) + # Define how to generate google_services_resource_(source/header) binary_to_array("google_services_resource" "${CMAKE_CURRENT_LIST_DIR}/google_services.fbs" @@ -47,7 +54,7 @@ add_custom_target(FIREBASE_APP_GENERATED_HEADERS DEPENDS "${version_header}") file(MAKE_DIRECTORY ${version_header_dir}) add_custom_command( OUTPUT ${version_header} - COMMAND ${FIREBASE_PYTHON_EXECUTABLE} "${FIREBASE_SCRIPT_DIR}/version_header.py" + COMMAND ${MY_PYTHON_EXECUTABLE} "${FIREBASE_SCRIPT_DIR}/version_header.py" "--input_file=${FIREBASE_SCRIPT_DIR}/cpp_sdk_version.json" "--output_file=${version_header}" "--build_type=released" @@ -430,7 +437,7 @@ if (IOS) function(generate_analytics_header OBJC_FILE CPP_FILE) add_custom_command( OUTPUT ${CPP_FILE} - COMMAND ${FIREBASE_PYTHON_EXECUTABLE} "${FIREBASE_SOURCE_DIR}/analytics/generate_constants.py" + COMMAND ${MY_PYTHON_EXECUTABLE} "${FIREBASE_SOURCE_DIR}/analytics/generate_constants.py" "--objc_header=${OBJC_FILE}" "--cpp_header=${CPP_FILE}" DEPENDS ${OBJC_FILE} diff --git a/cmake/binary_to_array.cmake b/cmake/binary_to_array.cmake index d95bb61c6d..12e685518a 100644 --- a/cmake/binary_to_array.cmake +++ b/cmake/binary_to_array.cmake @@ -26,6 +26,13 @@ # CPP_NAMESPACE: The namespace to use in the generated files. # OUTPUT_DIRECTORY: Where the generated files should be written to. function(binary_to_array NAME INPUT CPP_NAMESPACE OUTPUT_DIRECTORY) + include(python_setup) + FirebaseSetupPythonInterpreter( + OUTVAR MY_PYTHON_EXECUTABLE + KEY BinaryToArray + REQUIREMENTS absl-py + ) + # Guarantee the output directory exists file(MAKE_DIRECTORY ${OUTPUT_DIRECTORY}) @@ -39,7 +46,7 @@ function(binary_to_array NAME INPUT CPP_NAMESPACE OUTPUT_DIRECTORY) OUTPUT ${output_source} ${output_header} DEPENDS ${INPUT} - COMMAND ${FIREBASE_PYTHON_EXECUTABLE} "${FIREBASE_SCRIPT_DIR}/binary_to_array.py" + COMMAND ${MY_PYTHON_EXECUTABLE} "${FIREBASE_SCRIPT_DIR}/binary_to_array.py" "--input=${INPUT}" "--output_header=${output_header}" "--output_source=${output_source}" diff --git a/cmake/python_setup.cmake b/cmake/python_setup.cmake new file mode 100644 index 0000000000..bdb7b9f6ae --- /dev/null +++ b/cmake/python_setup.cmake @@ -0,0 +1,183 @@ +# Copyright 2022 Google LLC +# +# Licensed 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. + +# Sets up an isolated Python interpreter, installing required dependencies. +# +# This function does the following: +# 1. Finds a Python interpreter using the best-available built-in cmake +# mechanism do do so. This is referred to as the "host" interpreter. +# 2. Creates a Python virtualenv in the cmake binary directory using the +# host Python interpreter found in the previous step. +# 3. Locates the Python interpreter in the virtualenv and sets its path in +# the specified OUTVAR variable. +# 4. Runs `pip install` to install the specified required dependencies, if any, +# in the virtualenv. +# +# This function also writes "stamp files" into the virtualenv. These files +# are used to determine if the virtualenv is up-to-date from a previous cmake +# run or if it needs to be recreated from scratch. It will simply be re-used if +# possible. +# +# If any errors occur (e.g. cannot install one of the given requirements) then a +# fatal error is logged, causing the cmake processing to terminate. +# +# See https://docs.python.org/3/library/venv.html for details about virtualenv. +# +# Arguments: +# OUTVAR - The name of the variable into which to store the path of the +# Python executable from the virtualenv. +# KEY - A unique key to ensure isolation from other Python virtualenv +# environments created by this function. This value will be incorporated +# into the path of the virtualenv and incorporated into the name of the +# cmake cache variable that stores its path. +# REQUIREMENTS - (Optional) A list of Python packages to install in the +# virtualenv. These will be given as arguments to `pip install`. +# +# Example: +# include(python_setup) +# FirebaseSetupPythonInterpreter( +# OUTVAR MY_PYTHON_EXECUTABLE +# KEY ScanStuff +# REQUIREMENTS six absl-py +# ) +# execute_process(COMMAND "${MY_PYTHON_EXECUTABLE}" scan_stuff.py) +function(FirebaseSetupPythonInterpreter) + cmake_parse_arguments( + PARSE_ARGV 0 + ARG + "" # zero-value arguments + "OUTVAR;KEY" # single-value arguments + "REQUIREMENTS" # multi-value arguments + ) + + # Validate this function's arguments. + if("${ARG_OUTVAR}" STREQUAL "") + message(FATAL_ERROR "OUTVAR must be specified to ${CMAKE_CURRENT_FUNCTION}") + elseif("${ARG_KEY}" STREQUAL "") + message(FATAL_ERROR "KEY must be specified to ${CMAKE_CURRENT_FUNCTION}") + endif() + + # Calculate the name of the cmake *cache* variable into which to store the + # path of the Python interpreter from the virtualenv. + set(CACHEVAR "FIREBASE_PYTHON_EXECUTABLE_${ARG_KEY}") + + set(LOG_PREFIX "${CMAKE_CURRENT_FUNCTION}(${ARG_KEY})") + + # Find a "host" Python interpreter using the best available mechanism. + if(${CMAKE_VERSION} VERSION_LESS "3.12") + include(FindPythonInterp) + set(DEFAULT_PYTHON_HOST_EXECUTABLE "${PYTHON_EXECUTABLE}") + else() + find_package(Python3 COMPONENTS Interpreter REQUIRED) + set(DEFAULT_PYTHON_HOST_EXECUTABLE "${Python3_EXECUTABLE}") + endif() + + # Get the host Python interpreter on the host system to use. + set( + FIREBASE_PYTHON_HOST_EXECUTABLE + "${DEFAULT_PYTHON_HOST_EXECUTABLE}" + CACHE FILEPATH + "The Python interpreter on the host system to use" + ) + + # Check if the virtualenv is already up-to-date by examining the contents of + # its stamp files. The stamp files store the path of the host Python + # interpreter and the dependencies that were installed by pip. If both of + # these files exist and contain the same Python interpreter and dependencies + # then just re-use the virtualenv; otherwise, re-create it. + set(PYVENV_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/pyvenv/${ARG_KEY}") + set(STAMP_FILE1 "${PYVENV_DIRECTORY}/cmake_firebase_python_stamp1.txt") + set(STAMP_FILE2 "${PYVENV_DIRECTORY}/cmake_firebase_python_stamp2.txt") + + if(EXISTS "${STAMP_FILE1}" AND EXISTS "${STAMP_FILE2}") + file(READ "${STAMP_FILE1}" STAMP_FILE1_CONTENTS) + file(READ "${STAMP_FILE2}" STAMP_FILE2_CONTENTS) + if( + ("${STAMP_FILE1_CONTENTS}" STREQUAL "${FIREBASE_PYTHON_HOST_EXECUTABLE}") + AND + ("${STAMP_FILE2_CONTENTS}" STREQUAL "${ARG_REQUIREMENTS}") + ) + set("${ARG_OUTVAR}" "$CACHE{${CACHEVAR}}" PARENT_SCOPE) + message(STATUS "${LOG_PREFIX}: Using Python interpreter: $CACHE{${CACHEVAR}}") + return() + endif() + endif() + + # Create the virtualenv. + message(STATUS + "${LOG_PREFIX}: Creating Python virtualenv in ${PYVENV_DIRECTORY} " + "using ${FIREBASE_PYTHON_HOST_EXECUTABLE}" + ) + file(REMOVE_RECURSE "${PYVENV_DIRECTORY}") + execute_process( + COMMAND + "${FIREBASE_PYTHON_HOST_EXECUTABLE}" + -m + venv + "${PYVENV_DIRECTORY}" + RESULT_VARIABLE + FIREBASE_PYVENV_CREATE_RESULT + ) + if(NOT FIREBASE_PYVENV_CREATE_RESULT EQUAL 0) + message(FATAL_ERROR + "Failed to create a Python virtualenv in ${PYVENV_DIRECTORY} " + "using ${FIREBASE_PYTHON_HOST_EXECUTABLE}") + endif() + + # Find the Python interpreter in the virtualenv. + find_program( + "${CACHEVAR}" + DOC "The Python interpreter to use for ${ARG_KEY}" + NAMES python3 python + PATHS "${PYVENV_DIRECTORY}" + PATH_SUFFIXES bin Scripts + NO_DEFAULT_PATH + ) + if(NOT ${CACHEVAR}) + message(FATAL_ERROR "Unable to find Python executable in ${PYVENV_DIRECTORY}") + else() + set(PYTHON_EXECUTABLE "$CACHE{${CACHEVAR}}") + message(STATUS "${LOG_PREFIX}: Found Python executable in virtualenv: ${PYTHON_EXECUTABLE}") + endif() + + # Install the dependencies in the virtualenv, if any are requested. + if(NOT ("${ARG_REQUIREMENTS}" STREQUAL "")) + message(STATUS + "${LOG_PREFIX}: Installing Python dependencies into " + "${PYVENV_DIRECTORY}: ${ARG_REQUIREMENTS}" + ) + execute_process( + COMMAND + "${PYTHON_EXECUTABLE}" + -m + pip + install + ${ARG_REQUIREMENTS} + RESULT_VARIABLE + PIP_INSTALL_RESULT + ) + if(NOT PIP_INSTALL_RESULT EQUAL 0) + message(FATAL_ERROR + "Failed to install Python dependencies into " + "${PYVENV_DIRECTORY}: ${ARG_REQUIREMENTS}" + ) + endif() + endif() + + # Write the stamp files. + file(WRITE "${STAMP_FILE1}" "${FIREBASE_PYTHON_HOST_EXECUTABLE}") + file(WRITE "${STAMP_FILE2}" "${ARG_REQUIREMENTS}") + + set("${ARG_OUTVAR}" "${PYTHON_EXECUTABLE}" PARENT_SCOPE) +endfunction(FirebaseSetupPythonInterpreter) diff --git a/external/vcpkg_custom_data/toolchains/linux_32.cmake b/external/vcpkg_custom_data/toolchains/linux_32.cmake index 778e986303..c7f57d3d38 100644 --- a/external/vcpkg_custom_data/toolchains/linux_32.cmake +++ b/external/vcpkg_custom_data/toolchains/linux_32.cmake @@ -12,6 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. +include(python_setup) +FirebaseSetupPythonInterpreter( + OUTVAR MY_PYTHON_EXECUTABLE + KEY VcpkgLinux32 +) + # Toolchain settings for building 32-bit Linux libraries set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32") @@ -436,7 +442,7 @@ function(add_executable name) elseif(_VCPKG_TARGET_TRIPLET_PLAT MATCHES "osx") if (NOT MACOSX_BUNDLE_IDX EQUAL -1) add_custom_command(TARGET ${name} POST_BUILD - COMMAND ${FIREBASE_PYTHON_EXECUTABLE} ${_VCPKG_TOOLCHAIN_DIR}/osx/applocal.py + COMMAND ${MY_PYTHON_EXECUTABLE} ${_VCPKG_TOOLCHAIN_DIR}/osx/applocal.py $ "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}$<$:/debug>" ) diff --git a/external/vcpkg_custom_data/toolchains/macos_arm64.cmake b/external/vcpkg_custom_data/toolchains/macos_arm64.cmake index c590c582ce..ca66f5ecd4 100644 --- a/external/vcpkg_custom_data/toolchains/macos_arm64.cmake +++ b/external/vcpkg_custom_data/toolchains/macos_arm64.cmake @@ -12,6 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. +include(python_setup) +FirebaseSetupPythonInterpreter( + OUTVAR MY_PYTHON_EXECUTABLE + KEY VcpkgMacOSArm64 +) + # Toolchain settings for building ARM64 MacOS libraries set(VCPKG_TARGET_ARCHITECTURE arm64) set(VCPKG_CRT_LINKAGE dynamic) @@ -438,7 +444,7 @@ function(add_executable name) elseif(_VCPKG_TARGET_TRIPLET_PLAT MATCHES "osx") if (NOT MACOSX_BUNDLE_IDX EQUAL -1) add_custom_command(TARGET ${name} POST_BUILD - COMMAND ${FIREBASE_PYTHON_EXECUTABLE} ${_VCPKG_TOOLCHAIN_DIR}/osx/applocal.py + COMMAND ${MY_PYTHON_EXECUTABLE} ${_VCPKG_TOOLCHAIN_DIR}/osx/applocal.py $ "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}$<$:/debug>" ) From 2836f21fddb24a33cda8f00a9a5180c2954159db Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Wed, 20 Apr 2022 15:28:46 -0400 Subject: [PATCH 02/20] Specify cmake version 3.10.2 in build.gradle files --- admob/build.gradle | 1 + admob/integration_test/build.gradle | 1 + analytics/build.gradle | 1 + analytics/integration_test/build.gradle | 1 + app/build.gradle | 1 + app/integration_test/build.gradle | 1 + auth/build.gradle | 1 + auth/integration_test/build.gradle | 1 + database/build.gradle | 1 + database/integration_test/build.gradle | 1 + dynamic_links/build.gradle | 1 + dynamic_links/integration_test/build.gradle | 1 + firestore/build.gradle | 1 + firestore/integration_test/build.gradle | 1 + firestore/integration_test_internal/build.gradle | 1 + functions/build.gradle | 1 + functions/integration_test/build.gradle | 1 + installations/build.gradle | 1 + installations/integration_test/build.gradle | 1 + messaging/build.gradle | 1 + messaging/integration_test/build.gradle | 1 + remote_config/build.gradle | 1 + remote_config/integration_test/build.gradle | 1 + storage/build.gradle | 1 + storage/integration_test/build.gradle | 1 + 25 files changed, 25 insertions(+) diff --git a/admob/build.gradle b/admob/build.gradle index 6b54fd5f33..af00e7cc46 100644 --- a/admob/build.gradle +++ b/admob/build.gradle @@ -48,6 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' + version '3.10.2' } } diff --git a/admob/integration_test/build.gradle b/admob/integration_test/build.gradle index de7a6f1e44..68a495d50e 100644 --- a/admob/integration_test/build.gradle +++ b/admob/integration_test/build.gradle @@ -64,6 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' + version '3.10.2' } buildTypes { release { diff --git a/analytics/build.gradle b/analytics/build.gradle index 9395803986..d6b3499068 100644 --- a/analytics/build.gradle +++ b/analytics/build.gradle @@ -48,6 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' + version '3.10.2' } } diff --git a/analytics/integration_test/build.gradle b/analytics/integration_test/build.gradle index e4dd2178e2..c874ccd06f 100644 --- a/analytics/integration_test/build.gradle +++ b/analytics/integration_test/build.gradle @@ -64,6 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' + version '3.10.2' } buildTypes { release { diff --git a/app/build.gradle b/app/build.gradle index 9ed5f73643..5cd37571fb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -48,6 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' + version '3.10.2' } } diff --git a/app/integration_test/build.gradle b/app/integration_test/build.gradle index 622410f583..16a69c414c 100644 --- a/app/integration_test/build.gradle +++ b/app/integration_test/build.gradle @@ -64,6 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' + version '3.10.2' } buildTypes { release { diff --git a/auth/build.gradle b/auth/build.gradle index 831c181747..ac05745144 100644 --- a/auth/build.gradle +++ b/auth/build.gradle @@ -48,6 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' + version '3.10.2' } } diff --git a/auth/integration_test/build.gradle b/auth/integration_test/build.gradle index 81497dfa27..3239403ede 100644 --- a/auth/integration_test/build.gradle +++ b/auth/integration_test/build.gradle @@ -64,6 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' + version '3.10.2' } buildTypes { release { diff --git a/database/build.gradle b/database/build.gradle index 8739434d0f..44c4d231ac 100644 --- a/database/build.gradle +++ b/database/build.gradle @@ -48,6 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' + version '3.10.2' } } diff --git a/database/integration_test/build.gradle b/database/integration_test/build.gradle index d78975819a..548c2916ee 100644 --- a/database/integration_test/build.gradle +++ b/database/integration_test/build.gradle @@ -64,6 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' + version '3.10.2' } buildTypes { release { diff --git a/dynamic_links/build.gradle b/dynamic_links/build.gradle index 1db97b2d96..9f3d4196af 100644 --- a/dynamic_links/build.gradle +++ b/dynamic_links/build.gradle @@ -48,6 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' + version '3.10.2' } } diff --git a/dynamic_links/integration_test/build.gradle b/dynamic_links/integration_test/build.gradle index a5cf877d35..e6abff34e4 100644 --- a/dynamic_links/integration_test/build.gradle +++ b/dynamic_links/integration_test/build.gradle @@ -64,6 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' + version '3.10.2' } buildTypes { release { diff --git a/firestore/build.gradle b/firestore/build.gradle index 13b22de7c8..371e722a34 100644 --- a/firestore/build.gradle +++ b/firestore/build.gradle @@ -48,6 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' + version '3.10.2' } } diff --git a/firestore/integration_test/build.gradle b/firestore/integration_test/build.gradle index 89215fce06..ae90403b2d 100644 --- a/firestore/integration_test/build.gradle +++ b/firestore/integration_test/build.gradle @@ -65,6 +65,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' + version '3.10.2' } buildTypes { release { diff --git a/firestore/integration_test_internal/build.gradle b/firestore/integration_test_internal/build.gradle index a8bbcbff16..c2388f3ce9 100644 --- a/firestore/integration_test_internal/build.gradle +++ b/firestore/integration_test_internal/build.gradle @@ -65,6 +65,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' + version '3.10.2' } buildTypes { release { diff --git a/functions/build.gradle b/functions/build.gradle index c350b092f1..f127f140dd 100644 --- a/functions/build.gradle +++ b/functions/build.gradle @@ -48,6 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' + version '3.10.2' } } diff --git a/functions/integration_test/build.gradle b/functions/integration_test/build.gradle index 7617f84b08..7975f6cbde 100644 --- a/functions/integration_test/build.gradle +++ b/functions/integration_test/build.gradle @@ -64,6 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' + version '3.10.2' } buildTypes { release { diff --git a/installations/build.gradle b/installations/build.gradle index 783689c6d4..3f5bdd8f8a 100644 --- a/installations/build.gradle +++ b/installations/build.gradle @@ -48,6 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' + version '3.10.2' } } diff --git a/installations/integration_test/build.gradle b/installations/integration_test/build.gradle index 82899da6eb..d944705357 100644 --- a/installations/integration_test/build.gradle +++ b/installations/integration_test/build.gradle @@ -64,6 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' + version '3.10.2' } buildTypes { release { diff --git a/messaging/build.gradle b/messaging/build.gradle index e6399fc77a..b70ab41710 100644 --- a/messaging/build.gradle +++ b/messaging/build.gradle @@ -48,6 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' + version '3.10.2' } } diff --git a/messaging/integration_test/build.gradle b/messaging/integration_test/build.gradle index ae7e118f2a..13bc6e52c8 100644 --- a/messaging/integration_test/build.gradle +++ b/messaging/integration_test/build.gradle @@ -64,6 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' + version '3.10.2' } buildTypes { release { diff --git a/remote_config/build.gradle b/remote_config/build.gradle index 28f582eff4..7b65bfd7cb 100644 --- a/remote_config/build.gradle +++ b/remote_config/build.gradle @@ -48,6 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' + version '3.10.2' } } diff --git a/remote_config/integration_test/build.gradle b/remote_config/integration_test/build.gradle index 9307ce4a86..bed22c2fec 100644 --- a/remote_config/integration_test/build.gradle +++ b/remote_config/integration_test/build.gradle @@ -64,6 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' + version '3.10.2' } buildTypes { release { diff --git a/storage/build.gradle b/storage/build.gradle index 2c2b6bc50a..4dda77bcb5 100644 --- a/storage/build.gradle +++ b/storage/build.gradle @@ -48,6 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' + version '3.10.2' } } diff --git a/storage/integration_test/build.gradle b/storage/integration_test/build.gradle index 8616c8d875..e5521aaed1 100644 --- a/storage/integration_test/build.gradle +++ b/storage/integration_test/build.gradle @@ -64,6 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' + version '3.10.2' } buildTypes { release { From e21af9066e0a0e38a7ee93e43452e6dfbd1837a0 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Wed, 20 Apr 2022 22:21:36 -0400 Subject: [PATCH 03/20] Update cmake version in build.gradle files to 3.18.1 (was 3.10.2) because 3.10.2 is not supported on windows-latest GitHub runners --- admob/build.gradle | 2 +- admob/integration_test/build.gradle | 2 +- analytics/build.gradle | 2 +- analytics/integration_test/build.gradle | 2 +- app/build.gradle | 2 +- app/integration_test/build.gradle | 2 +- auth/build.gradle | 2 +- auth/integration_test/build.gradle | 2 +- database/build.gradle | 2 +- database/integration_test/build.gradle | 2 +- dynamic_links/build.gradle | 2 +- dynamic_links/integration_test/build.gradle | 2 +- firestore/build.gradle | 2 +- firestore/integration_test/build.gradle | 2 +- firestore/integration_test_internal/build.gradle | 2 +- functions/build.gradle | 2 +- functions/integration_test/build.gradle | 2 +- installations/build.gradle | 2 +- installations/integration_test/build.gradle | 2 +- messaging/build.gradle | 2 +- messaging/integration_test/build.gradle | 2 +- remote_config/build.gradle | 2 +- remote_config/integration_test/build.gradle | 2 +- storage/build.gradle | 2 +- storage/integration_test/build.gradle | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/admob/build.gradle b/admob/build.gradle index af00e7cc46..35e2b9ea6b 100644 --- a/admob/build.gradle +++ b/admob/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' + version '3.18.1' } } diff --git a/admob/integration_test/build.gradle b/admob/integration_test/build.gradle index 68a495d50e..298003853a 100644 --- a/admob/integration_test/build.gradle +++ b/admob/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' + version '3.18.1' } buildTypes { release { diff --git a/analytics/build.gradle b/analytics/build.gradle index d6b3499068..17debd6dcd 100644 --- a/analytics/build.gradle +++ b/analytics/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' + version '3.18.1' } } diff --git a/analytics/integration_test/build.gradle b/analytics/integration_test/build.gradle index c874ccd06f..eb4fafa5d3 100644 --- a/analytics/integration_test/build.gradle +++ b/analytics/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' + version '3.18.1' } buildTypes { release { diff --git a/app/build.gradle b/app/build.gradle index 5cd37571fb..286242088c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' + version '3.18.1' } } diff --git a/app/integration_test/build.gradle b/app/integration_test/build.gradle index 16a69c414c..5b8afc1574 100644 --- a/app/integration_test/build.gradle +++ b/app/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' + version '3.18.1' } buildTypes { release { diff --git a/auth/build.gradle b/auth/build.gradle index ac05745144..9ea2403f74 100644 --- a/auth/build.gradle +++ b/auth/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' + version '3.18.1' } } diff --git a/auth/integration_test/build.gradle b/auth/integration_test/build.gradle index 3239403ede..667b3c7c88 100644 --- a/auth/integration_test/build.gradle +++ b/auth/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' + version '3.18.1' } buildTypes { release { diff --git a/database/build.gradle b/database/build.gradle index 44c4d231ac..85700107f4 100644 --- a/database/build.gradle +++ b/database/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' + version '3.18.1' } } diff --git a/database/integration_test/build.gradle b/database/integration_test/build.gradle index 548c2916ee..4c580ecd99 100644 --- a/database/integration_test/build.gradle +++ b/database/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' + version '3.18.1' } buildTypes { release { diff --git a/dynamic_links/build.gradle b/dynamic_links/build.gradle index 9f3d4196af..1425125078 100644 --- a/dynamic_links/build.gradle +++ b/dynamic_links/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' + version '3.18.1' } } diff --git a/dynamic_links/integration_test/build.gradle b/dynamic_links/integration_test/build.gradle index e6abff34e4..5d80e49f86 100644 --- a/dynamic_links/integration_test/build.gradle +++ b/dynamic_links/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' + version '3.18.1' } buildTypes { release { diff --git a/firestore/build.gradle b/firestore/build.gradle index 371e722a34..d153992e09 100644 --- a/firestore/build.gradle +++ b/firestore/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' + version '3.18.1' } } diff --git a/firestore/integration_test/build.gradle b/firestore/integration_test/build.gradle index ae90403b2d..a329065f7f 100644 --- a/firestore/integration_test/build.gradle +++ b/firestore/integration_test/build.gradle @@ -65,7 +65,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' + version '3.18.1' } buildTypes { release { diff --git a/firestore/integration_test_internal/build.gradle b/firestore/integration_test_internal/build.gradle index c2388f3ce9..e2c61c0de1 100644 --- a/firestore/integration_test_internal/build.gradle +++ b/firestore/integration_test_internal/build.gradle @@ -65,7 +65,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' + version '3.18.1' } buildTypes { release { diff --git a/functions/build.gradle b/functions/build.gradle index f127f140dd..076019d971 100644 --- a/functions/build.gradle +++ b/functions/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' + version '3.18.1' } } diff --git a/functions/integration_test/build.gradle b/functions/integration_test/build.gradle index 7975f6cbde..eff8046cb2 100644 --- a/functions/integration_test/build.gradle +++ b/functions/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' + version '3.18.1' } buildTypes { release { diff --git a/installations/build.gradle b/installations/build.gradle index 3f5bdd8f8a..52c6e60492 100644 --- a/installations/build.gradle +++ b/installations/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' + version '3.18.1' } } diff --git a/installations/integration_test/build.gradle b/installations/integration_test/build.gradle index d944705357..0e79b5f444 100644 --- a/installations/integration_test/build.gradle +++ b/installations/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' + version '3.18.1' } buildTypes { release { diff --git a/messaging/build.gradle b/messaging/build.gradle index b70ab41710..7fc004339c 100644 --- a/messaging/build.gradle +++ b/messaging/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' + version '3.18.1' } } diff --git a/messaging/integration_test/build.gradle b/messaging/integration_test/build.gradle index 13bc6e52c8..3eac8e8c90 100644 --- a/messaging/integration_test/build.gradle +++ b/messaging/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' + version '3.18.1' } buildTypes { release { diff --git a/remote_config/build.gradle b/remote_config/build.gradle index 7b65bfd7cb..d0857743a7 100644 --- a/remote_config/build.gradle +++ b/remote_config/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' + version '3.18.1' } } diff --git a/remote_config/integration_test/build.gradle b/remote_config/integration_test/build.gradle index bed22c2fec..8b9f1a0d79 100644 --- a/remote_config/integration_test/build.gradle +++ b/remote_config/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' + version '3.18.1' } buildTypes { release { diff --git a/storage/build.gradle b/storage/build.gradle index 4dda77bcb5..83dfed761f 100644 --- a/storage/build.gradle +++ b/storage/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' + version '3.18.1' } } diff --git a/storage/integration_test/build.gradle b/storage/integration_test/build.gradle index e5521aaed1..6b3ebd7176 100644 --- a/storage/integration_test/build.gradle +++ b/storage/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' + version '3.18.1' } buildTypes { release { From 463dff18e9adfae347ceb09848edc65a6127a177 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Wed, 20 Apr 2022 23:44:29 -0400 Subject: [PATCH 04/20] Revert "Update cmake version in build.gradle files to 3.18.1 (was 3.10.2) because 3.10.2 is not supported on windows-latest GitHub runners" This reverts commit e21af9066e0a0e38a7ee93e43452e6dfbd1837a0. Using cmake 3.18.1 from the Android NDK suffered from the bug where the build failed with "Invalid revision: 3.18.1-g262b901". This is a known android studio bug that, for some reason, has never been fixed. --- admob/build.gradle | 2 +- admob/integration_test/build.gradle | 2 +- analytics/build.gradle | 2 +- analytics/integration_test/build.gradle | 2 +- app/build.gradle | 2 +- app/integration_test/build.gradle | 2 +- auth/build.gradle | 2 +- auth/integration_test/build.gradle | 2 +- database/build.gradle | 2 +- database/integration_test/build.gradle | 2 +- dynamic_links/build.gradle | 2 +- dynamic_links/integration_test/build.gradle | 2 +- firestore/build.gradle | 2 +- firestore/integration_test/build.gradle | 2 +- firestore/integration_test_internal/build.gradle | 2 +- functions/build.gradle | 2 +- functions/integration_test/build.gradle | 2 +- installations/build.gradle | 2 +- installations/integration_test/build.gradle | 2 +- messaging/build.gradle | 2 +- messaging/integration_test/build.gradle | 2 +- remote_config/build.gradle | 2 +- remote_config/integration_test/build.gradle | 2 +- storage/build.gradle | 2 +- storage/integration_test/build.gradle | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/admob/build.gradle b/admob/build.gradle index 35e2b9ea6b..af00e7cc46 100644 --- a/admob/build.gradle +++ b/admob/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.18.1' + version '3.10.2' } } diff --git a/admob/integration_test/build.gradle b/admob/integration_test/build.gradle index 298003853a..68a495d50e 100644 --- a/admob/integration_test/build.gradle +++ b/admob/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.18.1' + version '3.10.2' } buildTypes { release { diff --git a/analytics/build.gradle b/analytics/build.gradle index 17debd6dcd..d6b3499068 100644 --- a/analytics/build.gradle +++ b/analytics/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.18.1' + version '3.10.2' } } diff --git a/analytics/integration_test/build.gradle b/analytics/integration_test/build.gradle index eb4fafa5d3..c874ccd06f 100644 --- a/analytics/integration_test/build.gradle +++ b/analytics/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.18.1' + version '3.10.2' } buildTypes { release { diff --git a/app/build.gradle b/app/build.gradle index 286242088c..5cd37571fb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.18.1' + version '3.10.2' } } diff --git a/app/integration_test/build.gradle b/app/integration_test/build.gradle index 5b8afc1574..16a69c414c 100644 --- a/app/integration_test/build.gradle +++ b/app/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.18.1' + version '3.10.2' } buildTypes { release { diff --git a/auth/build.gradle b/auth/build.gradle index 9ea2403f74..ac05745144 100644 --- a/auth/build.gradle +++ b/auth/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.18.1' + version '3.10.2' } } diff --git a/auth/integration_test/build.gradle b/auth/integration_test/build.gradle index 667b3c7c88..3239403ede 100644 --- a/auth/integration_test/build.gradle +++ b/auth/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.18.1' + version '3.10.2' } buildTypes { release { diff --git a/database/build.gradle b/database/build.gradle index 85700107f4..44c4d231ac 100644 --- a/database/build.gradle +++ b/database/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.18.1' + version '3.10.2' } } diff --git a/database/integration_test/build.gradle b/database/integration_test/build.gradle index 4c580ecd99..548c2916ee 100644 --- a/database/integration_test/build.gradle +++ b/database/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.18.1' + version '3.10.2' } buildTypes { release { diff --git a/dynamic_links/build.gradle b/dynamic_links/build.gradle index 1425125078..9f3d4196af 100644 --- a/dynamic_links/build.gradle +++ b/dynamic_links/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.18.1' + version '3.10.2' } } diff --git a/dynamic_links/integration_test/build.gradle b/dynamic_links/integration_test/build.gradle index 5d80e49f86..e6abff34e4 100644 --- a/dynamic_links/integration_test/build.gradle +++ b/dynamic_links/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.18.1' + version '3.10.2' } buildTypes { release { diff --git a/firestore/build.gradle b/firestore/build.gradle index d153992e09..371e722a34 100644 --- a/firestore/build.gradle +++ b/firestore/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.18.1' + version '3.10.2' } } diff --git a/firestore/integration_test/build.gradle b/firestore/integration_test/build.gradle index a329065f7f..ae90403b2d 100644 --- a/firestore/integration_test/build.gradle +++ b/firestore/integration_test/build.gradle @@ -65,7 +65,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.18.1' + version '3.10.2' } buildTypes { release { diff --git a/firestore/integration_test_internal/build.gradle b/firestore/integration_test_internal/build.gradle index e2c61c0de1..c2388f3ce9 100644 --- a/firestore/integration_test_internal/build.gradle +++ b/firestore/integration_test_internal/build.gradle @@ -65,7 +65,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.18.1' + version '3.10.2' } buildTypes { release { diff --git a/functions/build.gradle b/functions/build.gradle index 076019d971..f127f140dd 100644 --- a/functions/build.gradle +++ b/functions/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.18.1' + version '3.10.2' } } diff --git a/functions/integration_test/build.gradle b/functions/integration_test/build.gradle index eff8046cb2..7975f6cbde 100644 --- a/functions/integration_test/build.gradle +++ b/functions/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.18.1' + version '3.10.2' } buildTypes { release { diff --git a/installations/build.gradle b/installations/build.gradle index 52c6e60492..3f5bdd8f8a 100644 --- a/installations/build.gradle +++ b/installations/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.18.1' + version '3.10.2' } } diff --git a/installations/integration_test/build.gradle b/installations/integration_test/build.gradle index 0e79b5f444..d944705357 100644 --- a/installations/integration_test/build.gradle +++ b/installations/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.18.1' + version '3.10.2' } buildTypes { release { diff --git a/messaging/build.gradle b/messaging/build.gradle index 7fc004339c..b70ab41710 100644 --- a/messaging/build.gradle +++ b/messaging/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.18.1' + version '3.10.2' } } diff --git a/messaging/integration_test/build.gradle b/messaging/integration_test/build.gradle index 3eac8e8c90..13bc6e52c8 100644 --- a/messaging/integration_test/build.gradle +++ b/messaging/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.18.1' + version '3.10.2' } buildTypes { release { diff --git a/remote_config/build.gradle b/remote_config/build.gradle index d0857743a7..7b65bfd7cb 100644 --- a/remote_config/build.gradle +++ b/remote_config/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.18.1' + version '3.10.2' } } diff --git a/remote_config/integration_test/build.gradle b/remote_config/integration_test/build.gradle index 8b9f1a0d79..bed22c2fec 100644 --- a/remote_config/integration_test/build.gradle +++ b/remote_config/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.18.1' + version '3.10.2' } buildTypes { release { diff --git a/storage/build.gradle b/storage/build.gradle index 83dfed761f..4dda77bcb5 100644 --- a/storage/build.gradle +++ b/storage/build.gradle @@ -48,7 +48,7 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.18.1' + version '3.10.2' } } diff --git a/storage/integration_test/build.gradle b/storage/integration_test/build.gradle index 6b3ebd7176..e5521aaed1 100644 --- a/storage/integration_test/build.gradle +++ b/storage/integration_test/build.gradle @@ -64,7 +64,7 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.18.1' + version '3.10.2' } buildTypes { release { From c670fafc49fada0e56aad2a206c7d0dbd41ae610 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Wed, 20 Apr 2022 23:59:33 -0400 Subject: [PATCH 05/20] Revert "Specify cmake version 3.10.2 in build.gradle files" This reverts commit 2836f21fddb24a33cda8f00a9a5180c2954159db. Cmake 3.10.2 is not installed on the windows-latest GitHub Actions runner image. --- admob/build.gradle | 1 - admob/integration_test/build.gradle | 1 - analytics/build.gradle | 1 - analytics/integration_test/build.gradle | 1 - app/build.gradle | 1 - app/integration_test/build.gradle | 1 - auth/build.gradle | 1 - auth/integration_test/build.gradle | 1 - database/build.gradle | 1 - database/integration_test/build.gradle | 1 - dynamic_links/build.gradle | 1 - dynamic_links/integration_test/build.gradle | 1 - firestore/build.gradle | 1 - firestore/integration_test/build.gradle | 1 - firestore/integration_test_internal/build.gradle | 1 - functions/build.gradle | 1 - functions/integration_test/build.gradle | 1 - installations/build.gradle | 1 - installations/integration_test/build.gradle | 1 - messaging/build.gradle | 1 - messaging/integration_test/build.gradle | 1 - remote_config/build.gradle | 1 - remote_config/integration_test/build.gradle | 1 - storage/build.gradle | 1 - storage/integration_test/build.gradle | 1 - 25 files changed, 25 deletions(-) diff --git a/admob/build.gradle b/admob/build.gradle index af00e7cc46..6b54fd5f33 100644 --- a/admob/build.gradle +++ b/admob/build.gradle @@ -48,7 +48,6 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' } } diff --git a/admob/integration_test/build.gradle b/admob/integration_test/build.gradle index 68a495d50e..de7a6f1e44 100644 --- a/admob/integration_test/build.gradle +++ b/admob/integration_test/build.gradle @@ -64,7 +64,6 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' } buildTypes { release { diff --git a/analytics/build.gradle b/analytics/build.gradle index d6b3499068..9395803986 100644 --- a/analytics/build.gradle +++ b/analytics/build.gradle @@ -48,7 +48,6 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' } } diff --git a/analytics/integration_test/build.gradle b/analytics/integration_test/build.gradle index c874ccd06f..e4dd2178e2 100644 --- a/analytics/integration_test/build.gradle +++ b/analytics/integration_test/build.gradle @@ -64,7 +64,6 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' } buildTypes { release { diff --git a/app/build.gradle b/app/build.gradle index 5cd37571fb..9ed5f73643 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -48,7 +48,6 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' } } diff --git a/app/integration_test/build.gradle b/app/integration_test/build.gradle index 16a69c414c..622410f583 100644 --- a/app/integration_test/build.gradle +++ b/app/integration_test/build.gradle @@ -64,7 +64,6 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' } buildTypes { release { diff --git a/auth/build.gradle b/auth/build.gradle index ac05745144..831c181747 100644 --- a/auth/build.gradle +++ b/auth/build.gradle @@ -48,7 +48,6 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' } } diff --git a/auth/integration_test/build.gradle b/auth/integration_test/build.gradle index 3239403ede..81497dfa27 100644 --- a/auth/integration_test/build.gradle +++ b/auth/integration_test/build.gradle @@ -64,7 +64,6 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' } buildTypes { release { diff --git a/database/build.gradle b/database/build.gradle index 44c4d231ac..8739434d0f 100644 --- a/database/build.gradle +++ b/database/build.gradle @@ -48,7 +48,6 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' } } diff --git a/database/integration_test/build.gradle b/database/integration_test/build.gradle index 548c2916ee..d78975819a 100644 --- a/database/integration_test/build.gradle +++ b/database/integration_test/build.gradle @@ -64,7 +64,6 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' } buildTypes { release { diff --git a/dynamic_links/build.gradle b/dynamic_links/build.gradle index 9f3d4196af..1db97b2d96 100644 --- a/dynamic_links/build.gradle +++ b/dynamic_links/build.gradle @@ -48,7 +48,6 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' } } diff --git a/dynamic_links/integration_test/build.gradle b/dynamic_links/integration_test/build.gradle index e6abff34e4..a5cf877d35 100644 --- a/dynamic_links/integration_test/build.gradle +++ b/dynamic_links/integration_test/build.gradle @@ -64,7 +64,6 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' } buildTypes { release { diff --git a/firestore/build.gradle b/firestore/build.gradle index 371e722a34..13b22de7c8 100644 --- a/firestore/build.gradle +++ b/firestore/build.gradle @@ -48,7 +48,6 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' } } diff --git a/firestore/integration_test/build.gradle b/firestore/integration_test/build.gradle index ae90403b2d..89215fce06 100644 --- a/firestore/integration_test/build.gradle +++ b/firestore/integration_test/build.gradle @@ -65,7 +65,6 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' } buildTypes { release { diff --git a/firestore/integration_test_internal/build.gradle b/firestore/integration_test_internal/build.gradle index c2388f3ce9..a8bbcbff16 100644 --- a/firestore/integration_test_internal/build.gradle +++ b/firestore/integration_test_internal/build.gradle @@ -65,7 +65,6 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' } buildTypes { release { diff --git a/functions/build.gradle b/functions/build.gradle index f127f140dd..c350b092f1 100644 --- a/functions/build.gradle +++ b/functions/build.gradle @@ -48,7 +48,6 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' } } diff --git a/functions/integration_test/build.gradle b/functions/integration_test/build.gradle index 7975f6cbde..7617f84b08 100644 --- a/functions/integration_test/build.gradle +++ b/functions/integration_test/build.gradle @@ -64,7 +64,6 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' } buildTypes { release { diff --git a/installations/build.gradle b/installations/build.gradle index 3f5bdd8f8a..783689c6d4 100644 --- a/installations/build.gradle +++ b/installations/build.gradle @@ -48,7 +48,6 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' } } diff --git a/installations/integration_test/build.gradle b/installations/integration_test/build.gradle index d944705357..82899da6eb 100644 --- a/installations/integration_test/build.gradle +++ b/installations/integration_test/build.gradle @@ -64,7 +64,6 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' } buildTypes { release { diff --git a/messaging/build.gradle b/messaging/build.gradle index b70ab41710..e6399fc77a 100644 --- a/messaging/build.gradle +++ b/messaging/build.gradle @@ -48,7 +48,6 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' } } diff --git a/messaging/integration_test/build.gradle b/messaging/integration_test/build.gradle index 13bc6e52c8..ae7e118f2a 100644 --- a/messaging/integration_test/build.gradle +++ b/messaging/integration_test/build.gradle @@ -64,7 +64,6 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' } buildTypes { release { diff --git a/remote_config/build.gradle b/remote_config/build.gradle index 7b65bfd7cb..28f582eff4 100644 --- a/remote_config/build.gradle +++ b/remote_config/build.gradle @@ -48,7 +48,6 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' } } diff --git a/remote_config/integration_test/build.gradle b/remote_config/integration_test/build.gradle index bed22c2fec..9307ce4a86 100644 --- a/remote_config/integration_test/build.gradle +++ b/remote_config/integration_test/build.gradle @@ -64,7 +64,6 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' } buildTypes { release { diff --git a/storage/build.gradle b/storage/build.gradle index 4dda77bcb5..2c2b6bc50a 100644 --- a/storage/build.gradle +++ b/storage/build.gradle @@ -48,7 +48,6 @@ android { externalNativeBuild { cmake { path '../CMakeLists.txt' - version '3.10.2' } } diff --git a/storage/integration_test/build.gradle b/storage/integration_test/build.gradle index e5521aaed1..8616c8d875 100644 --- a/storage/integration_test/build.gradle +++ b/storage/integration_test/build.gradle @@ -64,7 +64,6 @@ android { } externalNativeBuild.cmake { path 'CMakeLists.txt' - version '3.10.2' } buildTypes { release { From c6cba893a228f85d97bd26dffdcf7b8e1a099b1d Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Thu, 21 Apr 2022 00:00:29 -0400 Subject: [PATCH 06/20] install_prereqs.sh: ensure cmake 3.18.1 is the only cmake installed in the android sdk --- build_scripts/android/install_prereqs.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/build_scripts/android/install_prereqs.sh b/build_scripts/android/install_prereqs.sh index ffc601da2d..6409eb8efe 100755 --- a/build_scripts/android/install_prereqs.sh +++ b/build_scripts/android/install_prereqs.sh @@ -86,3 +86,8 @@ if [[ -z "${NDK_ROOT}" || -z $(grep "Pkg\.Revision = 16\." "${NDK_ROOT}/source.p echo "NDK r16b has been downloaded into /tmp/android-ndk-r16b" fi fi + +# Make sure that only the desired version of cmake is installed so that it will be chosen +# by the Android Gradle Plugin during the build. +"${ANDROID_HOME}/tools/bin/sdkmanager" --uninstall "cmake;3.10.2.4988404" "cmake;3.6.4111459" +"${ANDROID_HOME}/tools/bin/sdkmanager" --install "cmake;3.18.1" From a3b4de8d896c7764f9771d0c450d16ce088f1c76 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Thu, 21 Apr 2022 01:04:10 -0400 Subject: [PATCH 07/20] install_prereqs.sh: fix sdkmanager invocation on windows --- build_scripts/android/install_prereqs.sh | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/build_scripts/android/install_prereqs.sh b/build_scripts/android/install_prereqs.sh index 6409eb8efe..f19229f372 100755 --- a/build_scripts/android/install_prereqs.sh +++ b/build_scripts/android/install_prereqs.sh @@ -60,6 +60,16 @@ if [[ -z "${ANDROID_HOME}" ]]; then exit 1 fi +# Uninstall all versions of cmake from the Android SDK, except for the one that we want. +# That way, during the build, the Android Gradle Plugin will select the one and only cmake version. +readonly SDK_MANAGER="$(python -c "import pathlib; print(pathlib.Path(r'${ANDROID_HOME}/tools/bin/sdkmanager'))")" +if [[ ! -e ${SDK_MANAGER} ]] ; then + echo "Error, ${SDK_MANAGER} not found" + exit 1 +fi +"${SDK_MANAGER}" --uninstall "cmake;3.10.2.4988404" "cmake;3.6.4111459" +"${SDK_MANAGER}" --install "cmake;3.18.1" + if [[ -z "${NDK_ROOT}" || -z $(grep "Pkg\.Revision = 16\." "${NDK_ROOT}/source.properties") ]]; then if [[ -d /tmp/android-ndk-r16b && \ -n $(grep "Pkg\.Revision = 16\." "/tmp/android-ndk-r16b/source.properties") ]]; then @@ -86,8 +96,3 @@ if [[ -z "${NDK_ROOT}" || -z $(grep "Pkg\.Revision = 16\." "${NDK_ROOT}/source.p echo "NDK r16b has been downloaded into /tmp/android-ndk-r16b" fi fi - -# Make sure that only the desired version of cmake is installed so that it will be chosen -# by the Android Gradle Plugin during the build. -"${ANDROID_HOME}/tools/bin/sdkmanager" --uninstall "cmake;3.10.2.4988404" "cmake;3.6.4111459" -"${ANDROID_HOME}/tools/bin/sdkmanager" --install "cmake;3.18.1" From bc920fbaa7696ef7b6d74cf4df20227cbd9452d1 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Thu, 21 Apr 2022 02:25:26 -0400 Subject: [PATCH 08/20] install_prereqs.sh: try to convert the sdkmanager path to a posix path --- build_scripts/android/install_prereqs.sh | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/build_scripts/android/install_prereqs.sh b/build_scripts/android/install_prereqs.sh index f19229f372..d12242e197 100755 --- a/build_scripts/android/install_prereqs.sh +++ b/build_scripts/android/install_prereqs.sh @@ -62,11 +62,7 @@ fi # Uninstall all versions of cmake from the Android SDK, except for the one that we want. # That way, during the build, the Android Gradle Plugin will select the one and only cmake version. -readonly SDK_MANAGER="$(python -c "import pathlib; print(pathlib.Path(r'${ANDROID_HOME}/tools/bin/sdkmanager'))")" -if [[ ! -e ${SDK_MANAGER} ]] ; then - echo "Error, ${SDK_MANAGER} not found" - exit 1 -fi +SDK_MANAGER="$(python -c "import pathlib; print(pathlib.Path(r'${ANDROID_HOME}/tools/bin/sdkmanager').as_posix())")" "${SDK_MANAGER}" --uninstall "cmake;3.10.2.4988404" "cmake;3.6.4111459" "${SDK_MANAGER}" --install "cmake;3.18.1" From 7536ef2f7dabe9acf696009efbcbd2d32e3ec724 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Thu, 21 Apr 2022 11:28:55 -0400 Subject: [PATCH 09/20] sdkmanager_cmake_setup.py added --- build_scripts/android/install_prereqs.sh | 6 +- .../android/sdkmanager_cmake_setup.py | 226 ++++++++++++++++++ 2 files changed, 227 insertions(+), 5 deletions(-) create mode 100644 build_scripts/android/sdkmanager_cmake_setup.py diff --git a/build_scripts/android/install_prereqs.sh b/build_scripts/android/install_prereqs.sh index d12242e197..a9f85e9a35 100755 --- a/build_scripts/android/install_prereqs.sh +++ b/build_scripts/android/install_prereqs.sh @@ -60,11 +60,7 @@ if [[ -z "${ANDROID_HOME}" ]]; then exit 1 fi -# Uninstall all versions of cmake from the Android SDK, except for the one that we want. -# That way, during the build, the Android Gradle Plugin will select the one and only cmake version. -SDK_MANAGER="$(python -c "import pathlib; print(pathlib.Path(r'${ANDROID_HOME}/tools/bin/sdkmanager').as_posix())")" -"${SDK_MANAGER}" --uninstall "cmake;3.10.2.4988404" "cmake;3.6.4111459" -"${SDK_MANAGER}" --install "cmake;3.18.1" +python build_scripts/android/sdkmanager_cmake_setup.py if [[ -z "${NDK_ROOT}" || -z $(grep "Pkg\.Revision = 16\." "${NDK_ROOT}/source.properties") ]]; then if [[ -d /tmp/android-ndk-r16b && \ diff --git a/build_scripts/android/sdkmanager_cmake_setup.py b/build_scripts/android/sdkmanager_cmake_setup.py new file mode 100644 index 0000000000..e64e2d99ba --- /dev/null +++ b/build_scripts/android/sdkmanager_cmake_setup.py @@ -0,0 +1,226 @@ +# Copyright 2022 Google LLC +# +# Licensed 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. + +""" +Ensures that there is exactly one version of cmake installed in the Android SDK, +and that that version is the correct version. + +Doing this ensures that Gradle builds use a supported version of cmake. +""" + +from __future__ import annotations + +import dataclasses +import enum +import io +import logging +import os +import pathlib +import platform +import sys +import subprocess +import tempfile +from typing import FrozenSet, IO, Iterable, MutableSet, Optional + + +def main() -> None: + if len(sys.argv) > 1: + raise Exception(f"unexpected argument: {sys.argv[1]}") + + logging.basicConfig( + level=logging.INFO, + format=os.path.basename(__file__) + " %(message)s", + ) + + setup = AndroidSdkCmakeSetup() + setup.run() + + +@dataclasses.dataclass(frozen=True) +class CmakeVersions: + installed: FrozenSet[str] + available: FrozenSet[str] + + +class AndroidSdkCmakeSetup: + + REQUIRED_CMAKE_VERSION = "cmake;3.18.1" + + def run(self) -> None: + cmake_versions = self.get_cmake_versions_from_sdkmanager() + self.log_cmake_versions(cmake_versions) + if self.REQUIRED_CMAKE_VERSION not in cmake_versions.available: + raise Exception( + "The required cmake version is not available in sdkmanager: " + + self.REQUIRED_CMAKE_VERSION + ) + + self.uninstall_unwanted_cmake_versions(cmake_versions) + self.install_wanted_cmake_version(cmake_versions) + + cmake_versions_after = self.get_cmake_versions_from_sdkmanager() + if cmake_versions_after.installed != frozenset([self.REQUIRED_CMAKE_VERSION]): + raise Exception( + "Unexpected version(s) of cmake installed in sdkmanager: " + + ", ".join(sorted(cmake_versions_after.installed)) + + " (expected " + self.REQUIRED_CMAKE_VERSION + ")") + + logging.info( + "sdkmanager successfully configured the one and only installed " + "cmake version: %s", + self.REQUIRED_CMAKE_VERSION + ) + + def get_cmake_versions_from_sdkmanager(self) -> CmakeVersions: + with tempfile.TemporaryFile() as stdout_tempfile: + self.run_sdkmanager(["--list"], stdout=stdout_tempfile) + stdout_tempfile.seek(0) + sdkmanager_output = stdout_tempfile.read().decode("utf8", errors="ignore") + + installed_cmakes: MutableSet[str] = set() + available_cmakes: MutableSet[str] = set() + with io.StringIO(sdkmanager_output) as f: + current_cmakes = installed_cmakes + for line in f: + if line.strip() == "Available Packages:": + current_cmakes = available_cmakes + if line.strip().startswith("cmake;"): + cmake_version = line.split("|")[0].strip() + current_cmakes.add(cmake_version) + + if current_cmakes is installed_cmakes: + raise Exception(f"Parsing sdkmanager output failed") + + return CmakeVersions( + installed=frozenset(installed_cmakes), + available=frozenset(available_cmakes), + ) + + def log_cmake_versions(self, cmake_versions: CmakeVersions) -> None: + logging.info( + "sdkmanager reported installed cmake versions (%s):", + len(cmake_versions.installed), + ) + for (i, version) in enumerate(sorted(cmake_versions.installed), start=1): + logging.info(" %s. %s", i, version) + + logging.info( + "sdkmanager reported available cmake versions (%s):", + len(cmake_versions.available), + ) + for (i, version) in enumerate(sorted(cmake_versions.available), start=1): + logging.info(" %s. %s", i, version) + + def uninstall_unwanted_cmake_versions(self, cmake_versions: CmakeVersions) -> None: + cmake_versions_to_uninstall = [ + version + for version in cmake_versions.installed + if version != self.REQUIRED_CMAKE_VERSION + ] + if not cmake_versions_to_uninstall: + logging.info( + "No undesired installed versions of cmake installed in sdkmanager; " + "nothing to uninstall" + ) + return + + cmake_versions_to_uninstall.sort() + logging.info( + "Uninstalling %s cmake versions: %s", + len(cmake_versions_to_uninstall), + ", ".join(cmake_versions_to_uninstall) + ) + self.run_sdkmanager(["--uninstall"] + cmake_versions_to_uninstall) + + def install_wanted_cmake_version(self, cmake_versions: CmakeVersions) -> None: + if self.REQUIRED_CMAKE_VERSION in cmake_versions.installed: + logging.info( + "The desired cmake version is already installed in sdkmanager: %s", + self.REQUIRED_CMAKE_VERSION + ) + return + + logging.info("Installing cmake version: %s", self.REQUIRED_CMAKE_VERSION) + self.run_sdkmanager(["--install", self.REQUIRED_CMAKE_VERSION]) + + def run_sdkmanager( + self, + args: Iterable[str], + stdout: Optional[IO[bytes]] = None, + ) -> None: + self.run_command(self.sdkmanager_path(), args, stdout=stdout) + + def run_command( + self, + executable: pathlib.Path, + args: Iterable[str], + stdout: Optional[IO[bytes]] = None, + ) -> None: + subprocess_args = [str(executable)] + subprocess_args.extend(args) + subprocess_args_str = subprocess.list2cmdline(subprocess_args) + logging.info("Running command: %s", subprocess_args_str) + + with tempfile.TemporaryFile() as stderr_file: + subprocess_ok = False + try: + subprocess.check_call(subprocess_args, stdout=stdout, stderr=stderr_file) + subprocess_ok = True + finally: + if not subprocess_ok: + stderr_file.seek(0) + print(stderr_file.read().decode("utf8", errors="ignore"), file=sys.stderr) + + def sdkmanager_path(self) -> pathlib.Path: + android_home_str = os.environ.get("ANDROID_HOME") + if not android_home_str: + raise Exception("ANDROID_HOME environment variable is not set") + + android_home = pathlib.Path(android_home_str) + + if Platform.is_windows(): + sdkmanager_path = android_home / "tools" / "bin" / "sdkmanager.exe" + else: + sdkmanager_path = android_home / "tools" / "bin" / "sdkmanager" + + if not sdkmanager_path.exists(): + raise Exception(f"file not found: {sdkmanager_path}") + + return sdkmanager_path + + +class Platform(enum.Enum): + WINDOWS = "Windows" + LINUX = "Linux" + MACOS = "macOS" + + @classmethod + def current(cls) -> Platform: + system_name = platform.system() + if system_name == "Windows": + return cls.WINDOWS + elif system_name == "Linux": + return cls.LINUX + elif system_name == "Darwin": + return cls.MACOS + else: + raise Exception(f"unknown return value from platform.system(): {system_name}") + + @classmethod + def is_windows(cls) -> bool: + return cls.current() == cls.WINDOWS + + +if __name__ == "__main__": + main() From 6c9098d3ea4b2f3bf659cd5524feaf62c9058b3a Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Thu, 21 Apr 2022 12:05:57 -0400 Subject: [PATCH 10/20] sdkmanager_cmake_setup.py: sdkmanager.exe -> sdkmanager.bat --- build_scripts/android/sdkmanager_cmake_setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_scripts/android/sdkmanager_cmake_setup.py b/build_scripts/android/sdkmanager_cmake_setup.py index e64e2d99ba..fe536dd441 100644 --- a/build_scripts/android/sdkmanager_cmake_setup.py +++ b/build_scripts/android/sdkmanager_cmake_setup.py @@ -190,7 +190,7 @@ def sdkmanager_path(self) -> pathlib.Path: android_home = pathlib.Path(android_home_str) if Platform.is_windows(): - sdkmanager_path = android_home / "tools" / "bin" / "sdkmanager.exe" + sdkmanager_path = android_home / "tools" / "bin" / "sdkmanager.bat" else: sdkmanager_path = android_home / "tools" / "bin" / "sdkmanager" From 7a8c4511a81adec884c3833a6380a2226d5cc8ad Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Thu, 21 Apr 2022 15:25:31 -0400 Subject: [PATCH 11/20] sdkmanager_cmake_setup.py: set cmake.dir in local.properties --- .../android/sdkmanager_cmake_setup.py | 57 +++++++++++++++++-- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/build_scripts/android/sdkmanager_cmake_setup.py b/build_scripts/android/sdkmanager_cmake_setup.py index fe536dd441..12398ddc9f 100644 --- a/build_scripts/android/sdkmanager_cmake_setup.py +++ b/build_scripts/android/sdkmanager_cmake_setup.py @@ -28,6 +28,7 @@ import os import pathlib import platform +import re import sys import subprocess import tempfile @@ -68,7 +69,29 @@ def run(self) -> None: self.uninstall_unwanted_cmake_versions(cmake_versions) self.install_wanted_cmake_version(cmake_versions) - + self.verify_cmake_versions() + self.write_local_properties() + + def write_local_properties(self) -> None: + cmake_dir = self.cmake_dir_path().resolve() + local_properties_line = "cmake.dir=" + re.sub(r"([:\\])", r"\\\1", str(cmake_dir)) + logging.info("Writing line \"%s\" to local.properties files", local_properties_line) + + for build_gradle_file in self.iter_build_gradle_cmake_files(): + local_properties_file = build_gradle_file.parent / "local.properties" + logging.info("Updating %s", local_properties_file) + with local_properties_file.open("at", encoding="utf8") as f: + print("", file=f) + print(local_properties_line, file=f) + + def iter_build_gradle_cmake_files(self) -> Iterable[pathlib.Path]: + for build_gradle_path in pathlib.Path.cwd().glob("**/build.gradle"): + with build_gradle_path.open("rt", encoding="utf8", errors="ignore") as f: + build_gradle_text = f.read() + if "externalNativeBuild" in build_gradle_text: + yield build_gradle_path + + def verify_cmake_versions(self) -> None: cmake_versions_after = self.get_cmake_versions_from_sdkmanager() if cmake_versions_after.installed != frozenset([self.REQUIRED_CMAKE_VERSION]): raise Exception( @@ -182,23 +205,49 @@ def run_command( stderr_file.seek(0) print(stderr_file.read().decode("utf8", errors="ignore"), file=sys.stderr) - def sdkmanager_path(self) -> pathlib.Path: + def android_home_path(self) -> pathlib.Path: android_home_str = os.environ.get("ANDROID_HOME") if not android_home_str: raise Exception("ANDROID_HOME environment variable is not set") android_home = pathlib.Path(android_home_str) + if not android_home.exists(): + raise Exception(f"ANDROID_HOME directory not found: {android_home}") + + return android_home + def sdkmanager_path(self) -> pathlib.Path: if Platform.is_windows(): - sdkmanager_path = android_home / "tools" / "bin" / "sdkmanager.bat" + sdkmanager_exe_filename = "sdkmanager.bat" else: - sdkmanager_path = android_home / "tools" / "bin" / "sdkmanager" + sdkmanager_exe_filename = "sdkmanager" + sdkmanager_path = self.android_home_path() / "tools" / "bin" / sdkmanager_exe_filename if not sdkmanager_path.exists(): raise Exception(f"file not found: {sdkmanager_path}") return sdkmanager_path + def cmake_dir_path(self) -> pathlib.Path: + cmakes_dir = self.android_home_path() / "cmake" + if not cmakes_dir.exists(): + raise Exception(f"cmake directory not found: {cmakes_dir}") + + cmake_dir = None + for cmakes_dir_entry in cmakes_dir.iterdir(): + if cmake_dir is None: + cmake_dir = cmakes_dir_entry + else: + raise Exception( + f"multiple cmake directories found in {cmakes_dir}: " + + cmake_dir.name + " and " + cmakes_dir_entry.name + ) + + if cmake_dir is None: + raise Exception(f"no subdirectories found in {cmakes_dir}") + + return cmake_dir + class Platform(enum.Enum): WINDOWS = "Windows" From 91a7fa05408bc5413df15c15e5b6d46a66596901 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Thu, 21 Apr 2022 16:21:58 -0400 Subject: [PATCH 12/20] Replace sdkmanager_cmake_setup.py with set_cmake_version_in_build_gradle_files.py --- build_scripts/android/install_prereqs.sh | 2 +- .../android/sdkmanager_cmake_setup.py | 275 ------------------ ...set_cmake_version_in_build_gradle_files.py | 98 +++++++ 3 files changed, 99 insertions(+), 276 deletions(-) delete mode 100644 build_scripts/android/sdkmanager_cmake_setup.py create mode 100644 build_scripts/android/set_cmake_version_in_build_gradle_files.py diff --git a/build_scripts/android/install_prereqs.sh b/build_scripts/android/install_prereqs.sh index a9f85e9a35..19e230a980 100755 --- a/build_scripts/android/install_prereqs.sh +++ b/build_scripts/android/install_prereqs.sh @@ -60,7 +60,7 @@ if [[ -z "${ANDROID_HOME}" ]]; then exit 1 fi -python build_scripts/android/sdkmanager_cmake_setup.py +python build_scripts/android/set_cmake_version_in_build_gradle_files.py if [[ -z "${NDK_ROOT}" || -z $(grep "Pkg\.Revision = 16\." "${NDK_ROOT}/source.properties") ]]; then if [[ -d /tmp/android-ndk-r16b && \ diff --git a/build_scripts/android/sdkmanager_cmake_setup.py b/build_scripts/android/sdkmanager_cmake_setup.py deleted file mode 100644 index 12398ddc9f..0000000000 --- a/build_scripts/android/sdkmanager_cmake_setup.py +++ /dev/null @@ -1,275 +0,0 @@ -# Copyright 2022 Google LLC -# -# Licensed 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. - -""" -Ensures that there is exactly one version of cmake installed in the Android SDK, -and that that version is the correct version. - -Doing this ensures that Gradle builds use a supported version of cmake. -""" - -from __future__ import annotations - -import dataclasses -import enum -import io -import logging -import os -import pathlib -import platform -import re -import sys -import subprocess -import tempfile -from typing import FrozenSet, IO, Iterable, MutableSet, Optional - - -def main() -> None: - if len(sys.argv) > 1: - raise Exception(f"unexpected argument: {sys.argv[1]}") - - logging.basicConfig( - level=logging.INFO, - format=os.path.basename(__file__) + " %(message)s", - ) - - setup = AndroidSdkCmakeSetup() - setup.run() - - -@dataclasses.dataclass(frozen=True) -class CmakeVersions: - installed: FrozenSet[str] - available: FrozenSet[str] - - -class AndroidSdkCmakeSetup: - - REQUIRED_CMAKE_VERSION = "cmake;3.18.1" - - def run(self) -> None: - cmake_versions = self.get_cmake_versions_from_sdkmanager() - self.log_cmake_versions(cmake_versions) - if self.REQUIRED_CMAKE_VERSION not in cmake_versions.available: - raise Exception( - "The required cmake version is not available in sdkmanager: " - + self.REQUIRED_CMAKE_VERSION - ) - - self.uninstall_unwanted_cmake_versions(cmake_versions) - self.install_wanted_cmake_version(cmake_versions) - self.verify_cmake_versions() - self.write_local_properties() - - def write_local_properties(self) -> None: - cmake_dir = self.cmake_dir_path().resolve() - local_properties_line = "cmake.dir=" + re.sub(r"([:\\])", r"\\\1", str(cmake_dir)) - logging.info("Writing line \"%s\" to local.properties files", local_properties_line) - - for build_gradle_file in self.iter_build_gradle_cmake_files(): - local_properties_file = build_gradle_file.parent / "local.properties" - logging.info("Updating %s", local_properties_file) - with local_properties_file.open("at", encoding="utf8") as f: - print("", file=f) - print(local_properties_line, file=f) - - def iter_build_gradle_cmake_files(self) -> Iterable[pathlib.Path]: - for build_gradle_path in pathlib.Path.cwd().glob("**/build.gradle"): - with build_gradle_path.open("rt", encoding="utf8", errors="ignore") as f: - build_gradle_text = f.read() - if "externalNativeBuild" in build_gradle_text: - yield build_gradle_path - - def verify_cmake_versions(self) -> None: - cmake_versions_after = self.get_cmake_versions_from_sdkmanager() - if cmake_versions_after.installed != frozenset([self.REQUIRED_CMAKE_VERSION]): - raise Exception( - "Unexpected version(s) of cmake installed in sdkmanager: " - + ", ".join(sorted(cmake_versions_after.installed)) - + " (expected " + self.REQUIRED_CMAKE_VERSION + ")") - - logging.info( - "sdkmanager successfully configured the one and only installed " - "cmake version: %s", - self.REQUIRED_CMAKE_VERSION - ) - - def get_cmake_versions_from_sdkmanager(self) -> CmakeVersions: - with tempfile.TemporaryFile() as stdout_tempfile: - self.run_sdkmanager(["--list"], stdout=stdout_tempfile) - stdout_tempfile.seek(0) - sdkmanager_output = stdout_tempfile.read().decode("utf8", errors="ignore") - - installed_cmakes: MutableSet[str] = set() - available_cmakes: MutableSet[str] = set() - with io.StringIO(sdkmanager_output) as f: - current_cmakes = installed_cmakes - for line in f: - if line.strip() == "Available Packages:": - current_cmakes = available_cmakes - if line.strip().startswith("cmake;"): - cmake_version = line.split("|")[0].strip() - current_cmakes.add(cmake_version) - - if current_cmakes is installed_cmakes: - raise Exception(f"Parsing sdkmanager output failed") - - return CmakeVersions( - installed=frozenset(installed_cmakes), - available=frozenset(available_cmakes), - ) - - def log_cmake_versions(self, cmake_versions: CmakeVersions) -> None: - logging.info( - "sdkmanager reported installed cmake versions (%s):", - len(cmake_versions.installed), - ) - for (i, version) in enumerate(sorted(cmake_versions.installed), start=1): - logging.info(" %s. %s", i, version) - - logging.info( - "sdkmanager reported available cmake versions (%s):", - len(cmake_versions.available), - ) - for (i, version) in enumerate(sorted(cmake_versions.available), start=1): - logging.info(" %s. %s", i, version) - - def uninstall_unwanted_cmake_versions(self, cmake_versions: CmakeVersions) -> None: - cmake_versions_to_uninstall = [ - version - for version in cmake_versions.installed - if version != self.REQUIRED_CMAKE_VERSION - ] - if not cmake_versions_to_uninstall: - logging.info( - "No undesired installed versions of cmake installed in sdkmanager; " - "nothing to uninstall" - ) - return - - cmake_versions_to_uninstall.sort() - logging.info( - "Uninstalling %s cmake versions: %s", - len(cmake_versions_to_uninstall), - ", ".join(cmake_versions_to_uninstall) - ) - self.run_sdkmanager(["--uninstall"] + cmake_versions_to_uninstall) - - def install_wanted_cmake_version(self, cmake_versions: CmakeVersions) -> None: - if self.REQUIRED_CMAKE_VERSION in cmake_versions.installed: - logging.info( - "The desired cmake version is already installed in sdkmanager: %s", - self.REQUIRED_CMAKE_VERSION - ) - return - - logging.info("Installing cmake version: %s", self.REQUIRED_CMAKE_VERSION) - self.run_sdkmanager(["--install", self.REQUIRED_CMAKE_VERSION]) - - def run_sdkmanager( - self, - args: Iterable[str], - stdout: Optional[IO[bytes]] = None, - ) -> None: - self.run_command(self.sdkmanager_path(), args, stdout=stdout) - - def run_command( - self, - executable: pathlib.Path, - args: Iterable[str], - stdout: Optional[IO[bytes]] = None, - ) -> None: - subprocess_args = [str(executable)] - subprocess_args.extend(args) - subprocess_args_str = subprocess.list2cmdline(subprocess_args) - logging.info("Running command: %s", subprocess_args_str) - - with tempfile.TemporaryFile() as stderr_file: - subprocess_ok = False - try: - subprocess.check_call(subprocess_args, stdout=stdout, stderr=stderr_file) - subprocess_ok = True - finally: - if not subprocess_ok: - stderr_file.seek(0) - print(stderr_file.read().decode("utf8", errors="ignore"), file=sys.stderr) - - def android_home_path(self) -> pathlib.Path: - android_home_str = os.environ.get("ANDROID_HOME") - if not android_home_str: - raise Exception("ANDROID_HOME environment variable is not set") - - android_home = pathlib.Path(android_home_str) - if not android_home.exists(): - raise Exception(f"ANDROID_HOME directory not found: {android_home}") - - return android_home - - def sdkmanager_path(self) -> pathlib.Path: - if Platform.is_windows(): - sdkmanager_exe_filename = "sdkmanager.bat" - else: - sdkmanager_exe_filename = "sdkmanager" - - sdkmanager_path = self.android_home_path() / "tools" / "bin" / sdkmanager_exe_filename - if not sdkmanager_path.exists(): - raise Exception(f"file not found: {sdkmanager_path}") - - return sdkmanager_path - - def cmake_dir_path(self) -> pathlib.Path: - cmakes_dir = self.android_home_path() / "cmake" - if not cmakes_dir.exists(): - raise Exception(f"cmake directory not found: {cmakes_dir}") - - cmake_dir = None - for cmakes_dir_entry in cmakes_dir.iterdir(): - if cmake_dir is None: - cmake_dir = cmakes_dir_entry - else: - raise Exception( - f"multiple cmake directories found in {cmakes_dir}: " - + cmake_dir.name + " and " + cmakes_dir_entry.name - ) - - if cmake_dir is None: - raise Exception(f"no subdirectories found in {cmakes_dir}") - - return cmake_dir - - -class Platform(enum.Enum): - WINDOWS = "Windows" - LINUX = "Linux" - MACOS = "macOS" - - @classmethod - def current(cls) -> Platform: - system_name = platform.system() - if system_name == "Windows": - return cls.WINDOWS - elif system_name == "Linux": - return cls.LINUX - elif system_name == "Darwin": - return cls.MACOS - else: - raise Exception(f"unknown return value from platform.system(): {system_name}") - - @classmethod - def is_windows(cls) -> bool: - return cls.current() == cls.WINDOWS - - -if __name__ == "__main__": - main() diff --git a/build_scripts/android/set_cmake_version_in_build_gradle_files.py b/build_scripts/android/set_cmake_version_in_build_gradle_files.py new file mode 100644 index 0000000000..ba1763b214 --- /dev/null +++ b/build_scripts/android/set_cmake_version_in_build_gradle_files.py @@ -0,0 +1,98 @@ +# Copyright 2022 Google LLC +# +# Licensed 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. + +""" +Updates all build.gradle files to explicitly specify the version of cmake to use. + +This avoids gradle builds using the default cmake version 3.6 that is bundled with the +Android SDK, since our minimum-supported cmake version is 3.7. +""" + +from __future__ import annotations + +import io +import logging +import os +import pathlib +import re +import sys +import subprocess +import tempfile +from typing import Iterable + + +def main() -> None: + if len(sys.argv) > 1: + raise Exception(f"unexpected argument: {sys.argv[1]}") + + logging.basicConfig( + level=logging.INFO, + format=os.path.basename(__file__) + " %(message)s", + ) + + run() + + +def run() -> None: + cmake_version = get_cmake_version() + + logging.info("Setting cmake version to %s in build.gradle files", cmake_version) + expr = re.compile(r"(\s*)path\s+'.*CMakeLists.txt'(\s*)") + + for build_gradle_file in iter_build_gradle_cmake_files(): + logging.info("Setting cmake version to %s in %s", cmake_version, build_gradle_file) + with build_gradle_file.open("rt", encoding="utf8") as f: + lines = list(f) + + for i in range(len(lines)): + line = lines[i] + match = expr.fullmatch(line) + if match: + indent = match.group(1) + eol = match.group(2) + lines.insert(i+1, indent + "version '" + cmake_version + "'" + eol) + break + else: + raise Exception(f"Unable to find place to insert cmake version in {build_gradle_file}") + + with build_gradle_file.open("wt", encoding="utf8") as f: + f.writelines(lines) + +def iter_build_gradle_cmake_files() -> Iterable[pathlib.Path]: + for build_gradle_path in pathlib.Path.cwd().glob("**/build.gradle"): + with build_gradle_path.open("rt", encoding="utf8", errors="ignore") as f: + build_gradle_text = f.read() + if "externalNativeBuild" in build_gradle_text and "cmake" in build_gradle_text: + yield build_gradle_path + +def get_cmake_version() -> str: + args = ["cmake", "--version"] + logging.info("Running command: %s", subprocess.list2cmdline(args)) + + with tempfile.TemporaryFile() as stdout_file: + subprocess.check_call(args, stdout=stdout_file) + stdout_file.seek(0) + cmake_output = stdout_file.read().decode("utf8", errors="replace") + + version_line_prefix = "cmake version" + for line in io.StringIO(cmake_output): + if line.startswith(version_line_prefix): + return line[len(version_line_prefix):].strip() + + print(cmake_output) + raise Exception(f"Unable to determine version of cmake") + + +if __name__ == "__main__": + main() From 8d9d500d7774cf11f63a5dd95740bbce1506a125 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Thu, 21 Apr 2022 20:24:59 -0400 Subject: [PATCH 13/20] build_scripts/android/build.sh: add --stacktrace to gradlew to help with debugging build issues --- build_scripts/android/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_scripts/android/build.sh b/build_scripts/android/build.sh index f2373e3ea9..8e444e6757 100755 --- a/build_scripts/android/build.sh +++ b/build_scripts/android/build.sh @@ -61,7 +61,7 @@ gradleparams="-Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false\ -Dmaven.wagon.httpconnectionManager.ttlSeconds=120" for retry in {1..10} error; do if [[ $retry == "error" ]]; then exit 5; fi - ./gradlew assembleRelease "${gradleparams}" && break + ./gradlew --stacktrace assembleRelease "${gradleparams}" && break sleep 300 done set -e From eda98aea02e9952ea3b8d1563375f47b6cb65824 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Thu, 21 Apr 2022 23:51:57 -0400 Subject: [PATCH 14/20] cmake_gradle_setup.py: install cmake 3.18.0 with pip, and use it. --- ..._gradle_files.py => cmake_gradle_setup.py} | 54 ++++++++++++------- build_scripts/android/install_prereqs.sh | 2 +- 2 files changed, 37 insertions(+), 19 deletions(-) rename build_scripts/android/{set_cmake_version_in_build_gradle_files.py => cmake_gradle_setup.py} (58%) diff --git a/build_scripts/android/set_cmake_version_in_build_gradle_files.py b/build_scripts/android/cmake_gradle_setup.py similarity index 58% rename from build_scripts/android/set_cmake_version_in_build_gradle_files.py rename to build_scripts/android/cmake_gradle_setup.py index ba1763b214..c8d6a32654 100644 --- a/build_scripts/android/set_cmake_version_in_build_gradle_files.py +++ b/build_scripts/android/cmake_gradle_setup.py @@ -25,11 +25,13 @@ import logging import os import pathlib +import platform import re import sys import subprocess import tempfile -from typing import Iterable +from typing import Iterable, Tuple +import venv def main() -> None: @@ -45,12 +47,12 @@ def main() -> None: def run() -> None: - cmake_version = get_cmake_version() + (cmake_version, cmake_dir) = install_cmake() - logging.info("Setting cmake version to %s in build.gradle files", cmake_version) - expr = re.compile(r"(\s*)path\s+'.*CMakeLists.txt'(\s*)") + build_gradle_cmake_files = tuple(sorted(iter_build_gradle_cmake_files())) - for build_gradle_file in iter_build_gradle_cmake_files(): + expr = re.compile(r"(\s*)path\s+'.*CMakeLists.txt'(\s*)") + for build_gradle_file in build_gradle_cmake_files: logging.info("Setting cmake version to %s in %s", cmake_version, build_gradle_file) with build_gradle_file.open("rt", encoding="utf8") as f: lines = list(f) @@ -69,6 +71,15 @@ def run() -> None: with build_gradle_file.open("wt", encoding="utf8") as f: f.writelines(lines) + cmake_dir_local_properties_line = "cmake.dir=" + re.sub(r"([:\\])", r"\\\1", str(cmake_dir.resolve())) + for build_gradle_file in (pathlib.Path.cwd() / "build.gradle",) + build_gradle_cmake_files: + local_properties_file = build_gradle_file.parent / "local.properties" + logging.info("Setting %s in %s", cmake_dir_local_properties_line, local_properties_file) + with local_properties_file.open("at", encoding="utf8") as f: + print("", file=f) + print(cmake_dir_local_properties_line, file=f) + + def iter_build_gradle_cmake_files() -> Iterable[pathlib.Path]: for build_gradle_path in pathlib.Path.cwd().glob("**/build.gradle"): with build_gradle_path.open("rt", encoding="utf8", errors="ignore") as f: @@ -76,22 +87,29 @@ def iter_build_gradle_cmake_files() -> Iterable[pathlib.Path]: if "externalNativeBuild" in build_gradle_text and "cmake" in build_gradle_text: yield build_gradle_path -def get_cmake_version() -> str: - args = ["cmake", "--version"] - logging.info("Running command: %s", subprocess.list2cmdline(args)) - with tempfile.TemporaryFile() as stdout_file: - subprocess.check_call(args, stdout=stdout_file) - stdout_file.seek(0) - cmake_output = stdout_file.read().decode("utf8", errors="replace") +def install_cmake() -> Tuple[str, pathlib.Path]: + cmake_version = "3.18.0" + venv_path_str = tempfile.mkdtemp(prefix=f"cmake-{cmake_version}_", dir=pathlib.Path.cwd()) + venv_path = pathlib.Path(venv_path_str) + logging.info("Creating a Python virtualenv for cmake %s in %s", cmake_version, venv_path) + + venv.create(venv_path, with_pip=True) + + if platform.system() == "Windows": + pip_exe = venv_path / "Scripts" / "pip.exe" + cmake_exe = venv_path / "Scripts" / "cmake.exe" + else: + pip_exe = venv_path / "bin" / "pip" + cmake_exe = venv_path / "bin" / "cmake" + + logging.info("Installing cmake %s in %s using %s", cmake_version, venv_path, pip_exe) + subprocess.check_output([str(pip_exe), "install", f"cmake=={cmake_version}"]) - version_line_prefix = "cmake version" - for line in io.StringIO(cmake_output): - if line.startswith(version_line_prefix): - return line[len(version_line_prefix):].strip() + if not cmake_exe.exists(): + raise Exception(f"File not found: {cmake_exe}") - print(cmake_output) - raise Exception(f"Unable to determine version of cmake") + return (cmake_version, venv_path) if __name__ == "__main__": diff --git a/build_scripts/android/install_prereqs.sh b/build_scripts/android/install_prereqs.sh index 19e230a980..1f1c0b9c0a 100755 --- a/build_scripts/android/install_prereqs.sh +++ b/build_scripts/android/install_prereqs.sh @@ -60,7 +60,7 @@ if [[ -z "${ANDROID_HOME}" ]]; then exit 1 fi -python build_scripts/android/set_cmake_version_in_build_gradle_files.py +python build_scripts/android/cmake_gradle_setup.py if [[ -z "${NDK_ROOT}" || -z $(grep "Pkg\.Revision = 16\." "${NDK_ROOT}/source.properties") ]]; then if [[ -d /tmp/android-ndk-r16b && \ From 3af2327dadeca84c4847b33c2e3d9acaa3a9f753 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Fri, 22 Apr 2022 08:30:03 -0400 Subject: [PATCH 15/20] cmake_gradle_setup.py: also install ninja --- build_scripts/android/cmake_gradle_setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_scripts/android/cmake_gradle_setup.py b/build_scripts/android/cmake_gradle_setup.py index c8d6a32654..5715c8d333 100644 --- a/build_scripts/android/cmake_gradle_setup.py +++ b/build_scripts/android/cmake_gradle_setup.py @@ -104,7 +104,7 @@ def install_cmake() -> Tuple[str, pathlib.Path]: cmake_exe = venv_path / "bin" / "cmake" logging.info("Installing cmake %s in %s using %s", cmake_version, venv_path, pip_exe) - subprocess.check_output([str(pip_exe), "install", f"cmake=={cmake_version}"]) + subprocess.check_output([str(pip_exe), "install", f"cmake=={cmake_version}", "ninja"]) if not cmake_exe.exists(): raise Exception(f"File not found: {cmake_exe}") From e8d86304801752be09cc71f342959a861ed4c5bc Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Fri, 22 Apr 2022 11:36:39 -0400 Subject: [PATCH 16/20] cmake_gradle_setup.py: copy cmake and ninja exe files to bin directory on windows --- build_scripts/android/cmake_gradle_setup.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/build_scripts/android/cmake_gradle_setup.py b/build_scripts/android/cmake_gradle_setup.py index 5715c8d333..6f93896f7d 100644 --- a/build_scripts/android/cmake_gradle_setup.py +++ b/build_scripts/android/cmake_gradle_setup.py @@ -27,6 +27,7 @@ import pathlib import platform import re +import shutil import sys import subprocess import tempfile @@ -99,15 +100,29 @@ def install_cmake() -> Tuple[str, pathlib.Path]: if platform.system() == "Windows": pip_exe = venv_path / "Scripts" / "pip.exe" cmake_exe = venv_path / "Scripts" / "cmake.exe" + ninja_exe = venv_path / "Scripts" / "ninja.exe" else: pip_exe = venv_path / "bin" / "pip" cmake_exe = venv_path / "bin" / "cmake" + ninja_exe = venv_path / "bin" / "ninja" logging.info("Installing cmake %s in %s using %s", cmake_version, venv_path, pip_exe) subprocess.check_output([str(pip_exe), "install", f"cmake=={cmake_version}", "ninja"]) if not cmake_exe.exists(): raise Exception(f"File not found: {cmake_exe}") + if not ninja_exe.exists(): + raise Exception(f"File not found: {ninja_exe}") + + if platform.system() == "Windows": + bin_dir = venv_path / "bin" + bin_dir.mkdir(exist_ok=True) + cmake_bin_exe = bin_dir / cmake_exe.name + ninja_bin_exe = bin_dir / ninja_exe.name + logging.info("Copying %s to %s", cmake_exe, cmake_bin_exe) + shutil.copy2(cmake_exe, cmake_bin_exe) + logging.info("Copying %s to %s", ninja_exe, ninja_bin_exe) + shutil.copy2(ninja_exe, ninja_bin_exe) return (cmake_version, venv_path) From 28a39e0094f26bfd90ea468bdf932eba56146a9b Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Fri, 22 Apr 2022 20:17:21 -0400 Subject: [PATCH 17/20] cmake_gradle_setup.py: print python version and path --- build_scripts/android/cmake_gradle_setup.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build_scripts/android/cmake_gradle_setup.py b/build_scripts/android/cmake_gradle_setup.py index 6f93896f7d..084087ba79 100644 --- a/build_scripts/android/cmake_gradle_setup.py +++ b/build_scripts/android/cmake_gradle_setup.py @@ -48,6 +48,9 @@ def main() -> None: def run() -> None: + logging.info("Python Interpreter: %s", sys.executable) + logging.info("Python Version: %s", sys.version) + (cmake_version, cmake_dir) = install_cmake() build_gradle_cmake_files = tuple(sorted(iter_build_gradle_cmake_files())) From a75f522cb4b09e75726c5651e984c35fed113bc4 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Fri, 22 Apr 2022 20:20:08 -0400 Subject: [PATCH 18/20] build_scripts/android/build.sh: reduce retries from 10 to 1 --- build_scripts/android/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_scripts/android/build.sh b/build_scripts/android/build.sh index 8e444e6757..64a2cbc84c 100755 --- a/build_scripts/android/build.sh +++ b/build_scripts/android/build.sh @@ -59,7 +59,7 @@ set +e # network connectivity issues that cause the download to fail. gradleparams="-Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false\ -Dmaven.wagon.httpconnectionManager.ttlSeconds=120" -for retry in {1..10} error; do +for retry in {1..1} error; do if [[ $retry == "error" ]]; then exit 5; fi ./gradlew --stacktrace assembleRelease "${gradleparams}" && break sleep 300 From b3115f3b47a29ca366d1bce24b75c9df3dea9414 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Sun, 24 Apr 2022 00:14:37 -0400 Subject: [PATCH 19/20] cmake_gradle_setup.py: add -DFIREBASE_PYTHON_HOST_EXECUTABLE to cmake arguments in build.gradle files --- build_scripts/android/cmake_gradle_setup.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/build_scripts/android/cmake_gradle_setup.py b/build_scripts/android/cmake_gradle_setup.py index 084087ba79..a6c8af25f4 100644 --- a/build_scripts/android/cmake_gradle_setup.py +++ b/build_scripts/android/cmake_gradle_setup.py @@ -61,6 +61,8 @@ def run() -> None: with build_gradle_file.open("rt", encoding="utf8") as f: lines = list(f) + version_line_added = False + arguments_modified = False for i in range(len(lines)): line = lines[i] match = expr.fullmatch(line) @@ -68,9 +70,24 @@ def run() -> None: indent = match.group(1) eol = match.group(2) lines.insert(i+1, indent + "version '" + cmake_version + "'" + eol) - break - else: + version_line_added = True + elif line.strip().startswith("arguments "): + eol = line[len(line.rstrip()):] + lines[i] = ( + line.rstrip() + + (" " if line.rstrip().endswith(",") else ", ") + + "'-DFIREBASE_PYTHON_HOST_EXECUTABLE:FILEPATH=" + + sys.executable.replace("\\", "\\\\") + + "'" + + ("," if line.rstrip().endswith(",") else "") + + eol + ) + arguments_modified = True + + if not version_line_added: raise Exception(f"Unable to find place to insert cmake version in {build_gradle_file}") + elif not arguments_modified: + raise Exception(f"Unable to find place to edit cmake arguments in {build_gradle_file}") with build_gradle_file.open("wt", encoding="utf8") as f: f.writelines(lines) From df5f8ae2327ba17b8a8874a5af4203f00037674b Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Mon, 25 Apr 2022 10:27:35 -0400 Subject: [PATCH 20/20] build_testapps.py: Escape backslash and colon in gradle.properties on Windows --- scripts/gha/build_testapps.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/gha/build_testapps.py b/scripts/gha/build_testapps.py index 6a3d71785d..44e78b70f2 100644 --- a/scripts/gha/build_testapps.py +++ b/scripts/gha/build_testapps.py @@ -76,6 +76,7 @@ import datetime import os import platform +import re import shutil import subprocess import sys @@ -477,7 +478,8 @@ def _build_android(project_dir, sdk_dir): """Builds an Android binary (apk).""" if platform.system() == "Windows": gradlew = "gradlew.bat" - sdk_dir = sdk_dir.replace("\\", "/") # Gradle misinterprets backslashes. + # Gradle misinterprets backslashes and colons. + sdk_dir = re.sub(r"([:\\])", r"\\\1", sdk_dir) else: gradlew = "./gradlew" logging.info("Patching gradle properties with path to SDK")