#!/bin/bash set -euo pipefail # Set-up our environment source $(dirname $0)/env.sh # Include utilities source "${IRONFOX_UTILS}" if [[ -z "${IRONFOX_FROM_SOURCES+x}" ]]; then echo_red_text "ERROR: Do not call get_sources-if.sh directly. Instead, use get_sources.sh." >&1 exit 1 fi # Set verbosity if [[ "${IRONFOX_VERBOSE}" == 1 ]]; then set -x else set +x fi readonly target="$1" readonly mode="$2" # Set-up target parameters IRONFOX_GET_SOURCE_ANDROGUARD=0 IRONFOX_GET_SOURCE_ANDROID_NDK=0 IRONFOX_GET_SOURCE_ANDROID_SDK=0 IRONFOX_GET_SOURCE_ANDROID_SDK_BUILD_TOOLS=0 IRONFOX_GET_SOURCE_ANDROID_SDK_BUILD_TOOLS_35=0 IRONFOX_GET_SOURCE_ANDROID_SDK_PLATFORM=0 IRONFOX_GET_SOURCE_ANDROID_SDK_PLATFORM_36=0 IRONFOX_GET_SOURCE_ANDROID_SDK_PLATFORM_TOOLS=0 IRONFOX_GET_SOURCE_AS=0 IRONFOX_GET_SOURCE_BUNDLETOOL=0 IRONFOX_GET_SOURCE_CBINDGEN=0 IRONFOX_GET_SOURCE_GECKO=0 IRONFOX_GET_SOURCE_GECKO_L10N=0 IRONFOX_GET_SOURCE_GLEAN=0 IRONFOX_GET_SOURCE_GLEAN_PARSER=0 IRONFOX_GET_SOURCE_GRADLE=0 IRONFOX_GET_SOURCE_GYP=0 IRONFOX_GET_SOURCE_JDK_17=0 IRONFOX_GET_SOURCE_JDK_21=0 IRONFOX_GET_SOURCE_JDK_25=0 IRONFOX_GET_SOURCE_MICROG=0 IRONFOX_GET_SOURCE_NODE=0 IRONFOX_GET_SOURCE_NPM=0 IRONFOX_GET_SOURCE_PHOENIX=0 IRONFOX_GET_SOURCE_PIP=0 IRONFOX_GET_SOURCE_PREBUILDS=0 IRONFOX_GET_SOURCE_PYTHON=0 IRONFOX_GET_SOURCE_PYYAML=0 IRONFOX_GET_SOURCE_RUST=0 IRONFOX_GET_SOURCE_S3CMD=0 IRONFOX_GET_SOURCE_UNIFFI=0 IRONFOX_GET_SOURCE_UP_AC=0 IRONFOX_GET_SOURCE_UV=0 IRONFOX_GET_SOURCE_WASI=0 if [[ "${target}" == 'androguard' ]]; then # Get androguard ## NOTE: This isn't installed if "all" is used below, as it's only used in CI and targeted specifically when it's needed IRONFOX_GET_SOURCE_ANDROGUARD=1 elif [[ "${target}" == 'android-ndk' ]]; then # Get Android NDK IRONFOX_GET_SOURCE_ANDROID_NDK=1 elif [[ "${target}" == 'android-sdk' ]]; then # Get Android SDK IRONFOX_GET_SOURCE_ANDROID_SDK=1 elif [[ "${target}" == 'android-sdk-build-tools' ]]; then # Get Android SDK Build Tools (latest) IRONFOX_GET_SOURCE_ANDROID_SDK_BUILD_TOOLS=1 elif [[ "${target}" == 'android-sdk-build-tools-35' ]]; then # Get Android SDK Build Tools (35) (Required by Glean) IRONFOX_GET_SOURCE_ANDROID_SDK_BUILD_TOOLS_35=1 elif [[ "${target}" == 'android-sdk-platform' ]]; then # Get Android SDK Platform (latest) IRONFOX_GET_SOURCE_ANDROID_SDK_PLATFORM=1 elif [[ "${target}" == 'android-sdk-platform-36' ]]; then # Get Android SDK Platform (36) IRONFOX_GET_SOURCE_ANDROID_SDK_PLATFORM_36=1 elif [[ "${target}" == 'android-sdk-platform-tools' ]]; then # Get Android SDK Platform Tools IRONFOX_GET_SOURCE_ANDROID_SDK_PLATFORM_TOOLS=1 elif [[ "${target}" == 'as' ]]; then # Get Application Services IRONFOX_GET_SOURCE_AS=1 elif [[ "${target}" == 'bundletool' ]]; then # Get + set-up Bundletool IRONFOX_GET_SOURCE_BUNDLETOOL=1 elif [[ "${target}" == 'cbindgen' ]]; then # Get cbindgen IRONFOX_GET_SOURCE_CBINDGEN=1 elif [[ "${target}" == 'firefox' ]]; then # Get Firefox (Gecko/mozilla-central) IRONFOX_GET_SOURCE_GECKO=1 elif [[ "${target}" == 'firefox-l10n' ]]; then # Get firefox-l10n IRONFOX_GET_SOURCE_GECKO_L10N=1 elif [[ "${target}" == 'glean' ]]; then # Get Glean IRONFOX_GET_SOURCE_GLEAN=1 elif [[ "${target}" == 'glean-parser' ]]; then # Get glean-parser IRONFOX_GET_SOURCE_GLEAN_PARSER=1 elif [[ "${target}" == 'gradle' ]]; then # Get + set-up Gradle IRONFOX_GET_SOURCE_GRADLE=1 elif [[ "${target}" == 'gyp' ]]; then # Get gyp-next IRONFOX_GET_SOURCE_GYP=1 elif [[ "${target}" == 'jdk-17' ]]; then # Get OpenJDK (17) (Required by GeckoView) IRONFOX_GET_SOURCE_JDK_17=1 elif [[ "${target}" == 'jdk-21' ]]; then # Get OpenJDK (21) IRONFOX_GET_SOURCE_JDK_21=1 elif [[ "${target}" == 'jdk-25' ]]; then # Get OpenJDK (25) IRONFOX_GET_SOURCE_JDK_25=1 elif [[ "${target}" == 'microg' ]]; then # Get microG IRONFOX_GET_SOURCE_MICROG=1 elif [[ "${target}" == 'node' ]]; then # Get + set-up Node.js IRONFOX_GET_SOURCE_NODE=1 elif [[ "${target}" == 'npm' ]]; then # Get + set-up npm IRONFOX_GET_SOURCE_NPM=1 elif [[ "${target}" == 'phoenix' ]]; then # Get Phoenix IRONFOX_GET_SOURCE_PHOENIX=1 elif [[ "${target}" == 'prebuilds' ]]; then # Get the IronFox prebuilds repo IRONFOX_GET_SOURCE_PREBUILDS=1 elif [[ "${target}" == 'pip' ]]; then # Get + set-up pip IRONFOX_GET_SOURCE_PIP=1 elif [[ "${target}" == 'python' ]]; then # Get Python IRONFOX_GET_SOURCE_PYTHON=1 elif [[ "${target}" == 'pyyaml' ]]; then # Get PyYAML ## NOTE: This isn't installed if "all" is used below, as it's only used in CI and targeted specifically when it's needed IRONFOX_GET_SOURCE_PYYAML=1 elif [[ "${target}" == 'rust' ]]; then # Get + set-up rust/cargo IRONFOX_GET_SOURCE_RUST=1 elif [[ "${target}" == 's3cmd' ]]; then # Get s3cmd ## NOTE: This isn't installed if "all" is used below, as it's only used in CI and targeted specifically when it's needed IRONFOX_GET_SOURCE_S3CMD=1 elif [[ "${target}" == 'uniffi' ]]; then # Get uniffi IRONFOX_GET_SOURCE_UNIFFI=1 elif [[ "${target}" == 'up-ac' ]]; then # Get UnifiedPush-AC IRONFOX_GET_SOURCE_UP_AC=1 elif [[ "${target}" == 'uv' ]]; then # Get + set-up uv IRONFOX_GET_SOURCE_UV=1 elif [[ "${target}" == 'wasi' ]]; then # Get WASI SDK IRONFOX_GET_SOURCE_WASI=1 elif [[ "${target}" == 'all' ]]; then # If no argument is specified (or argument is set to "all"), just get everything IRONFOX_GET_SOURCE_ANDROID_NDK=1 IRONFOX_GET_SOURCE_ANDROID_SDK=1 IRONFOX_GET_SOURCE_ANDROID_SDK_BUILD_TOOLS=1 IRONFOX_GET_SOURCE_ANDROID_SDK_BUILD_TOOLS_35=1 IRONFOX_GET_SOURCE_ANDROID_SDK_PLATFORM=1 IRONFOX_GET_SOURCE_ANDROID_SDK_PLATFORM_36=1 IRONFOX_GET_SOURCE_ANDROID_SDK_PLATFORM_TOOLS=1 IRONFOX_GET_SOURCE_AS=1 IRONFOX_GET_SOURCE_BUNDLETOOL=1 IRONFOX_GET_SOURCE_CBINDGEN=1 IRONFOX_GET_SOURCE_GECKO=1 IRONFOX_GET_SOURCE_GECKO_L10N=1 IRONFOX_GET_SOURCE_GLEAN=1 IRONFOX_GET_SOURCE_GLEAN_PARSER=1 IRONFOX_GET_SOURCE_GRADLE=1 IRONFOX_GET_SOURCE_GYP=1 IRONFOX_GET_SOURCE_JDK_17=1 IRONFOX_GET_SOURCE_JDK_21=1 IRONFOX_GET_SOURCE_JDK_25=1 IRONFOX_GET_SOURCE_MICROG=1 IRONFOX_GET_SOURCE_NODE=1 IRONFOX_GET_SOURCE_NPM=1 IRONFOX_GET_SOURCE_PHOENIX=1 IRONFOX_GET_SOURCE_PIP=1 IRONFOX_GET_SOURCE_PYTHON=1 IRONFOX_GET_SOURCE_RUST=1 IRONFOX_GET_SOURCE_UP_AC=1 IRONFOX_GET_SOURCE_UV=1 if [[ "${IRONFOX_NO_PREBUILDS}" == 1 ]]; then # If IRONFOX_NO_PREBUILDS is true, we need to get the Prebuilds repo (so that they can be built from source) IRONFOX_GET_SOURCE_PREBUILDS=1 else # Otherwise,by default, we can just download the prebuilds directly IRONFOX_GET_SOURCE_UNIFFI=1 IRONFOX_GET_SOURCE_WASI=1 fi else echo_red_text "ERROR: Invalid target: ${target}\n You must enter one of the following:" echo 'All: all (Default)' echo 'androguard: androguard' echo 'Android NDK: android-ndk' echo 'Android SDK: android-sdk' echo 'Android SDK Build Tools (latest): android-sdk-build-tools' echo 'Android SDK Build Tools (35.0.0): android-sdk-build-tools-35' echo 'Android SDK Platform (latest): android-sdk-platform' echo 'Android SDK Platform (36): android-sdk-platform-36' echo 'Android SDK Platform Tools: android-sdk-platform-tools' echo 'Application Services: as' echo 'Bundletool: bundletool' echo 'cbindgen: cbindgen' echo 'Firefox (Gecko/mozilla-central): firefox' echo 'firefox-l10n (l10n-central): firefox-l10n' echo 'Glean: glean' echo 'Glean Parser: glean-parser' echo 'Gradle: gradle' echo 'GYP: gyp' echo 'JDK (17): jdk-17' echo 'JDK (21): jdk-21' echo 'JDK (25): jdk-25' echo 'microG: microg' echo 'Node.js: node' echo 'npm: npm' echo 'Phoenix: phoenix' echo 'pip: pip' echo 'Prebuilds repo: prebuilds' echo 'Python: python' echo 'PyYAML: pyyaml' echo 'Rust: rust' echo 's3cmd: s3cmd' echo 'UnifiedPush-AC: up-ac' echo 'uniffi-bindgen: uniffi' echo 'uv: uv' echo 'WASI SDK: wasi' exit 1 fi readonly IRONFOX_GET_SOURCE_ANDROGUARD readonly IRONFOX_GET_SOURCE_ANDROID_NDK readonly IRONFOX_GET_SOURCE_ANDROID_SDK readonly IRONFOX_GET_SOURCE_ANDROID_SDK_BUILD_TOOLS readonly IRONFOX_GET_SOURCE_ANDROID_SDK_BUILD_TOOLS_35 readonly IRONFOX_GET_SOURCE_ANDROID_SDK_PLATFORM readonly IRONFOX_GET_SOURCE_ANDROID_SDK_PLATFORM_36 readonly IRONFOX_GET_SOURCE_ANDROID_SDK_PLATFORM_TOOLS readonly IRONFOX_GET_SOURCE_AS readonly IRONFOX_GET_SOURCE_BUNDLETOOL readonly IRONFOX_GET_SOURCE_CBINDGEN readonly IRONFOX_GET_SOURCE_GECKO readonly IRONFOX_GET_SOURCE_GECKO_L10N readonly IRONFOX_GET_SOURCE_GLEAN readonly IRONFOX_GET_SOURCE_GLEAN_PARSER readonly IRONFOX_GET_SOURCE_GRADLE readonly IRONFOX_GET_SOURCE_GYP readonly IRONFOX_GET_SOURCE_JDK_17 readonly IRONFOX_GET_SOURCE_JDK_21 readonly IRONFOX_GET_SOURCE_JDK_25 readonly IRONFOX_GET_SOURCE_MICROG readonly IRONFOX_GET_SOURCE_NODE readonly IRONFOX_GET_SOURCE_NPM readonly IRONFOX_GET_SOURCE_PHOENIX readonly IRONFOX_GET_SOURCE_PIP readonly IRONFOX_GET_SOURCE_PREBUILDS readonly IRONFOX_GET_SOURCE_PYTHON readonly IRONFOX_GET_SOURCE_PYYAML readonly IRONFOX_GET_SOURCE_RUST readonly IRONFOX_GET_SOURCE_S3CMD readonly IRONFOX_GET_SOURCE_UNIFFI readonly IRONFOX_GET_SOURCE_UP_AC readonly IRONFOX_GET_SOURCE_UV readonly IRONFOX_GET_SOURCE_WASI # If the 'checksum-update' argument is specified, in addition to downloading the dependencies as usual, ## we're also updating their checksums IRONFOX_GET_SOURCE_CHECKSUM_UPDATE=0 if [[ "${mode}" == 'checksum-update' ]]; then if [[ "${IRONFOX_CI}" != 1 ]]; then IRONFOX_GET_SOURCE_CHECKSUM_UPDATE=1 else echo_red_text 'ERROR: CI should never automatically update checksums.' exit 1 fi elif [[ "${mode}" != 'download' ]]; then echo_red_text "ERROR: Invalid mode: ${mode}\n You must enter one of the following:" echo 'Download: download (Default)' echo 'Download + update checksums: checksum-update' exit 1 fi readonly IRONFOX_GET_SOURCE_CHECKSUM_UPDATE # Include version info source "${IRONFOX_VERSIONS}" # Back-up (and remove) a file if it exists function backup_file() { local -r file="$1" local -r file_name="$("${IRONFOX_BASENAME}" "${file}")" local -r backup_file="${IRONFOX_EXTERNAL}/temp/backup/${file_name}" if [[ -f "${file}" ]]; then "${IRONFOX_RM}" -f "${backup_file}" "${IRONFOX_MKDIR}" -p "$("${IRONFOX_DIRNAME}" "${backup_file}")" "${IRONFOX_CP}" -f "${file}" "${backup_file}" "${IRONFOX_RM}" -f "${file}" fi } # Back-up (and remove) a directory if it exists function backup_dir() { local -r dir="$1" local -r dir_name="$("${IRONFOX_BASENAME}" "${dir}")" local -r backup_dir="${IRONFOX_EXTERNAL}/temp/backup/${dir_name}" if [[ -d "${dir}" ]]; then "${IRONFOX_RM}" -rf "${backup_dir}" "${IRONFOX_MKDIR}" -p "$("${IRONFOX_DIRNAME}" "${backup_dir}")" "${IRONFOX_CP}" -rf "${dir}/" "${backup_dir}" "${IRONFOX_RM}" -rf "${dir}" fi } # Restore a backed-up file function restore_file() { local -r file="$1" local -r file_name="$("${IRONFOX_BASENAME}" "${file}")" local -r backed_up_file="${IRONFOX_EXTERNAL}/temp/backup/${file_name}" if [[ -f "${backed_up_file}" ]]; then "${IRONFOX_RM}" -f "${file}" "${IRONFOX_MKDIR}" -p "$("${IRONFOX_DIRNAME}" "${file}")" "${IRONFOX_CP}" -f "${backed_up_file}" "${file}" "${IRONFOX_RM}" -f "${backed_up_file}" fi } # Restore a backed-up directory function restore_dir() { local -r dir="$1" local -r dir_name="$("${IRONFOX_BASENAME}" "${dir}")" local -r backed_up_dir="${IRONFOX_EXTERNAL}/temp/backup/${dir_name}" if [[ -d "${backed_up_dir}" ]]; then "${IRONFOX_RM}" -rf "${dir}" "${IRONFOX_MKDIR}" -p "$("${IRONFOX_DIRNAME}" "${dir}")" "${IRONFOX_CP}" -rf "${backed_up_dir}/" "${dir}" "${IRONFOX_RM}" -rf "${backed_up_dir}" fi } # Function to automate updating checksums of dependencies function update_checksum() { local -r old_checksum="$1" local -r new_checksum="$2" local -r file="$3" local -r checksum_type="$4" if [[ "${checksum_type}" == 'md5sum' ]]; then local -r checksum_type_pretty='MD5sum' elif [[ "${checksum_type}" == 'sha1sum' ]]; then local -r checksum_type_pretty='SHA1sum' elif [[ "${checksum_type}" == 'sha256sum' ]]; then local -r checksum_type_pretty='SHA256sum' elif [[ "${checksum_type}" == 'sha512sum' ]]; then local -r checksum_type_pretty='SHA512sum' else echo_red_text 'ERROR: Unknown checksum type.' exit 1 fi if [[ "${old_checksum}" == "${new_checksum}" ]]; then echo_red_text 'Checksums match. Skipping...' echo "Old checksum: ${old_checksum}" echo "New checksum: ${new_checksum}" else echo_red_text "Updating ${checksum_type_pretty} for ${file}..." "${IRONFOX_SED}" -i "s|'${old_checksum}'|'${new_checksum}'|" "${IRONFOX_VERSIONS}" echo_green_text "SUCCESS: Updated ${checksum_type_pretty} for ${file}" fi } function validate_checksum() { local -r expected_checksum="$1" local -r file="$2" local -r checksum_type="$3" if [[ "${checksum_type}" == 'md5sum' ]]; then local -r checksum_type_pretty='MD5sum' local -r local_checksum=$("${IRONFOX_MD5SUM}" "${file}" | "${IRONFOX_AWK}" '{print $1}') elif [[ "${checksum_type}" == 'sha1sum' ]]; then local -r checksum_type_pretty='SHA1sum' local -r local_checksum=$("${IRONFOX_SHA1SUM}" "${file}" | "${IRONFOX_AWK}" '{print $1}') elif [[ "${checksum_type}" == 'sha256sum' ]]; then local -r checksum_type_pretty='SHA256sum' local -r local_checksum=$("${IRONFOX_SHA256SUM}" "${file}" | "${IRONFOX_AWK}" '{print $1}') elif [[ "${checksum_type}" == 'sha512sum' ]]; then local -r checksum_type_pretty='SHA512sum' local -r local_checksum=$("${IRONFOX_SHA512SUM}" "${file}" | "${IRONFOX_AWK}" '{print $1}') else echo_red_text 'ERROR: Unknown checksum type.' return 1 fi if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then update_checksum "${expected_checksum}" "${local_checksum}" "${file}" "${checksum_type}" elif [[ "${local_checksum}" != "${expected_checksum}" ]]; then echo_red_text 'ERROR: Checksum validation failed.' echo "Expected ${checksum_type_pretty}: ${expected_checksum}" echo "Actual ${checksum_type_pretty}: ${local_checksum}" # If checksum validation fails, also just remove the file "${IRONFOX_RM}" -f "${file}" return 1 else echo_green_text 'SUCCESS: Checksum validated.' echo "${checksum_type_pretty}: ${local_checksum}" fi } function clone_repo() { local -r url="$1" local -r path="$2" local -r revision="$3" if [[ "${url}" == "" ]]; then echo_red_text "ERROR: URL missing for clone" exit 1 fi if [[ "${path}" == "" ]]; then echo_red_text "ERROR: Path is required for cloning '${url}'" exit 1 fi if [[ "${revision}" == "" ]]; then echo_red_text "ERROR: Revision is required for cloning '${url}'" exit 1 fi if [[ -f "${path}" ]]; then echo_red_text "ERROR: '${path}' exists and is not a directory" exit 1 fi if [[ -d "${path}" ]]; then echo_red_text "'${path}' already exists" read -p "Do you want to re-clone this repository? [y/N] " -n 1 -r echo if [[ "${REPLY}" =~ ^[Yy]$ ]]; then echo_red_text "Removing ${path}..." "${IRONFOX_RM}" -rf "${path}" else return 0 fi fi echo_red_text "Cloning ${url}::${revision}..." "${IRONFOX_GIT}" clone --revision="${revision}" --depth=1 "${url}" "${path}" } function download() { local -r url="$1" local -r file_in="$2" local -r file_name=$("${IRONFOX_BASENAME}" "${file_in}") local -r expected_sha512sum="$3" # By default, we want to exit upon an error if [[ -z "${IRONFOX_DOWNLOAD_EXIT+x}" ]]; then IRONFOX_DOWNLOAD_EXIT=1 fi # By default, we want to perform post-download actions for sources ## (this includes things like ex. installing a dependency or creating/setting-up an environment) ## This isn't desired in some cases, like if we're updating checksums, or a user just cancels the download unset IRONFOX_PERFORM_POST_DOWNLOAD if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then ## If we're just updating a checksum, we should never perform post-download actions IRONFOX_PERFORM_POST_DOWNLOAD=0 else IRONFOX_PERFORM_POST_DOWNLOAD=1 fi if [[ "${url}" == "" ]]; then echo_red_text "ERROR: URL is required (file: '${file_in}')" IRONFOX_PERFORM_POST_DOWNLOAD=0 if [[ "${IRONFOX_DOWNLOAD_EXIT}" != 1 ]]; then unset IRONFOX_DOWNLOAD_EXIT return 1 else exit 1 fi fi # If we're doing a checksum update, we download the file to a separate temporary directory, instead of our standard one if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then "${IRONFOX_RM}" -rf "${IRONFOX_EXTERNAL}/temp/chksm" local -r file="${IRONFOX_EXTERNAL}/temp/chksm/${file_name}" else local -r file="${file_in}" fi if [[ -f "${file}" ]]; then echo_red_text "${file} already exists." read -p "Do you want to re-download? [y/N] " -n 1 -r echo if [[ "${REPLY}" =~ ^[Yy]$ ]]; then # Back-up (in case something goes wrong - ex. checksum validation fails) and remove our file echo_red_text "Removing ${file}..." backup_file "${file}" else unset IRONFOX_DOWNLOAD_EXIT IRONFOX_PERFORM_POST_DOWNLOAD=0 return 0 fi fi # By default, we know nothing has failed... local IRONFOX_CHECKSUM_FAILED=0 local IRONFOX_DOWNLOAD_FAILED=0 if [[ ! -d "$("${IRONFOX_DIRNAME}" "${file}")" ]]; then "${IRONFOX_MKDIR}" -vp "$("${IRONFOX_DIRNAME}" "${file}")" local -r CREATED_DIR_FOR_DL=1 else local -r CREATED_DIR_FOR_DL=0 fi echo_red_text "Downloading ${url}..." "${IRONFOX_CURL}" ${IRONFOX_CURL_FLAGS} --location "${url}" --output "${file}" || local IRONFOX_DOWNLOAD_FAILED=1 # Verify (or update) SHA512sum validate_checksum "${expected_sha512sum}" "${file}" 'sha512sum' || local IRONFOX_CHECKSUM_FAILED=1 # If we're just updating the checksum, we're done, so go ahead and exit if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then if [[ "${IRONFOX_DOWNLOAD_FAILED}" == 1 ]]; then echo_red_text 'ERROR: Download failed! Exiting...' exit 1 elif [[ "${IRONFOX_CHECKSUM_FAILED}" == 1 ]]; then echo_red_text 'ERROR: Failed to update checksum! Exiting...' exit 1 else return 0 fi fi # If the download (or checksum validation) failed, restore our back-up if [[ "${IRONFOX_CHECKSUM_FAILED}" == 1 ]] || [[ "${IRONFOX_DOWNLOAD_FAILED}" == 1 ]]; then if [[ -f "${IRONFOX_EXTERNAL}/temp/backup/${file_name}" ]]; then restore_file "${file}" fi fi # Clean-up "${IRONFOX_RM}" -f "${IRONFOX_EXTERNAL}/temp/backup/${file_name}" "${IRONFOX_RM}" -rf "${IRONFOX_EXTERNAL}/temp/chksm" # If the download (or checksum validation) failed, exit if [[ "${IRONFOX_CHECKSUM_FAILED}" == 1 ]] || [[ "${IRONFOX_DOWNLOAD_FAILED}" == 1 ]]; then # If a directory was created just for this download, remove it if [[ "${CREATED_DIR_FOR_DL}" == 1 ]]; then "${IRONFOX_RM}" -rf "$("${IRONFOX_DIRNAME}" "${file}")" fi if [[ "${IRONFOX_DOWNLOAD_EXIT}" != 1 ]]; then unset IRONFOX_DOWNLOAD_EXIT return 1 else echo_red_text 'ERROR: Download failed! Exiting...' exit 1 fi fi } # Extract archives function extract() { local -r archive_path="$1" local -r target_path="$2" local -r temp_repo_name="$3" if [[ ! -f "${archive_path}" ]]; then echo_red_text "ERROR: Archive '${archive_path}' does not exist!" fi # If our temporary directory for extraction already exists, delete it if [[ -d "${IRONFOX_EXTERNAL}/temp/${temp_repo_name}" ]]; then "${IRONFOX_RM}" -rf "${IRONFOX_EXTERNAL}/temp/${temp_repo_name}" fi # Create temporary directory for extraction "${IRONFOX_MKDIR}" -p "${IRONFOX_EXTERNAL}/temp/${temp_repo_name}" # Extract based on file extension case "${archive_path}" in *.zip) "${IRONFOX_UNZIP}" -q "${archive_path}" -d "${IRONFOX_EXTERNAL}/temp/${temp_repo_name}" ;; *.tar.gz) "${IRONFOX_TAR}" xzf "${archive_path}" -C "${IRONFOX_EXTERNAL}/temp/${temp_repo_name}" ;; *.tar.xz) "${IRONFOX_TAR}" xJf "${archive_path}" -C "${IRONFOX_EXTERNAL}/temp/${temp_repo_name}" ;; *.tar.zst) "${IRONFOX_TAR}" --zstd -xvf "${archive_path}" -C "${IRONFOX_EXTERNAL}/temp/${temp_repo_name}" ;; *) echo_red_text "ERROR: Unsupported archive format: ${archive_path}" "${IRONFOX_RM}" -rf "${IRONFOX_EXTERNAL}/temp/${temp_repo_name}" exit 1 ;; esac local -r top_input_dir=$("${IRONFOX_LS}" "${IRONFOX_EXTERNAL}/temp/${temp_repo_name}") "${IRONFOX_CP}" -rf "${IRONFOX_EXTERNAL}/temp/${temp_repo_name}/${top_input_dir}/" "${target_path}" "${IRONFOX_RM}" -rf "${IRONFOX_EXTERNAL}/temp/${temp_repo_name}" } function download_and_extract() { local -r repo_name="$1" local -r url="$2" local -r path="$3" local -r expected_sha512sum="$4" # By default, we want to perform post-download actions for sources ## (this includes things like ex. installing a dependency or creating/setting-up an environment) ## This isn't desired in some cases, like if we're updating checksums, or a user just cancels the download unset IRONFOX_PERFORM_POST_DOWNLOAD if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then ## If we're just updating a checksum, we should never perform post-download actions IRONFOX_PERFORM_POST_DOWNLOAD=0 else IRONFOX_PERFORM_POST_DOWNLOAD=1 fi if [[ -d "${path}" ]] && [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" != 1 ]]; then echo_red_text "'${path}' already exists" read -p "Do you want to re-download? [y/N] " -n 1 -r echo if [[ "${REPLY}" =~ ^[Yy]$ ]]; then # Back-up (in case something goes wrong - ex. checksum validation fails) and remove our directory echo_red_text "Removing ${path}..." backup_dir "${path}" else IRONFOX_PERFORM_POST_DOWNLOAD=0 return 0 fi fi if [[ "${url}" =~ \.tar\.xz$ ]]; then local -r extension=".tar.xz" elif [[ "${url}" =~ \.tar\.gz$ ]]; then local -r extension=".tar.gz" elif [[ "${url}" =~ \.tar\.zst$ ]]; then local -r extension=".tar.zst" else local -r extension=".zip" fi # Tell `download` to return instead of exit upon an error IRONFOX_DOWNLOAD_EXIT=0 # By default, we know the download hasn't failed... local IRONFOX_DOWNLOAD_FAILED=0 local -r repo_archive="${IRONFOX_DOWNLOADS}/${repo_name}${extension}" download "${url}" "${repo_archive}" "${expected_sha512sum}" || local IRONFOX_DOWNLOAD_FAILED=1 # If we're just updating the checksum, we're done, so go ahead and exit if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then if [[ "${IRONFOX_DOWNLOAD_FAILED}" == 1 ]]; then echo_red_text 'ERROR: Download failed! Exiting...' exit 1 else return 0 fi fi # If the download failed, restore our back-up (if possible) and exit if [[ "${IRONFOX_DOWNLOAD_FAILED}" == 1 ]]; then restore_dir "${path}" if [[ "${repo_name}" == 'uv' ]]; then IRONFOX_PERFORM_POST_DOWNLOAD=0 return 1 else echo_red_text 'ERROR: Download failed! Exiting...' exit 1 fi fi echo_red_text "Extracting ${repo_archive}..." extract "${repo_archive}" "${path}" "${repo_name}" # Clean-up "${IRONFOX_RM}" -rf "${IRONFOX_EXTERNAL}/temp/backup/${repo_name}" } # Get androguard function get_androguard() { # If all we're doing is updating the checksum, we don't care if the environment is prepared if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" != 1 ]]; then if [[ ! -d "${IRONFOX_UV_DIR}" ]] || [[ ! -f "${IRONFOX_PYENV}" ]]; then echo_red_text "ERROR: You tried to download androguard, but you don't have a Python environment set-up yet." exit 1 fi if [[ -d "${IRONFOX_ANDROGUARD}" ]]; then echo_red_text "androguard is already installed at ${IRONFOX_ANDROGUARD}" read -p "Do you want to re-download it? [y/N] " -n 1 -r echo if [[ "${REPLY}" =~ ^[Nn]$ ]]; then return 0 else source "${IRONFOX_PYENV}" "${IRONFOX_UV}" pip uninstall androguard fi fi fi echo_red_text "Downloading androguard..." download_and_extract 'androguard' "https://github.com/androguard/androguard/archive/${IRONFOX_ANDROGUARD_COMMIT}.tar.gz" "${IRONFOX_ANDROGUARD_DIR}" "${IRONFOX_ANDROGUARD_SHA512SUM}" if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" != 1 ]]; then source "${IRONFOX_PYENV}" echo_red_text 'Installing androguard...' "${IRONFOX_UV}" pip install --no-editable --strict "${IRONFOX_ANDROGUARD_DIR}" echo_green_text "SUCCESS: Set-up androguard at ${IRONFOX_ANDROGUARD}" fi } # Get Android NDK function get_android_ndk() { if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then echo_red_text 'Downloading the Android NDK (Linux)...' download_and_extract 'android-ndk' "https://dl.google.com/android/repository/android-ndk-${IRONFOX_ANDROID_NDK_VERSION}-linux.zip" "${IRONFOX_ANDROID_NDK}" "${IRONFOX_ANDROID_NDK_SHA512SUM_LINUX}" echo_red_text 'Downloading the Android NDK (OS X)...' download_and_extract 'android-ndk' "https://dl.google.com/android/repository/android-ndk-${IRONFOX_ANDROID_NDK_VERSION}-darwin.zip" "${IRONFOX_ANDROID_NDK}" "${IRONFOX_ANDROID_NDK_SHA512SUM_OSX}" else echo_red_text 'Downloading the Android NDK...' if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then download_and_extract 'android-ndk' "https://dl.google.com/android/repository/android-ndk-${IRONFOX_ANDROID_NDK_VERSION}-darwin.zip" "${IRONFOX_ANDROID_NDK}" "${IRONFOX_ANDROID_NDK_SHA512SUM_OSX}" else download_and_extract 'android-ndk' "https://dl.google.com/android/repository/android-ndk-${IRONFOX_ANDROID_NDK_VERSION}-linux.zip" "${IRONFOX_ANDROID_NDK}" "${IRONFOX_ANDROID_NDK_SHA512SUM_LINUX}" fi echo_green_text "SUCCESS: Set-up Android NDK at ${IRONFOX_ANDROID_NDK}" fi } # Get + set-up Android SDK function get_android_sdk() { # This is typically covered by "download_and_extract", but the Android SDK is a special case - we don't download it to IRONFOX_ANDROID_SDK directly if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" != 1 ]]; then if [[ -d "${IRONFOX_ANDROID_SDK}" ]]; then echo_red_text "Found existing installation at ${IRONFOX_ANDROID_SDK}" echo 'Continuing will remove this installation and related data' read -p "Do you still want to continue? [y/N] " -n 1 -r echo if [[ "${REPLY}" =~ ^[Yy]$ ]]; then # Back-up (in case something goes wrong - ex. checksum validation fails) and remove our directory echo_red_text "Removing ${IRONFOX_ANDROID_SDK}..." backup_dir "${IRONFOX_ANDROID_SDK}" else return 0 fi fi "${IRONFOX_MKDIR}" -p "${IRONFOX_ANDROID_SDK}/cmdline-tools" fi if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then echo_red_text 'Downloading Android SDK (Linux)...' download "https://dl.google.com/android/repository/commandlinetools-linux-${IRONFOX_ANDROID_SDK_REVISION}_latest.zip" "${IRONFOX_ANDROID_SDK}/cmdline-tools/${IRONFOX_ANDROID_SDK_VERSION}" "${IRONFOX_ANDROID_SDK_SHA512SUM_LINUX}" echo_red_text 'Downloading Android SDK (OS X)...' download "https://dl.google.com/android/repository/commandlinetools-mac-${IRONFOX_ANDROID_SDK_REVISION}_latest.zip" "${IRONFOX_ANDROID_SDK}/cmdline-tools/${IRONFOX_ANDROID_SDK_VERSION}" "${IRONFOX_ANDROID_SDK_SHA512SUM_OSX}" else # Set our platform if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_ANDROID_SDK_PLATFORM='mac' else local -r IRONFOX_ANDROID_SDK_PLATFORM='linux' fi # Set our checksum to verify if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_ANDROID_SDK_SHA512SUM="${IRONFOX_ANDROID_SDK_SHA512SUM_OSX}" else local -r IRONFOX_ANDROID_SDK_SHA512SUM="${IRONFOX_ANDROID_SDK_SHA512SUM_LINUX}" fi echo_red_text 'Downloading Android SDK...' download_and_extract 'android-sdk-cmdline-tools' "https://dl.google.com/android/repository/commandlinetools-${IRONFOX_ANDROID_SDK_PLATFORM}-${IRONFOX_ANDROID_SDK_REVISION}_latest.zip" "${IRONFOX_ANDROID_SDK}/cmdline-tools/${IRONFOX_ANDROID_SDK_VERSION}" "${IRONFOX_ANDROID_SDK_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then # Accept Android SDK licenses { "${IRONFOX_YES}" || true; } | "${IRONFOX_ANDROID_SDK}/cmdline-tools/${IRONFOX_ANDROID_SDK_VERSION}/bin/sdkmanager" --sdk_root="${IRONFOX_ANDROID_SDK}" --licenses echo_green_text "SUCCESS: Set-up Android SDK at ${IRONFOX_ANDROID_SDK}" fi fi } # Get Android SDK Build Tools (latest) function get_android_sdk_build_tools() { if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then echo_red_text 'Downloading Android SDK Build Tools (latest) (Linux)...' download "https://dl.google.com/android/repository/build-tools_${IRONFOX_ANDROID_SDK_BUILD_TOOLS_VERSION}_linux.zip" "${IRONFOX_ANDROID_SDK_BUILD_TOOLS}" "${IRONFOX_ANDROID_SDK_BUILD_TOOLS_SHA512SUM_LINUX}" echo_red_text 'Downloading Android SDK Build Tools (latest) (OS X)...' download "https://dl.google.com/android/repository/build-tools_${IRONFOX_ANDROID_SDK_BUILD_TOOLS_VERSION}_macosx.zip" "${IRONFOX_ANDROID_SDK_BUILD_TOOLS}" "${IRONFOX_ANDROID_SDK_BUILD_TOOLS_SHA512SUM_OSX}" else # Set our platform if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_ANDROID_SDK_BUILD_TOOLS_PLATFORM='macosx' else local -r IRONFOX_ANDROID_SDK_BUILD_TOOLS_PLATFORM='linux' fi # Set our checksum to verify if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_ANDROID_SDK_BUILD_TOOLS_SHA512SUM="${IRONFOX_ANDROID_SDK_BUILD_TOOLS_SHA512SUM_OSX}" else local -r IRONFOX_ANDROID_SDK_BUILD_TOOLS_SHA512SUM="${IRONFOX_ANDROID_SDK_BUILD_TOOLS_SHA512SUM_LINUX}" fi echo_red_text 'Downloading Android SDK Build Tools (latest)...' download_and_extract 'android-sdk-build-tools' "https://dl.google.com/android/repository/build-tools_${IRONFOX_ANDROID_SDK_BUILD_TOOLS_VERSION}_${IRONFOX_ANDROID_SDK_BUILD_TOOLS_PLATFORM}.zip" "${IRONFOX_ANDROID_SDK_BUILD_TOOLS}" "${IRONFOX_ANDROID_SDK_BUILD_TOOLS_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_green_text "SUCCESS: Set-up Android SDK Build Tools (latest) at ${IRONFOX_ANDROID_SDK_BUILD_TOOLS}" fi fi } # Get Android SDK Build Tools (35) ## (Needed by Glean: ### https://github.com/mozilla/glean/blob/main/docs/dev/android/sdk-ndk-versions.md ### https://github.com/mozilla/glean/blob/main/docs/dev/android/setup-android-build-environment.md) function get_android_sdk_build_tools_35() { if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then echo_red_text 'Downloading Android SDK Build Tools (35.0.0) (Linux)...' download "https://dl.google.com/android/repository/build-tools_r35_linux.zip" "${IRONFOX_ANDROID_SDK_BUILD_TOOLS_35}" "${IRONFOX_ANDROID_SDK_BUILD_TOOLS_35_SHA512SUM_LINUX}" echo_red_text 'Downloading Android SDK Build Tools (35.0.0) (OS X)...' download "https://dl.google.com/android/repository/build-tools_r35_macosx.zip" "${IRONFOX_ANDROID_SDK_BUILD_TOOLS_35}" "${IRONFOX_ANDROID_SDK_BUILD_TOOLS_35_SHA512SUM_OSX}" else # Set our platform if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_ANDROID_SDK_BUILD_TOOLS_35_PLATFORM='macosx' else local -r IRONFOX_ANDROID_SDK_BUILD_TOOLS_35_PLATFORM='linux' fi # Set our checksum to verify if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_ANDROID_SDK_BUILD_TOOLS_35_SHA512SUM="${IRONFOX_ANDROID_SDK_BUILD_TOOLS_35_SHA512SUM_OSX}" else local -r IRONFOX_ANDROID_SDK_BUILD_TOOLS_35_SHA512SUM="${IRONFOX_ANDROID_SDK_BUILD_TOOLS_35_SHA512SUM_LINUX}" fi echo_red_text 'Downloading Android SDK Build Tools (35.0.0)...' download_and_extract 'android-sdk-build-tools-35' "https://dl.google.com/android/repository/build-tools_r35_${IRONFOX_ANDROID_SDK_BUILD_TOOLS_35_PLATFORM}.zip" "${IRONFOX_ANDROID_SDK_BUILD_TOOLS_35}" "${IRONFOX_ANDROID_SDK_BUILD_TOOLS_35_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_green_text "SUCCESS: Set-up Android SDK Build Tools (35.0.0) at ${IRONFOX_ANDROID_SDK_BUILD_TOOLS_35}" fi fi } # Get Android SDK Platform (latest) function get_android_sdk_platform() { if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then echo_red_text "ERROR: Unsupported project." exit 1 else if [[ ! -d "${IRONFOX_ANDROID_SDK}" ]]; then echo_red_text "ERROR: You tried to download the Android SDK Platform (latest), but you don't have the Android SDK set-up yet." exit 1 fi if [[ -d "${IRONFOX_ANDROID_SDK}/platforms/android-${IRONFOX_ANDROID_SDK_PLATFORM_VERSION}" ]]; then echo_red_text "Found existing installation at ${IRONFOX_ANDROID_SDK}/platforms/android-${IRONFOX_ANDROID_SDK_PLATFORM_VERSION}" echo 'Continuing will remove this installation and related data' read -p "Do you still want to continue? [y/N] " -n 1 -r echo if [[ "${REPLY}" =~ ^[Yy]$ ]]; then # Back-up (in case something goes wrong - ex. checksum validation fails) and remove our directory echo_red_text "Removing ${IRONFOX_ANDROID_SDK}/platforms/android-${IRONFOX_ANDROID_SDK_PLATFORM_VERSION}..." backup_dir "${IRONFOX_ANDROID_SDK}/platforms/android-${IRONFOX_ANDROID_SDK_PLATFORM_VERSION}" else return 0 fi fi # By default, we know the download hasn't failed... local IRONFOX_DOWNLOAD_FAILED=0 echo_red_text 'Downloading Android SDK Platform (latest)...' "${IRONFOX_ANDROID_SDK}/cmdline-tools/${IRONFOX_ANDROID_SDK_VERSION}/bin/sdkmanager" "platforms;android-${IRONFOX_ANDROID_SDK_PLATFORM_VERSION}" || local IRONFOX_DOWNLOAD_FAILED=1 # If the download failed, restore our back-up, clean-up, and exit if [[ "${IRONFOX_DOWNLOAD_FAILED}" == 1 ]]; then echo_red_text 'ERROR: Download failed! Exiting...' restore_dir "${IRONFOX_ANDROID_SDK}/platforms/android-${IRONFOX_ANDROID_SDK_PLATFORM_VERSION}" "${IRONFOX_RM}" -rf "${IRONFOX_EXTERNAL}/temp" exit 1 else echo_green_text "SUCCESS: Set-up Android SDK Platform (latest) at ${IRONFOX_ANDROID_SDK}/platforms/android-${IRONFOX_ANDROID_SDK_PLATFORM_VERSION}" fi fi } # Get Android SDK Platform (36) ## (Needed by microG and Glean: ### https://github.com/mozilla/glean/blob/main/docs/dev/android/sdk-ndk-versions.md ### https://github.com/mozilla/glean/blob/main/docs/dev/android/setup-android-build-environment.md) function get_android_sdk_platform_36() { if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then echo_red_text "ERROR: Unsupported project." exit 1 else if [[ ! -d "${IRONFOX_ANDROID_SDK}" ]]; then echo_red_text "ERROR: You tried to download the Android SDK Platform (36), but you don't have the Android SDK set-up yet." exit 1 fi if [[ -d "${IRONFOX_ANDROID_SDK}/platforms/android-36" ]]; then echo_red_text "Found existing installation at ${IRONFOX_ANDROID_SDK}/platforms/android-36" echo 'Continuing will remove this installation and related data' read -p "Do you still want to continue? [y/N] " -n 1 -r echo if [[ "${REPLY}" =~ ^[Yy]$ ]]; then # Back-up (in case something goes wrong - ex. checksum validation fails) and remove our directory echo_red_text "Removing ${IRONFOX_ANDROID_SDK}/platforms/android-36..." backup_dir "${IRONFOX_ANDROID_SDK}/platforms/android-36" else return 0 fi fi # By default, we know the download hasn't failed... local IRONFOX_DOWNLOAD_FAILED=0 echo_red_text 'Downloading Android SDK Platform (36)...' "${IRONFOX_ANDROID_SDK}/cmdline-tools/${IRONFOX_ANDROID_SDK_VERSION}/bin/sdkmanager" 'platforms;android-36' || local IRONFOX_DOWNLOAD_FAILED=1 # If the download failed, restore our back-up, clean-up, and exit if [[ "${IRONFOX_DOWNLOAD_FAILED}" == 1 ]]; then echo_red_text 'ERROR: Download failed! Exiting...' restore_dir "${IRONFOX_ANDROID_SDK}/platforms/android-36" "${IRONFOX_RM}" -rf "${IRONFOX_EXTERNAL}/temp" exit 1 else echo_green_text "SUCCESS: Set-up Android SDK Platform (36) at ${IRONFOX_ANDROID_SDK}/platforms/android-36" fi fi } # Get Android SDK Platform Tools function get_android_sdk_platform_tools() { if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then echo_red_text 'Downloading Android SDK Platform Tools (Linux)...' download "https://dl.google.com/android/repository/platform-tools_r${IRONFOX_ANDROID_SDK_PLATFORM_TOOLS_VERSION}-linux.zip" "${IRONFOX_ANDROID_SDK_PLATFORM_TOOLS}" "${IRONFOX_ANDROID_SDK_PLATFORM_TOOLS_SHA512SUM_LINUX}" echo_red_text 'Downloading Android SDK Platform Tools (OS X)...' download "https://dl.google.com/android/repository/platform-tools_r${IRONFOX_ANDROID_SDK_PLATFORM_TOOLS_VERSION}-darwin.zip" "${IRONFOX_ANDROID_SDK_PLATFORM_TOOLS}" "${IRONFOX_ANDROID_SDK_PLATFORM_TOOLS_SHA512SUM_OSX}" else # Set our platform if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_ANDROID_SDK_PLATFORM_TOOLS_PLATFORM='darwin' else local -r IRONFOX_ANDROID_SDK_PLATFORM_TOOLS_PLATFORM='linux' fi # Set our checksum to verify if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_ANDROID_SDK_PLATFORM_TOOLS_SHA512SUM="${IRONFOX_ANDROID_SDK_PLATFORM_TOOLS_SHA512SUM_OSX}" else local -r IRONFOX_ANDROID_SDK_PLATFORM_TOOLS_SHA512SUM="${IRONFOX_ANDROID_SDK_PLATFORM_TOOLS_SHA512SUM_LINUX}" fi echo_red_text 'Downloading Android SDK Platform Tools...' download_and_extract 'android-sdk-platform-tools' "https://dl.google.com/android/repository/platform-tools_r${IRONFOX_ANDROID_SDK_PLATFORM_TOOLS_VERSION}-${IRONFOX_ANDROID_SDK_PLATFORM_TOOLS_PLATFORM}.zip" "${IRONFOX_ANDROID_SDK_PLATFORM_TOOLS}" "${IRONFOX_ANDROID_SDK_PLATFORM_TOOLS_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_green_text "SUCCESS: Set-up Android SDK Platform Tools at ${IRONFOX_ANDROID_SDK_PLATFORM_TOOLS}" fi fi } # Get Application Services function get_as() { echo_red_text 'Downloading Application Services...' download_and_extract 'application-services' "https://github.com/mozilla/application-services/archive/${IRONFOX_AS_COMMIT}.tar.gz" "${IRONFOX_AS}" "${IRONFOX_AS_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_green_text "SUCCESS: Set-up Application Services at ${IRONFOX_AS}" fi } # Get + set-up Bundletool function get_bundletool() { if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then echo_red_text 'Downloading Bundletool (Source archive)...' download_and_extract 'bundletool' "https://github.com/google/bundletool/archive/${IRONFOX_BUNDLETOOL_REPO_COMMIT}.tar.gz" "${IRONFOX_BUNDLETOOL_DIR}" "${IRONFOX_BUNDLETOOL_REPO_SHA512SUM}" echo_red_text 'Downloading Bundletool (Prebuilt)...' download "https://github.com/google/bundletool/releases/download/${IRONFOX_BUNDLETOOL_VERSION}/bundletool-all-${IRONFOX_BUNDLETOOL_VERSION}.jar" "${IRONFOX_BUNDLETOOL_JAR}" "${IRONFOX_BUNDLETOOL_SHA512SUM}" else echo_red_text 'Downloading Bundletool...' if [[ "${IRONFOX_NO_PREBUILDS}" == "1" ]]; then download_and_extract 'bundletool' "https://github.com/google/bundletool/archive/${IRONFOX_BUNDLETOOL_REPO_COMMIT}.tar.gz" "${IRONFOX_BUNDLETOOL_DIR}" "${IRONFOX_BUNDLETOOL_REPO_SHA512SUM}" else download "https://github.com/google/bundletool/releases/download/${IRONFOX_BUNDLETOOL_VERSION}/bundletool-all-${IRONFOX_BUNDLETOOL_VERSION}.jar" "${IRONFOX_BUNDLETOOL_JAR}" "${IRONFOX_BUNDLETOOL_SHA512SUM}" fi if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_green_text "SUCCESS: Set-up Bundletool at ${IRONFOX_BUNDLETOOL_DIR}" fi fi } # Get cbindgen function get_cbindgen() { # If all we're doing is updating the checksum, we don't care if the environment is prepared if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" != 1 ]]; then if [[ ! -d "${IRONFOX_CARGO_HOME}" ]] || [[ ! -f "${IRONFOX_CARGO_ENV}" ]]; then echo_red_text "ERROR: You tried to download cbindgen, but you don't have a Rust environment set-up yet." exit 1 fi if [[ -d "${IRONFOX_CARGO_HOME}/bin/cbindgen" ]]; then echo_red_text "cbindgen is already installed at ${IRONFOX_CARGO_HOME}/bin/cbindgen." read -p "Do you want to re-download it? [y/N] " -n 1 -r echo if [[ "${REPLY}" =~ ^[Nn]$ ]]; then return 0 fi fi fi echo_red_text "Downloading cbindgen..." download_and_extract 'cbindgen' "https://github.com/mozilla/cbindgen/archive/${IRONFOX_CBINDGEN_COMMIT}.tar.gz" "${IRONFOX_CBINDGEN_DIR}" "${IRONFOX_CBINDGEN_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then source "${IRONFOX_CARGO_ENV}" echo_red_text 'Installing cbindgen...' "${IRONFOX_CARGO}" +"${IRONFOX_RUST_VERSION}" install --locked --force --vers "${IRONFOX_CBINDGEN_VERSION}" --path "${IRONFOX_CBINDGEN_DIR}" cbindgen echo_green_text "SUCCESS: Set-up cbindgen at ${IRONFOX_CARGO_HOME}/bin/cbindgen" fi } # Get Firefox (Gecko/mozilla-central) function get_firefox() { echo_red_text 'Downloading Firefox...' download_and_extract 'gecko' "https://github.com/mozilla-firefox/firefox/archive/${IRONFOX_GECKO_COMMIT}.tar.gz" "${IRONFOX_GECKO}" "${IRONFOX_GECKO_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_green_text "SUCCESS: Set-up Firefox at ${IRONFOX_GECKO}" fi } # Get firefox-l10n function get_firefox_l10n() { echo_red_text 'Downloading firefox-l10n...' download_and_extract 'l10n-central' "https://github.com/mozilla-l10n/firefox-l10n/archive/${IRONFOX_L10N_CENTRAL_COMMIT}.tar.gz" "${IRONFOX_L10N_CENTRAL}" "${IRONFOX_L10N_CENTRAL_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_green_text "SUCCESS: Set-up firefox-l10n at ${IRONFOX_L10N_CENTRAL}" fi } # Get Glean function get_glean() { echo_red_text 'Downloading Glean...' download_and_extract 'glean' "https://github.com/mozilla/glean/archive/${IRONFOX_GLEAN_COMMIT}.tar.gz" "${IRONFOX_GLEAN}" "${IRONFOX_GLEAN_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_green_text "SUCCESS: Set-up Glean at ${IRONFOX_GLEAN}" fi } # Get Glean Parser function get_glean_parser() { if [[ ! -d "${IRONFOX_UV_DIR}" ]] || [[ ! -f "${IRONFOX_PYENV}" ]]; then echo_red_text "ERROR: You tried to download Glean Parser, but you don't have a Python environment set-up yet." exit 1 fi if [[ ! -d "${IRONFOX_PIP_DIR}" ]]; then echo_red_text "ERROR: You tried to download Glean Parser, but you don't have pip set-up yet." exit 1 fi # Set our Glean Parser wheels directory if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then local -r glean_parser_wheels="${IRONFOX_EXTERNAL}/temp/chksm/glean_parser-wheels" else local -r glean_parser_wheels="${IRONFOX_GLEAN_PARSER_WHEELS}" fi if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" != 1 ]] && [[ -d "${IRONFOX_PYENV_DIR}/bin/glean_parser" ]]; then echo_red_text "Glean Parser is already installed at ${IRONFOX_PYENV_DIR}/bin/glean_parser" read -p "Do you want to re-download it? [y/N] " -n 1 -r echo if [[ "${REPLY}" =~ ^[Nn]$ ]]; then return 0 else source "${IRONFOX_PYENV}" "${IRONFOX_UV}" pip uninstall glean-parser # Back-up (in case something goes wrong - ex. checksum validation fails) and remove our directory backup_dir "${glean_parser_wheels}" fi fi "${IRONFOX_MKDIR}" -p "${glean_parser_wheels}" source "${IRONFOX_PYENV}" echo_red_text 'Downloading Glean Parser wheels...' pushd "${IRONFOX_GLEAN_PARSER_WHEELS}" "${IRONFOX_PIP}" download glean-parser=="${IRONFOX_GLEAN_PARSER_VERSION}" popd # Validate SHA512sum validate_checksum "${IRONFOX_GLEAN_PARSER_SHA512SUM}" "${IRONFOX_GLEAN_PARSER_WHEELS}/glean_parser-${IRONFOX_GLEAN_PARSER_VERSION}-py3-none-any.whl" 'sha512sum' # Clean-up if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then "${IRONFOX_RM}" -rf "${IRONFOX_EXTERNAL}/temp/chksm" fi } # Get + set-up F-Droid's Gradle script function get_gradle() { echo_red_text "Downloading F-Droid's Gradle script..." download "https://gitlab.com/fdroid/gradlew-fdroid/-/raw/${IRONFOX_GRADLE_COMMIT}/gradlew.py" "${IRONFOX_GRADLE_PY}" "${IRONFOX_GRADLE_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_green_text "SUCCESS: Set-up Gradle at ${IRONFOX_GRADLE_PY}" fi } # Get GYP function get_gyp() { # If all we're doing is updating the checksum, we don't care if the environment is prepared if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" != 1 ]]; then if [[ ! -d "${IRONFOX_UV_DIR}" ]] || [[ ! -f "${IRONFOX_PYENV}" ]]; then echo_red_text "ERROR: You tried to download GYP, but you don't have a Python environment set-up yet." exit 1 fi if [[ -d "${IRONFOX_PYENV_DIR}/bin/gyp" ]]; then echo_red_text "GYP is already installed at ${IRONFOX_PYENV_DIR}/bin/gyp" read -p "Do you want to re-download it? [y/N] " -n 1 -r echo if [[ "${REPLY}" =~ ^[Nn]$ ]]; then return 0 else source "${IRONFOX_PYENV}" "${IRONFOX_UV}" pip uninstall gyp-next fi fi fi echo_red_text "Downloading GYP..." download_and_extract 'gyp-next' "https://github.com/nodejs/gyp-next/archive/${IRONFOX_GYP_COMMIT}.tar.gz" "${IRONFOX_GYP}" "${IRONFOX_GYP_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then source "${IRONFOX_PYENV}" echo_red_text 'Installing GYP...' "${IRONFOX_UV}" pip install --no-editable --strict "${IRONFOX_GYP}" echo_green_text "SUCCESS: Set-up GYP at ${IRONFOX_PYENV_DIR}/bin/gyp" fi } # Get JDK (17) ## (Required by GeckoView) function get_jdk_17() { if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then echo_red_text 'Downloading JDK (17) (Linux - ARM64)...' download "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-${IRONFOX_JDK_17_VERSION}%2B${IRONFOX_JDK_17_REVISION}/OpenJDK17U-jdk_aarch64_linux_hotspot_${IRONFOX_JDK_17_VERSION}_${IRONFOX_JDK_17_REVISION}.tar.gz" "${IRONFOX_JDK_17}" "${IRONFOX_JDK_17_SHA512SUM_LINUX_ARM64}" echo_red_text 'Downloading JDK (17) (Linux - x86_64)...' download "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-${IRONFOX_JDK_17_VERSION}%2B${IRONFOX_JDK_17_REVISION}/OpenJDK17U-jdk_x64_linux_hotspot_${IRONFOX_JDK_17_VERSION}_${IRONFOX_JDK_17_REVISION}.tar.gz" "${IRONFOX_JDK_17}" "${IRONFOX_JDK_17_SHA512SUM_LINUX_X86_64}" echo_red_text 'Downloading JDK (17) (OS X - ARM64)...' download "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-${IRONFOX_JDK_17_VERSION}%2B${IRONFOX_JDK_17_REVISION}/OpenJDK17U-jdk_aarch64_mac_hotspot_${IRONFOX_JDK_17_VERSION}_${IRONFOX_JDK_17_REVISION}.tar.gz" "${IRONFOX_JDK_17}" "${IRONFOX_JDK_17_SHA512SUM_OSX_ARM64}" echo_red_text 'Downloading JDK (17) (OS X - x86_64)...' download "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-${IRONFOX_JDK_17_VERSION}%2B${IRONFOX_JDK_17_REVISION}/OpenJDK17U-jdk_x64_mac_hotspot_${IRONFOX_JDK_17_VERSION}_${IRONFOX_JDK_17_REVISION}.tar.gz" "${IRONFOX_JDK_17}" "${IRONFOX_JDK_17_SHA512SUM_OSX_X86_64}" else # Set our platform if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_JDK_17_PLATFORM='mac' else local -r IRONFOX_JDK_17_PLATFORM='linux' fi # Set our platform architecture if [[ "${IRONFOX_PLATFORM_ARCH}" == 'aarch64' ]]; then local -r IRONFOX_JDK_17_ARCH='aarch64' else local -r IRONFOX_JDK_17_ARCH='x64' fi # Set our checksum to verify if [[ "${IRONFOX_PLATFORM_ARCH}" == 'aarch64' ]]; then if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_JDK_17_SHA512SUM="${IRONFOX_JDK_17_SHA512SUM_OSX_ARM64}" else local -r IRONFOX_JDK_17_SHA512SUM="${IRONFOX_JDK_17_SHA512SUM_LINUX_ARM64}" fi else if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_JDK_17_SHA512SUM="${IRONFOX_JDK_17_SHA512SUM_OSX_X86_64}" else local -r IRONFOX_JDK_17_SHA512SUM="${IRONFOX_JDK_17_SHA512SUM_LINUX_X86_64}" fi fi echo_red_text 'Downloading JDK (17)...' download_and_extract 'jdk-17' "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-${IRONFOX_JDK_17_VERSION}%2B${IRONFOX_JDK_17_REVISION}/OpenJDK17U-jdk_${IRONFOX_JDK_17_ARCH}_${IRONFOX_JDK_17_PLATFORM}_hotspot_${IRONFOX_JDK_17_VERSION}_${IRONFOX_JDK_17_REVISION}.tar.gz" "${IRONFOX_JDK_17}" "${IRONFOX_JDK_17_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_green_text "SUCCESS: Set-up JDK (17) at ${IRONFOX_JDK_17}" fi fi } # Get JDK (21) function get_jdk_21() { if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then echo_red_text 'Downloading JDK (21) (Linux - ARM64)...' download "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-${IRONFOX_JDK_21_VERSION}%2B${IRONFOX_JDK_21_REVISION}/OpenJDK21U-jdk_aarch64_linux_hotspot_${IRONFOX_JDK_21_VERSION}_${IRONFOX_JDK_21_REVISION}.tar.gz" "${IRONFOX_JDK_21}" "${IRONFOX_JDK_21_SHA512SUM_LINUX_ARM64}" echo_red_text 'Downloading JDK (21) (Linux - x86_64)...' download "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-${IRONFOX_JDK_21_VERSION}%2B${IRONFOX_JDK_21_REVISION}/OpenJDK21U-jdk_x64_linux_hotspot_${IRONFOX_JDK_21_VERSION}_${IRONFOX_JDK_21_REVISION}.tar.gz" "${IRONFOX_JDK_21}" "${IRONFOX_JDK_21_SHA512SUM_LINUX_X86_64}" echo_red_text 'Downloading JDK (21) (OS X - ARM64)...' download "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-${IRONFOX_JDK_21_VERSION}%2B${IRONFOX_JDK_21_REVISION}/OpenJDK21U-jdk_aarch64_mac_hotspot_${IRONFOX_JDK_21_VERSION}_${IRONFOX_JDK_21_REVISION}.tar.gz" "${IRONFOX_JDK_21}" "${IRONFOX_JDK_21_SHA512SUM_OSX_ARM64}" echo_red_text 'Downloading JDK (21) (OS X - x86_64)...' download "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-${IRONFOX_JDK_21_VERSION}%2B${IRONFOX_JDK_21_REVISION}/OpenJDK21U-jdk_x64_mac_hotspot_${IRONFOX_JDK_21_VERSION}_${IRONFOX_JDK_21_REVISION}.tar.gz" "${IRONFOX_JDK_21}" "${IRONFOX_JDK_21_SHA512SUM_OSX_X86_64}" else # Set our platform if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_JDK_21_PLATFORM='mac' else local -r IRONFOX_JDK_21_PLATFORM='linux' fi # Set our platform architecture if [[ "${IRONFOX_PLATFORM_ARCH}" == 'aarch64' ]]; then local -r IRONFOX_JDK_21_ARCH='aarch64' else local -r IRONFOX_JDK_21_ARCH='x64' fi # Set our checksum to verify if [[ "${IRONFOX_PLATFORM_ARCH}" == 'aarch64' ]]; then if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_JDK_21_SHA512SUM="${IRONFOX_JDK_21_SHA512SUM_OSX_ARM64}" else local -r IRONFOX_JDK_21_SHA512SUM="${IRONFOX_JDK_21_SHA512SUM_LINUX_ARM64}" fi else if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_JDK_21_SHA512SUM="${IRONFOX_JDK_21_SHA512SUM_OSX_X86_64}" else local -r IRONFOX_JDK_21_SHA512SUM="${IRONFOX_JDK_21_SHA512SUM_LINUX_X86_64}" fi fi echo_red_text 'Downloading JDK (21)...' download_and_extract 'jdk-21' "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-${IRONFOX_JDK_21_VERSION}%2B${IRONFOX_JDK_21_REVISION}/OpenJDK21U-jdk_${IRONFOX_JDK_21_ARCH}_${IRONFOX_JDK_21_PLATFORM}_hotspot_${IRONFOX_JDK_21_VERSION}_${IRONFOX_JDK_21_REVISION}.tar.gz" "${IRONFOX_JDK_21}" "${IRONFOX_JDK_21_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_green_text "SUCCESS: Set-up JDK (21) at ${IRONFOX_JDK_21}" fi fi } # Get JDK (25) function get_jdk_25() { if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then echo_red_text 'Downloading JDK (25) (Linux - ARM64)...' download "https://github.com/adoptium/temurin25-binaries/releases/download/jdk-${IRONFOX_JDK_25_VERSION}%2B${IRONFOX_JDK_25_REVISION}/OpenJDK25U-jdk_aarch64_linux_hotspot_${IRONFOX_JDK_25_VERSION}_${IRONFOX_JDK_25_REVISION}.tar.gz" "${IRONFOX_JDK_25}" "${IRONFOX_JDK_25_SHA512SUM_LINUX_ARM64}" echo_red_text 'Downloading JDK (25) (Linux - x86_64)...' download "https://github.com/adoptium/temurin25-binaries/releases/download/jdk-${IRONFOX_JDK_25_VERSION}%2B${IRONFOX_JDK_25_REVISION}/OpenJDK25U-jdk_x64_linux_hotspot_${IRONFOX_JDK_25_VERSION}_${IRONFOX_JDK_25_REVISION}.tar.gz" "${IRONFOX_JDK_25}" "${IRONFOX_JDK_25_SHA512SUM_LINUX_X86_64}" echo_red_text 'Downloading JDK (25) (OS X - ARM64)...' download "https://github.com/adoptium/temurin25-binaries/releases/download/jdk-${IRONFOX_JDK_25_VERSION}%2B${IRONFOX_JDK_25_REVISION}/OpenJDK25U-jdk_aarch64_mac_hotspot_${IRONFOX_JDK_25_VERSION}_${IRONFOX_JDK_25_REVISION}.tar.gz" "${IRONFOX_JDK_25}" "${IRONFOX_JDK_25_SHA512SUM_OSX_ARM64}" echo_red_text 'Downloading JDK (25) (OS X - x86_64)...' download "https://github.com/adoptium/temurin25-binaries/releases/download/jdk-${IRONFOX_JDK_25_VERSION}%2B${IRONFOX_JDK_25_REVISION}/OpenJDK25U-jdk_x64_mac_hotspot_${IRONFOX_JDK_25_VERSION}_${IRONFOX_JDK_25_REVISION}.tar.gz" "${IRONFOX_JDK_25}" "${IRONFOX_JDK_25_SHA512SUM_OSX_X86_64}" else # Set our platform if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_JDK_25_PLATFORM='mac' else local -r IRONFOX_JDK_25_PLATFORM='linux' fi # Set our platform architecture if [[ "${IRONFOX_PLATFORM_ARCH}" == 'aarch64' ]]; then local -r IRONFOX_JDK_25_ARCH='aarch64' else local -r IRONFOX_JDK_25_ARCH='x64' fi # Set our checksum to verify if [[ "${IRONFOX_PLATFORM_ARCH}" == 'aarch64' ]]; then if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_JDK_25_SHA512SUM="${IRONFOX_JDK_25_SHA512SUM_OSX_ARM64}" else local -r IRONFOX_JDK_25_SHA512SUM="${IRONFOX_JDK_25_SHA512SUM_LINUX_ARM64}" fi else if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_JDK_25_SHA512SUM="${IRONFOX_JDK_25_SHA512SUM_OSX_X86_64}" else local -r IRONFOX_JDK_25_SHA512SUM="${IRONFOX_JDK_25_SHA512SUM_LINUX_X86_64}" fi fi echo_red_text 'Downloading JDK (25)...' download_and_extract 'jdk-25' "https://github.com/adoptium/temurin25-binaries/releases/download/jdk-${IRONFOX_JDK_25_VERSION}%2B${IRONFOX_JDK_25_REVISION}/OpenJDK25U-jdk_${IRONFOX_JDK_25_ARCH}_${IRONFOX_JDK_25_PLATFORM}_hotspot_${IRONFOX_JDK_25_VERSION}_${IRONFOX_JDK_25_REVISION}.tar.gz" "${IRONFOX_JDK_25}" "${IRONFOX_JDK_25_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_green_text "SUCCESS: Set-up JDK (25) at ${IRONFOX_JDK_25}" fi fi } # Get microG function get_microg() { echo_red_text 'Downloading microG...' download_and_extract 'gmscore' "https://github.com/microg/GmsCore/archive/${IRONFOX_GMSCORE_COMMIT}.tar.gz" "${IRONFOX_GMSCORE}" "${IRONFOX_GMSCORE_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_green_text "SUCCESS: Set-up microG at ${IRONFOX_GMSCORE}" fi } # Get + set-up Node.js function get_node() { # If all we're doing is updating the checksum, we don't care if the environment is prepared if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" != 1 ]]; then if [[ -d "${IRONFOX_NVM}" ]]; then echo_red_text "The Node.js environment is already set-up at ${IRONFOX_NVM}" read -p "Do you want to re-create it? [y/N] " -n 1 -r echo if [[ "${REPLY}" =~ ^[Yy]$ ]]; then "${IRONFOX_RM}" -rf "${IRONFOX_NPM_CACHE}" "${IRONFOX_NVM}" "${IRONFOX_ROOT}/node_modules" fi fi fi download_and_extract 'nvm' "https://github.com/nvm-sh/nvm/archive/${IRONFOX_NVM_COMMIT}.tar.gz" "${IRONFOX_NVM}" "${IRONFOX_NVM_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_red_text 'Installing Node.js...' source "${IRONFOX_NVM_ENV}" nvm install "${IRONFOX_NODE_VERSION}" nvm alias default "${IRONFOX_NODE_VERSION}" nvm use "${IRONFOX_NODE_VERSION}" echo_green_text "SUCCESS: Set-up Node.js environment at ${IRONFOX_NVM}" fi } # Get npm function get_npm() { # If all we're doing is updating the checksum, we don't care if the environment is prepared if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" != 1 ]] && [[ ! -d "${IRONFOX_NVM}" ]]; then echo_red_text "ERROR: You tried to download npm, but you don't have a Node.js environment set-up yet." exit 1 fi echo_red_text 'Downloading npm...' download "https://registry.npmjs.org/npm/-/npm-${IRONFOX_NPM_VERSION}.tgz" "${IRONFOX_DOWNLOADS}/npm.tgz" "${IRONFOX_NPM_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_red_text 'Installing npm...' source "${IRONFOX_NVM_ENV}" "${IRONFOX_NPM}" install -g npm@file:"${IRONFOX_DOWNLOADS}/npm.tgz" echo_green_text "SUCCESS: Set-up npm at ${IRONFOX_NPM}" fi } # Get Phoenix function get_phoenix() { echo_red_text 'Downloading Phoenix...' download_and_extract 'phoenix' "https://gitlab.com/celenityy/Phoenix/-/archive/${IRONFOX_PHOENIX_COMMIT}/Phoenix-${IRONFOX_PHOENIX_COMMIT}.tar.gz" "${IRONFOX_PHOENIX}" "${IRONFOX_PHOENIX_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_green_text "SUCCESS: Set-up Phoenix at ${IRONFOX_PHOENIX}" fi } # Get + set-up pip function get_pip() { # If all we're doing is updating the checksum, we don't care if the environment is prepared if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" != 1 ]]; then if [[ ! -d "${IRONFOX_UV_DIR}" ]] || [[ ! -f "${IRONFOX_PYENV}" ]]; then echo_red_text "ERROR: You tried to download pip, but you don't have a Python environment set-up yet." exit 1 fi fi echo_red_text 'Downloading pip...' download_and_extract 'pip' "https://github.com/pypa/pip/archive/${IRONFOX_PIP_COMMIT}.tar.gz" "${IRONFOX_PIP_DIR}" "${IRONFOX_PIP_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then source "${IRONFOX_PYENV}" echo_red_text 'Installing pip...' "${IRONFOX_UV}" pip install --no-editable --strict "${IRONFOX_PIP_DIR}" echo_green_text "SUCCESS: Set-up pip at ${IRONFOX_PIP}" fi } # Get the IronFox prebuilds repo function get_prebuilds() { echo_red_text 'Downloading the IronFox prebuilds repository...' download_and_extract 'prebuilds' "https://gitlab.com/ironfox-oss/prebuilds/-/archive/${IRONFOX_PREBUILDS_COMMIT}/prebuilds-${IRONFOX_PREBUILDS_COMMIT}.tar.gz" "${IRONFOX_PREBUILDS}" "${IRONFOX_PREBUILDS_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then pushd "${IRONFOX_PREBUILDS}" echo_red_text 'Downloading prebuild sources...' /bin/bash "${IRONFOX_PREBUILDS}/scripts/get_sources.sh" popd echo_green_text "SUCCESS: Set-up the IronFox prebuilds repository at ${IRONFOX_PREBUILDS}" fi } # Get Python function get_python() { # If all we're doing is updating the checksum, we don't care about existing installations if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" != 1 ]]; then if [[ ! -x "${IRONFOX_UV}" ]]; then echo_red_text "ERROR: You tried to download Python, but you're missing uv!" exit 1 fi if [[ -d "${IRONFOX_PYENV_DIR}" ]]; then echo_red_text "The Python environment is already set-up at ${IRONFOX_PYENV_DIR}" read -p "Do you want to re-create it? [y/N] " -n 1 -r echo if [[ "${REPLY}" =~ ^[Yy]$ ]]; then # Back-up (in case something goes wrong - ex. checksum validation fails) and remove our directory backup_dir "${IRONFOX_PYENV_DIR}" fi fi if [[ -d "${IRONFOX_PYTHON_DIR}" ]]; then echo_red_text "Found existing installation at ${IRONFOX_PYTHON_DIR}" echo 'Continuing will remove this installation and related data' read -p "Do you still want to continue? [y/N] " -n 1 -r echo if [[ "${REPLY}" =~ ^[Yy]$ ]]; then # Back-up (in case something goes wrong - ex. checksum validation fails) and remove our directories backup_dir "${IRONFOX_PYENV_DIR}" backup_dir "${IRONFOX_PYTHON_DIR}" backup_dir "${IRONFOX_UV_CACHE}" backup_dir "${IRONFOX_UV_LOCAL}/python-cache" backup_dir "${IRONFOX_UV_PYTHON}" else return 0 fi fi fi if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then echo_red_text 'Downloading Python (Linux - ARM64)...' download "https://github.com/astral-sh/python-build-standalone/releases/download/${IRONFOX_PYTHON_GIT_RELEASE}/cpython-${IRONFOX_PYTHON_VERSION}+${IRONFOX_PYTHON_GIT_RELEASE}-aarch64-unknown-linux-gnu-install_only_stripped.tar.gz" "${IRONFOX_PYTHON_DIR}/${IRONFOX_PYTHON_GIT_RELEASE}/cpython-${IRONFOX_PYTHON_VERSION}+${IRONFOX_PYTHON_GIT_RELEASE}-aarch64-unknown-linux-gnu-install_only_stripped.tar.gz" "${IRONFOX_PYTHON_SHA512SUM_LINUX_ARM64}" echo_red_text 'Downloading Python (Linux - x86_64)...' download "https://github.com/astral-sh/python-build-standalone/releases/download/${IRONFOX_PYTHON_GIT_RELEASE}/cpython-${IRONFOX_PYTHON_VERSION}+${IRONFOX_PYTHON_GIT_RELEASE}-x86_64-unknown-linux-gnu-install_only_stripped.tar.gz" "${IRONFOX_PYTHON_DIR}/${IRONFOX_PYTHON_GIT_RELEASE}/cpython-${IRONFOX_PYTHON_VERSION}+${IRONFOX_PYTHON_GIT_RELEASE}-x86_64-unknown-linux-gnu-install_only_stripped.tar.gz" "${IRONFOX_PYTHON_SHA512SUM_LINUX_X86_64}" echo_red_text 'Downloading Python (OS X - ARM64)...' download "https://github.com/astral-sh/python-build-standalone/releases/download/${IRONFOX_PYTHON_GIT_RELEASE}/cpython-${IRONFOX_PYTHON_VERSION}+${IRONFOX_PYTHON_GIT_RELEASE}-aarch64-apple-darwin-install_only_stripped.tar.gz" "${IRONFOX_PYTHON_DIR}/${IRONFOX_PYTHON_GIT_RELEASE}/cpython-${IRONFOX_PYTHON_VERSION}+${IRONFOX_PYTHON_GIT_RELEASE}-aarch64-apple-darwin-install_only_stripped.tar.gz" "${IRONFOX_PYTHON_SHA512SUM_OSX_ARM64}" echo_red_text 'Downloading Python (OS X - x86_64)...' download "https://github.com/astral-sh/python-build-standalone/releases/download/${IRONFOX_PYTHON_GIT_RELEASE}/cpython-${IRONFOX_PYTHON_VERSION}+${IRONFOX_PYTHON_GIT_RELEASE}-x86_64-apple-darwin-install_only_stripped.tar.gz" "${IRONFOX_PYTHON_DIR}/${IRONFOX_PYTHON_GIT_RELEASE}/cpython-${IRONFOX_PYTHON_VERSION}+${IRONFOX_PYTHON_GIT_RELEASE}-x86_64-apple-darwin-install_only_stripped.tar.gz" "${IRONFOX_PYTHON_SHA512SUM_OSX_X86_64}" else # Set our platform if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_PYTHON_PLATFORM='apple-darwin' else local -r IRONFOX_PYTHON_PLATFORM='unknown-linux-gnu' fi # Set our platform architecture if [[ "${IRONFOX_PLATFORM_ARCH}" == 'aarch64' ]]; then local -r IRONFOX_PYTHON_ARCH='aarch64' else local -r IRONFOX_PYTHON_ARCH='x86_64' fi # Set our checksum to verify if [[ "${IRONFOX_PLATFORM_ARCH}" == 'aarch64' ]]; then if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_PYTHON_SHA512SUM="${IRONFOX_PYTHON_SHA512SUM_OSX_ARM64}" else local -r IRONFOX_PYTHON_SHA512SUM="${IRONFOX_PYTHON_SHA512SUM_LINUX_ARM64}" fi else if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_PYTHON_SHA512SUM="${IRONFOX_PYTHON_SHA512SUM_OSX_X86_64}" else local -r IRONFOX_PYTHON_SHA512SUM="${IRONFOX_PYTHON_SHA512SUM_LINUX_X86_64}" fi fi # Tell `download` to return instead of exit upon an error IRONFOX_DOWNLOAD_EXIT=0 # By default, we know nothing has failed... local IRONFOX_DOWNLOAD_FAILED=0 local IRONFOX_PYENV_FAILED=0 local IRONFOX_PYTHON_INSTALL_FAILED=0 echo_red_text 'Downloading Python...' download "https://github.com/astral-sh/python-build-standalone/releases/download/${IRONFOX_PYTHON_GIT_RELEASE}/cpython-${IRONFOX_PYTHON_VERSION}+${IRONFOX_PYTHON_GIT_RELEASE}-${IRONFOX_PYTHON_ARCH}-${IRONFOX_PYTHON_PLATFORM}-install_only_stripped.tar.gz" "${IRONFOX_PYTHON_DIR}/${IRONFOX_PYTHON_GIT_RELEASE}/cpython-${IRONFOX_PYTHON_VERSION}+${IRONFOX_PYTHON_GIT_RELEASE}-${IRONFOX_PYTHON_ARCH}-${IRONFOX_PYTHON_PLATFORM}-install_only_stripped.tar.gz" "${IRONFOX_PYTHON_SHA512SUM}" || local IRONFOX_DOWNLOAD_FAILED=1 # If the download failed, restore our back-ups, clean-up, and exit if [[ "${IRONFOX_DOWNLOAD_FAILED}" == 1 ]]; then echo_red_text 'ERROR: Download failed! Exiting...' restore_dir "${IRONFOX_PYENV_DIR}" restore_dir "${IRONFOX_PYTHON_DIR}" restore_dir "${IRONFOX_UV_CACHE}" restore_dir "${IRONFOX_UV_PYTHON}" restore_dir "${IRONFOX_UV_LOCAL}/python-cache" "${IRONFOX_RM}" -rf "${IRONFOX_EXTERNAL}/temp" exit 1 elif [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_green_text "SUCCESS: Downloaded Python to ${IRONFOX_PYTHON_DIR}/${IRONFOX_PYTHON_GIT_RELEASE}/cpython-${IRONFOX_PYTHON_VERSION}+${IRONFOX_PYTHON_GIT_RELEASE}-${IRONFOX_PYTHON_ARCH}-${IRONFOX_PYTHON_PLATFORM}-install_only_stripped.tar.gz" echo_red_text 'Installing Python...' "${IRONFOX_UV}" python install "${IRONFOX_PYTHON_VERSION}" || local IRONFOX_PYTHON_INSTALL_FAILED=1 # If the install failed, restore our back-ups, clean-up, and exit if [[ "${IRONFOX_PYTHON_INSTALL_FAILED}" == 1 ]]; then echo_red_text 'ERROR: Installation failed! Exiting...' restore_dir "${IRONFOX_PYENV_DIR}" restore_dir "${IRONFOX_PYTHON_DIR}" restore_dir "${IRONFOX_UV_CACHE}" restore_dir "${IRONFOX_UV_PYTHON}" restore_dir "${IRONFOX_UV_LOCAL}/python-cache" "${IRONFOX_RM}" -rf "${IRONFOX_EXTERNAL}/temp" exit 1 fi echo_red_text 'Creating Python environment...' "${IRONFOX_UV}" venv "${IRONFOX_PYENV_DIR}" || local IRONFOX_PYENV_FAILED=1 # If the Python env set-up failed, restore our back-up, clean-up, and exit if [[ "${IRONFOX_PYENV_FAILED}" == 1 ]]; then echo_red_text 'ERROR: Environment set-up failed! Exiting...' restore_dir "${IRONFOX_PYENV_DIR}" "${IRONFOX_RM}" -rf "${IRONFOX_EXTERNAL}/temp" exit 1 else echo_green_text "SUCCESS: Set-up Python environment at ${IRONFOX_PYENV_DIR}" fi fi fi } # Get PyYAML function get_pyyaml() { # If all we're doing is updating the checksum, we don't care if the environment is prepared if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" != 1 ]]; then if [[ ! -d "${IRONFOX_UV_DIR}" ]] || [[ ! -f "${IRONFOX_PYENV}" ]]; then echo_red_text "ERROR: You tried to download PyYAML, but you don't have a Python environment set-up yet." exit 1 fi if [[ -d "${IRONFOX_PYYAML}" ]]; then echo_red_text "PyYAML is already downloaded at ${IRONFOX_PYYAML}" read -p "Do you want to re-download it? [y/N] " -n 1 -r echo if [[ "${REPLY}" =~ ^[Nn]$ ]]; then return 0 else source "${IRONFOX_PYENV}" "${IRONFOX_UV}" pip uninstall pyyaml fi fi fi echo_red_text "Downloading PyYAML..." download_and_extract 'pyyaml' "https://github.com/yaml/pyyaml/archive/${IRONFOX_PYYAML_COMMIT}.tar.gz" "${IRONFOX_PYYAML}" "${IRONFOX_PYYAML_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then source "${IRONFOX_PYENV}" echo_red_text 'Installing PyYAML...' "${IRONFOX_UV}" pip install --no-editable --strict "${IRONFOX_PYYAML}" echo_green_text 'SUCCESS: Set-up PyYAML' fi } # Get + set-up rust/cargo function get_rust() { if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" != 1 ]] && [[ -d "${IRONFOX_CARGO_HOME}" ]]; then echo_red_text "Found existing installation at ${IRONFOX_CARGO_HOME}" echo 'Continuing will remove this installation and related data' read -p "Do you still want to continue? [y/N] " -n 1 -r echo if [[ "${REPLY}" =~ ^[Yy]$ ]]; then # Back-up (in case something goes wrong - ex. checksum validation fails) and remove our directories backup_dir "${IRONFOX_CARGO_HOME}" backup_dir "${IRONFOX_RUSTUP_HOME}" else return 0 fi fi echo_red_text 'Downloading Rust...' if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then download "https://raw.githubusercontent.com/rust-lang/rustup/${IRONFOX_RUSTUP_COMMIT}/rustup-init.sh" "${IRONFOX_DOWNLOADS}/rustup-init.sh" "${IRONFOX_RUSTUP_SHA512SUM}" else # Tell `download` to return instead of exit upon an error IRONFOX_DOWNLOAD_EXIT=0 # By default, we know nothing has failed... local IRONFOX_CARGO_ENV_FAILED=0 local IRONFOX_CARGO_INSTALL_FAILED=0 local IRONFOX_DOWNLOAD_FAILED=0 download "https://raw.githubusercontent.com/rust-lang/rustup/${IRONFOX_RUSTUP_COMMIT}/rustup-init.sh" "${IRONFOX_DOWNLOADS}/rustup-init.sh" "${IRONFOX_RUSTUP_SHA512SUM}" || local IRONFOX_DOWNLOAD_FAILED=1 # If the download failed, restore our back-up, clean-up, and exit if [[ "${IRONFOX_DOWNLOAD_FAILED}" == 1 ]]; then echo_red_text 'ERROR: Download failed! Exiting...' restore_dir "${IRONFOX_CARGO_HOME}" restore_dir "${IRONFOX_RUSTUP_HOME}" "${IRONFOX_RM}" -rf "${IRONFOX_EXTERNAL}/temp" exit 1 elif [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_red_text 'Installing Rust...' /bin/bash -x "${IRONFOX_DOWNLOADS}/rustup-init.sh" -y --no-modify-path --no-update-default-toolchain --profile=minimal || local IRONFOX_CARGO_INSTALL_FAILED=1 # If the install failed, restore our back-ups, clean-up, and exit if [[ "${IRONFOX_CARGO_INSTALL_FAILED}" == 1 ]]; then echo_red_text 'ERROR: Installation failed! Exiting...' restore_dir "${IRONFOX_CARGO_HOME}" restore_dir "${IRONFOX_RUSTUP_HOME}" "${IRONFOX_RM}" -rf "${IRONFOX_EXTERNAL}/temp" exit 1 fi # Source the newly created Rust environment source "${IRONFOX_CARGO_ENV}" || local IRONFOX_CARGO_ENV_FAILED=1 # If we couldn't source our environment, restore our back-ups, clean-up, and exit if [[ "${IRONFOX_CARGO_ENV_FAILED}" == 1 ]]; then echo_red_text 'ERROR: Could not source environment! Exiting...' restore_dir "${IRONFOX_CARGO_HOME}" restore_dir "${IRONFOX_RUSTUP_HOME}" "${IRONFOX_RM}" -rf "${IRONFOX_EXTERNAL}/temp" exit 1 fi # Set-up Rust rustup set profile minimal rustup default "${IRONFOX_RUST_VERSION}" rustup override set "${IRONFOX_RUST_VERSION}" rustup target add aarch64-linux-android rustup target add armv7-linux-androideabi rustup target add thumbv7neon-linux-androideabi rustup target add x86_64-linux-android echo_green_text "SUCCESS: Set-up Rust at ${IRONFOX_CARGO_HOME}" fi fi } # Get s3cmd function get_s3cmd() { # If all we're doing is updating the checksum, we don't care if the environment is prepared if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" != 1 ]]; then if [[ ! -d "${IRONFOX_UV_DIR}" ]] || [[ ! -f "${IRONFOX_PYENV}" ]]; then echo_red_text "ERROR: You tried to download s3cmd, but you don't have a Python environment set-up yet." exit 1 fi if [[ -d "${IRONFOX_S3CMD}" ]]; then echo_red_text "s3cmd is already installed at ${IRONFOX_S3CMD}" read -p "Do you want to re-download it? [y/N] " -n 1 -r echo if [[ "${REPLY}" =~ ^[Nn]$ ]]; then return 0 else source "${IRONFOX_PYENV}" "${IRONFOX_UV}" pip uninstall s3cmd fi fi fi echo_red_text "Downloading s3cmd..." download_and_extract 's3cmd' "https://github.com/s3tools/s3cmd/archive/${IRONFOX_S3CMD_COMMIT}.tar.gz" "${IRONFOX_S3CMD_DIR}" "${IRONFOX_S3CMD_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then source "${IRONFOX_PYENV}" echo_red_text 'Installing s3cmd...' "${IRONFOX_UV}" pip install --no-editable --strict "${IRONFOX_S3CMD_DIR}" echo_green_text "SUCCESS: Set-up s3cmd at ${IRONFOX_S3CMD}" fi } # Get Tor's no-op UniFFi binding generator function get_uniffi() { # Get uniffi-bindgen for Linux if [[ "${IRONFOX_PLATFORM}" == 'linux' ]] || [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then echo_red_text 'Downloading prebuilt uniffi-bindgen (Linux)...' download_and_extract 'uniffi' "https://gitlab.com/ironfox-oss/prebuilds/-/raw/${IRONFOX_PREBUILDS_COMMIT}/uniffi-bindgen/${IRONFOX_UNIFFI_VERSION}/linux/uniffi-bindgen-${IRONFOX_UNIFFI_VERSION}-${IRONFOX_UNIFFI_IRONFOX_REVISION}-linux.tar.xz" "${IRONFOX_UNIFFI}" "${IRONFOX_UNIFFI_LINUX_IRONFOX_SHA512SUM}" fi # Get uniffi-bindgen for OS X if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]] || [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then echo_red_text 'Downloading prebuilt uniffi-bindgen (OS X)...' download_and_extract 'uniffi' "https://gitlab.com/ironfox-oss/prebuilds/-/raw/${IRONFOX_PREBUILDS_COMMIT}/uniffi-bindgen/${IRONFOX_UNIFFI_VERSION}/osx/uniffi-bindgen-${IRONFOX_UNIFFI_VERSION}-${IRONFOX_UNIFFI_IRONFOX_REVISION}-osx.tar.xz" "${IRONFOX_UNIFFI}" "${IRONFOX_UNIFFI_OSX_IRONFOX_SHA512SUM}" fi if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_green_text "SUCCESS: Set-up the prebuilt uniffi-bindgen at ${IRONFOX_UNIFFI}" fi } # Get UnifiedPush-AC function get_up_ac() { echo_red_text 'Downloading UnifiedPush-AC...' download_and_extract 'unifiedpush-ac' "https://gitlab.com/ironfox-oss/unifiedpush-ac/-/archive/${IRONFOX_UP_AC_COMMIT}/unifiedpush-ac-${IRONFOX_UP_AC_COMMIT}.tar.gz" "${IRONFOX_UP_AC}" "${IRONFOX_UP_AC_SHA512SUM}" if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_green_text "SUCCESS: Set-up UnifiedPush-AC at ${IRONFOX_UP_AC}" fi } # Get + set-up uv function get_uv() { # If all we're doing is updating the checksum, we don't care about existing installations if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" != 1 ]] && [[ -d "${IRONFOX_UV_DIR}" ]]; then echo_red_text "Found existing installation at ${IRONFOX_UV_DIR}" echo 'Continuing will remove this installation and related data' read -p "Do you still want to continue? [y/N] " -n 1 -r echo if [[ "${REPLY}" =~ ^[Yy]$ ]]; then # Back-up (in case something goes wrong - ex. checksum validation fails) and remove our directories backup_dir "${IRONFOX_UV_DIR}" backup_dir "${IRONFOX_UV_LOCAL}" else return 0 fi fi if [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then echo_red_text 'Downloading uv (Linux - ARM64)...' download "https://github.com/astral-sh/uv/releases/download/${IRONFOX_UV_VERSION}/uv-aarch64-unknown-linux-gnu.tar.gz" "${IRONFOX_UV_DIR}" "${IRONFOX_UV_SHA512SUM_LINUX_ARM64}" echo_red_text 'Downloading uv (Linux - x86_64)...' download "https://github.com/astral-sh/uv/releases/download/${IRONFOX_UV_VERSION}/uv-x86_64-unknown-linux-gnu.tar.gz" "${IRONFOX_UV_DIR}" "${IRONFOX_UV_SHA512SUM_LINUX_X86_64}" echo_red_text 'Downloading uv (OS X - ARM64)...' download "https://github.com/astral-sh/uv/releases/download/${IRONFOX_UV_VERSION}/uv-aarch64-apple-darwin.tar.gz" "${IRONFOX_UV_DIR}" "${IRONFOX_UV_SHA512SUM_OSX_ARM64}" echo_red_text 'Downloading uv (OS X - x86_64)...' download "https://github.com/astral-sh/uv/releases/download/${IRONFOX_UV_VERSION}/uv-x86_64-apple-darwin.tar.gz" "${IRONFOX_UV_DIR}" "${IRONFOX_UV_SHA512SUM_OSX_X86_64}" else # Set our platform if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_UV_PLATFORM='apple-darwin' else local -r IRONFOX_UV_PLATFORM='unknown-linux-gnu' fi # Set our platform architecture if [[ "${IRONFOX_PLATFORM_ARCH}" == 'aarch64' ]]; then local -r IRONFOX_UV_ARCH='aarch64' else local -r IRONFOX_UV_ARCH='x86_64' fi # Set our checksum to verify if [[ "${IRONFOX_PLATFORM_ARCH}" == 'aarch64' ]]; then if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_UV_SHA512SUM="${IRONFOX_UV_SHA512SUM_OSX_ARM64}" else local -r IRONFOX_UV_SHA512SUM="${IRONFOX_UV_SHA512SUM_LINUX_ARM64}" fi else if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]]; then local -r IRONFOX_UV_SHA512SUM="${IRONFOX_UV_SHA512SUM_OSX_X86_64}" else local -r IRONFOX_UV_SHA512SUM="${IRONFOX_UV_SHA512SUM_LINUX_X86_64}" fi fi # Tell `download` to return instead of exit upon an error IRONFOX_DOWNLOAD_EXIT=0 # By default, we know the download hasn't failed... local IRONFOX_DOWNLOAD_FAILED=0 echo_red_text 'Downloading uv...' download_and_extract 'uv' "https://github.com/astral-sh/uv/releases/download/${IRONFOX_UV_VERSION}/uv-${IRONFOX_UV_ARCH}-${IRONFOX_UV_PLATFORM}.tar.gz" "${IRONFOX_UV_DIR}" "${IRONFOX_UV_SHA512SUM}" || local IRONFOX_DOWNLOAD_FAILED=1 # If the download failed, restore our back-up, clean-up, and exit if [[ "${IRONFOX_DOWNLOAD_FAILED}" == 1 ]]; then echo_red_text 'ERROR: Download failed! Exiting...' restore_dir "${IRONFOX_UV_DIR}" restore_dir "${IRONFOX_UV_LOCAL}" "${IRONFOX_RM}" -rf "${IRONFOX_EXTERNAL}/temp" exit 1 elif [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_green_text "SUCCESS: Set-up uv at ${IRONFOX_UV}" fi fi } # Get WebAssembly SDK function get_wasi() { # Get WASI SDK for Linux if [[ "${IRONFOX_PLATFORM}" == 'linux' ]] || [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then echo_red_text 'Downloading prebuilt WASI SDK (Linux)...' download_and_extract 'wasi-sdk' "https://gitlab.com/ironfox-oss/prebuilds/-/raw/${IRONFOX_PREBUILDS_COMMIT}/wasi-sdk/${IRONFOX_WASI_VERSION}/linux/wasi-sdk-${IRONFOX_WASI_VERSION}-${IRONFOX_WASI_IRONFOX_REVISION}-linux.tar.xz" "${IRONFOX_WASI}" "${IRONFOX_WASI_LINUX_IRONFOX_SHA512SUM}" fi # Get WASI SDK for OS X if [[ "${IRONFOX_PLATFORM}" == 'darwin' ]] || [[ "${IRONFOX_GET_SOURCE_CHECKSUM_UPDATE}" == 1 ]]; then echo_red_text 'Downloading prebuilt WASI SDK (OS X)...' download_and_extract 'wasi-sdk' "https://gitlab.com/ironfox-oss/prebuilds/-/raw/${IRONFOX_PREBUILDS_COMMIT}/wasi-sdk/${IRONFOX_WASI_VERSION}/osx/wasi-sdk-${IRONFOX_WASI_VERSION}-${IRONFOX_WASI_IRONFOX_REVISION}-osx.tar.xz" "${IRONFOX_WASI}" "${IRONFOX_WASI_OSX_IRONFOX_SHA512SUM}" fi if [[ "${IRONFOX_PERFORM_POST_DOWNLOAD}" == 1 ]]; then echo_green_text "SUCCESS: Set-up the prebuilt WASI SDK at ${IRONFOX_WASI}" fi } # Clean-up "${IRONFOX_RM}" -rf "${IRONFOX_DOWNLOADS}" "${IRONFOX_RM}" -rf "${IRONFOX_EXTERNAL}/temp" # These need to run before we get androguard, glean_parser, gyp, PyYAML, and s3cmd if [[ "${IRONFOX_GET_SOURCE_UV}" == 1 ]]; then get_uv fi if [[ "${IRONFOX_GET_SOURCE_PYTHON}" == 1 ]]; then get_python fi if [[ "${IRONFOX_GET_SOURCE_ANDROGUARD}" == 1 ]]; then get_androguard fi if [[ "${IRONFOX_GET_SOURCE_ANDROID_NDK}" == 1 ]]; then get_android_ndk fi # This needs to run before we get the Android SDK if [[ "${IRONFOX_GET_SOURCE_JDK_25}" == 1 ]]; then get_jdk_25 fi if [[ "${IRONFOX_GET_SOURCE_ANDROID_SDK}" == 1 ]]; then get_android_sdk fi if [[ "${IRONFOX_GET_SOURCE_ANDROID_SDK_BUILD_TOOLS}" == 1 ]]; then get_android_sdk_build_tools fi if [[ "${IRONFOX_GET_SOURCE_ANDROID_SDK_BUILD_TOOLS_35}" == 1 ]]; then get_android_sdk_build_tools_35 fi if [[ "${IRONFOX_GET_SOURCE_ANDROID_SDK_PLATFORM}" == 1 ]]; then get_android_sdk_platform fi if [[ "${IRONFOX_GET_SOURCE_ANDROID_SDK_PLATFORM_36}" == 1 ]]; then get_android_sdk_platform_36 fi if [[ "${IRONFOX_GET_SOURCE_ANDROID_SDK_PLATFORM_TOOLS}" == 1 ]]; then get_android_sdk_platform_tools fi if [[ "${IRONFOX_GET_SOURCE_AS}" == 1 ]]; then get_as fi # This needs to run before we get cbindgen if [[ "${IRONFOX_GET_SOURCE_RUST}" == 1 ]]; then get_rust fi if [[ "${IRONFOX_GET_SOURCE_CBINDGEN}" == 1 ]]; then get_cbindgen fi if [[ "${IRONFOX_GET_SOURCE_BUNDLETOOL}" == 1 ]]; then get_bundletool fi if [[ "${IRONFOX_GET_SOURCE_GECKO}" == 1 ]]; then get_firefox fi if [[ "${IRONFOX_GET_SOURCE_GECKO_L10N}" == 1 ]]; then get_firefox_l10n fi if [[ "${IRONFOX_GET_SOURCE_GLEAN}" == 1 ]]; then get_glean fi if [[ "${IRONFOX_GET_SOURCE_JDK_17}" == 1 ]]; then get_jdk_17 fi if [[ "${IRONFOX_GET_SOURCE_JDK_21}" == 1 ]]; then get_jdk_21 fi # This needs to be run before we get glean_parser if [[ "${IRONFOX_GET_SOURCE_PIP}" == 1 ]]; then get_pip fi if [[ "${IRONFOX_GET_SOURCE_GLEAN_PARSER}" == 1 ]]; then get_glean_parser fi if [[ "${IRONFOX_GET_SOURCE_GRADLE}" == 1 ]]; then get_gradle fi if [[ "${IRONFOX_GET_SOURCE_GYP}" == 1 ]]; then get_gyp fi if [[ "${IRONFOX_GET_SOURCE_MICROG}" == 1 ]]; then get_microg fi if [[ "${IRONFOX_GET_SOURCE_NODE}" == 1 ]]; then get_node fi if [[ "${IRONFOX_GET_SOURCE_NPM}" == 1 ]]; then get_npm fi if [[ "${IRONFOX_GET_SOURCE_PHOENIX}" == 1 ]]; then get_phoenix fi if [[ "${IRONFOX_GET_SOURCE_PREBUILDS}" == 1 ]]; then get_prebuilds fi if [[ "${IRONFOX_GET_SOURCE_PYYAML}" == 1 ]]; then get_pyyaml fi if [[ "${IRONFOX_GET_SOURCE_S3CMD}" == 1 ]]; then get_s3cmd fi if [[ "${IRONFOX_GET_SOURCE_UNIFFI}" == 1 ]]; then get_uniffi fi if [[ "${IRONFOX_GET_SOURCE_UP_AC}" == 1 ]]; then get_up_ac fi if [[ "${IRONFOX_GET_SOURCE_WASI}" == 1 ]]; then get_wasi fi