setup-php/src/scripts/darwin.sh

306 lines
10 KiB
Bash
Raw Normal View History

2020-05-27 17:53:52 +07:00
# Function to setup environment for self-hosted runners.
2020-11-08 14:36:21 +07:00
self_hosted_helper() {
if ! command -v brew >/dev/null; then
2020-07-26 17:18:19 +07:00
step_log "Setup Brew"
2020-11-11 03:53:45 +07:00
get -q -e "/tmp/install.sh" "https://raw.githubusercontent.com/Homebrew/install/master/install.sh" && /tmp/install.sh >/dev/null 2>&1
2020-11-08 14:36:21 +07:00
add_log "${tick:?}" "Brew" "Installed Homebrew"
2020-05-27 17:53:52 +07:00
fi
}
# Disable dependency extensions
disable_dependency_extensions() {
local extension=$1
formula_file="$tap_dir/$ext_tap/Formula/$extension@${version:?}.rb"
if [ -e "$formula_file" ]; then
IFS=" " read -r -a dependency_extensions <<< "$(grep -Eo "shivammathur.*@" "$formula_file" | xargs -I {} -n 1 basename '{}' | cut -d '@' -f 1 | tr '\n' ' ')"
for dependency_extension in "${dependency_extensions[@]}"; do
sudo sed -Ei '' "/=(.*\/)?\"?$dependency_extension(.so)?$/d" "${ini_file:?}"
done
fi
}
# Helper function to disable an extension.
disable_extension_helper() {
local extension=$1
local disable_dependents=${2:-false}
get_extension_map
if [ "$disable_dependents" = "true" ]; then
disable_extension_dependents "$extension"
fi
sudo sed -Ei '' "/=(.*\/)?\"?$extension(.so)?$/d" "${ini_file:?}"
2022-03-06 13:08:28 +07:00
sudo rm -rf "$scan_dir"/*"$extension"* /tmp/php"$version"_extensions
mkdir -p /tmp/extdisabled/"$version"
echo '' | sudo tee /tmp/extdisabled/"$version"/"$extension" >/dev/null 2>&1
2020-01-30 13:33:30 +07:00
}
2021-05-27 22:15:47 +07:00
# Function to fetch a brew tap.
fetch_brew_tap() {
tap=$1
tap_user=$(dirname "$tap")
tap_name=$(basename "$tap")
mkdir -p "$tap_dir/$tap_user"
get -s -n "" "https://github.com/$tap/archive/master.tar.gz" | sudo tar -xzf - -C "$tap_dir/$tap_user"
if [ -d "$tap_dir/$tap_user/$tap_name-master" ]; then
sudo mv "$tap_dir/$tap_user/$tap_name-master" "$tap_dir/$tap_user/$tap_name"
fi
}
2020-11-26 00:16:59 +07:00
# Function to add a brew tap.
add_brew_tap() {
tap=$1
if ! [ -d "$tap_dir/$tap" ]; then
if [ "${runner:?}" = "self-hosted" ]; then
brew tap "$tap" >/dev/null 2>&1
else
fetch_brew_tap "$tap" >/dev/null 2>&1
if ! [ -d "$tap_dir/$tap" ]; then
brew tap "$tap" >/dev/null 2>&1
fi
2020-12-14 18:12:15 +07:00
fi
2020-11-26 00:16:59 +07:00
fi
}
# Function to get extension name from brew formula.
get_extension_from_formula() {
local formula=$1
local extension
extension=$(grep "$formula=" "$src"/configs/brew_extensions | cut -d '=' -f 2)
[[ -z "$extension" ]] && extension="$(echo "$formula" | sed -E "s/pecl_|[0-9]//g")"
echo "$extension"
}
# Function to copy extension binaries to the extension directory.
copy_brew_extensions() {
local formula=$1
formula_file="$tap_dir/$ext_tap/Formula/$formula@$version.rb"
deps="$(grep -Eo 'depends_on "shivammathur[^"]+' "$formula_file" | cut -d '/' -f 3 | tr '\n' ' ')"
IFS=' ' read -r -a deps <<< "$formula@$version $deps"
for dependency in "${deps[@]}"; do
extension_file="$brew_prefix/opt/$dependency/$(get_extension_from_formula "${dependency%@*}").so"
[ -e "$extension_file" ] && sudo cp "$extension_file" "$ext_dir"
done
}
2020-06-19 05:39:13 +07:00
# Function to install a php extension from shivammathur/extensions tap.
add_brew_extension() {
2020-12-24 19:50:42 +07:00
formula=$1
2020-11-08 14:36:21 +07:00
prefix=$2
extension="$(get_extension_from_formula "$formula")"
2020-11-08 14:36:21 +07:00
enable_extension "$extension" "$prefix"
if check_extension "$extension"; then
add_log "${tick:?}" "$extension" "Enabled"
else
add_brew_tap "$php_tap"
add_brew_tap "$ext_tap"
sudo mv "$tap_dir"/"$ext_tap"/.github/deps/"$formula"/* "$core_repo/Formula/" 2>/dev/null || true
update_dependencies >/dev/null 2>&1
disable_dependency_extensions "$extension" >/dev/null 2>&1
brew install -f "$ext_tap/$formula@$version" >/dev/null 2>&1
copy_brew_extensions "$formula"
2020-11-08 14:36:21 +07:00
add_extension_log "$extension" "Installed and enabled"
2020-06-19 05:39:13 +07:00
fi
}
2022-01-13 08:03:07 +07:00
# Helper function to add an extension.
add_extension_helper() {
2021-09-19 17:03:45 +07:00
local extension=$1
2020-11-08 14:36:21 +07:00
prefix=$2
2022-01-13 08:03:07 +07:00
if [[ "$version" =~ ${old_versions:?} ]] && [ "$extension" = "imagick" ]; then
run_script "php5-darwin" "${version/./}" "$extension" >/dev/null 2>&1
2020-02-23 11:14:33 +07:00
else
2022-01-13 08:03:07 +07:00
pecl_install "$extension" >/dev/null 2>&1 &&
if [[ "$version" =~ ${old_versions:?} ]]; then echo "$prefix=$ext_dir/$extension.so" >>"$ini_file"; fi
fi
2022-01-13 08:03:07 +07:00
add_extension_log "$extension" "Installed and enabled"
2019-12-27 08:26:49 +07:00
}
2020-09-28 12:28:02 +07:00
# Function to handle request to add phpize and php-config.
add_devtools() {
tool=$1
2020-11-08 14:36:21 +07:00
add_log "${tick:?}" "$tool" "Added $tool $semver"
2020-01-30 13:33:30 +07:00
}
2020-05-27 17:53:52 +07:00
# Function to handle request to add PECL.
2019-12-27 08:26:49 +07:00
add_pecl() {
2022-01-13 06:52:02 +07:00
enable_extension xml extension >/dev/null 2>&1
configure_pecl >/dev/null 2>&1
pear_version=$(get_tool_version "pecl" "version")
add_log "${tick:?}" "PECL" "Found PECL $pear_version"
2019-12-27 08:26:49 +07:00
}
2021-05-27 22:15:47 +07:00
# Function to link all libraries of a formula.
link_libraries() {
formula=$1
formula_prefix="$(brew --prefix "$formula")"
sudo mkdir -p "$formula_prefix"/lib
2021-03-08 20:43:00 +07:00
for lib in "$formula_prefix"/lib/*.dylib; do
lib_name=$(basename "$lib")
sudo cp -a "$lib" "$brew_prefix/lib/$lib_name" 2>/dev/null || true
2021-03-08 20:43:00 +07:00
done
}
2021-05-27 22:15:47 +07:00
# Patch brew to overwrite packages.
patch_brew() {
2021-05-27 23:30:47 +07:00
formula_installer="$brew_repo"/Library/Homebrew/formula_installer.rb
2022-04-09 20:44:52 +07:00
code=" keg.link\(verbose: verbose\?"
sudo sed -Ei '' "s/$code.*/$code, overwrite: true\)/" "$formula_installer"
# shellcheck disable=SC2064
2022-04-09 20:44:52 +07:00
trap "sudo sed -Ei '' 's/$code.*/$code, overwrite: overwrite?\)/' $formula_installer" exit
}
2021-05-27 22:15:47 +07:00
# Helper function to update the dependencies.
update_dependencies_helper() {
dependency=$1
get -q -n "$core_repo/Formula/$dependency.rb" "https://raw.githubusercontent.com/Homebrew/homebrew-core/master/Formula/$dependency.rb"
link_libraries "$dependency"
}
# Function to update dependencies.
update_dependencies() {
2022-04-09 23:16:00 +07:00
patch_brew
if ! [ -e /tmp/update_dependencies ]; then
if [ "${runner:?}" != "self-hosted" ] && [ "${ImageOS:-}" != "" ] && [ "${ImageVersion:-}" != "" ]; then
while read -r dependency; do
update_dependencies_helper "$dependency" &
to_wait+=($!)
done <"$tap_dir/$php_tap/.github/deps/${ImageOS:?}_${ImageVersion:?}"
wait "${to_wait[@]}"
else
git -C "$core_repo" fetch origin master && git -C "$core_repo" reset --hard origin/master
fi
echo '' | sudo tee /tmp/update_dependencies >/dev/null 2>&1
fi
}
2021-05-27 22:15:47 +07:00
# Function to fix dependencies on install PHP version.
fix_dependencies() {
broken_deps_paths=$(php -v 2>&1 | grep -Eo '/opt/[a-zA-Z0-9@\.]+')
if [ "x$broken_deps_paths" != "x" ]; then
update_dependencies
IFS=" " read -r -a formulae <<< "$(echo "$broken_deps_paths" | tr '\n' ' ' | sed 's|/opt/||g' 2>&1)$php_formula"
brew reinstall "${formulae[@]}"
brew link --force --overwrite "$php_formula" || true
fi
}
# Function to get PHP version if it is already installed using Homebrew.
get_brewed_php() {
php_cellar="$brew_prefix"/Cellar/php
if [ -d "$php_cellar" ] && ! [[ "$(find "$php_cellar" -maxdepth 1 -name "$version*" | wc -l 2>/dev/null)" -eq 0 ]]; then
2022-01-18 10:14:46 +07:00
php_semver | cut -c 1-3
else
echo 'false';
fi
}
2020-11-08 14:36:21 +07:00
# Function to setup PHP 5.6 and newer using Homebrew.
add_php() {
2020-02-21 09:28:19 +07:00
action=$1
existing_version=$2
add_brew_tap "$php_tap"
update_dependencies
if [ "$existing_version" != "false" ]; then
([ "$action" = "upgrade" ] && brew upgrade -f "$php_formula") || brew unlink "$php_formula"
else
brew install -f "$php_formula"
fi
brew link --force --overwrite "$php_formula"
2020-02-21 09:28:19 +07:00
}
2021-07-12 18:30:40 +07:00
# Function to get extra version.
php_extra_version() {
php_formula_file="$tap_dir"/"$php_tap"/Formula/php@"$version".rb
if [ -e "$php_formula_file" ] && ! grep -q "deprecate!" "$php_formula_file" && grep -Eq "archive/[0-9a-zA-Z]+" "$php_formula_file"; then
2021-09-19 04:08:31 +07:00
echo " ($(grep -Eo "archive/[0-9a-zA-Z]+" "$php_formula_file" | cut -d'/' -f 2))"
2021-07-12 18:30:40 +07:00
fi
}
2022-01-25 15:13:49 +07:00
# Function to set php.ini
add_php_config() {
if ! [ -e "$ini_dir"/php.ini-development ]; then
sudo cp "$ini_dir"/php.ini "$ini_dir"/php.ini-development
fi
if [[ "$ini" = "production" || "$ini" = "development" ]]; then
sudo cp "$ini_dir"/php.ini-"$ini" "$ini_dir"/php.ini
elif [ "$ini" = "none" ]; then
echo '' | sudo tee "${ini_file[@]}" >/dev/null 2>&1
fi
}
# Function to get scan directory.
get_scan_dir() {
if [[ "$version" =~ ${old_versions:?} ]]; then
php --ini | grep additional | sed -e "s|.*: s*||"
else
echo "$ini_dir"/conf.d
fi
}
2021-05-27 22:15:47 +07:00
# Function to Setup PHP.
2020-11-08 14:36:21 +07:00
setup_php() {
step_log "Setup PHP"
2022-01-18 10:14:46 +07:00
php_config="$(command -v php-config 2>/dev/null)"
existing_version=$(get_brewed_php)
2020-11-08 14:36:21 +07:00
if [[ "$version" =~ ${old_versions:?} ]]; then
2020-11-11 03:53:45 +07:00
run_script "php5-darwin" "${version/./}" >/dev/null 2>&1
2020-11-08 14:36:21 +07:00
status="Installed"
elif [ "$existing_version" != "$version" ]; then
add_php "install" "$existing_version" >/dev/null 2>&1
2020-11-08 14:36:21 +07:00
status="Installed"
elif [ "$existing_version" = "$version" ] && [ "${update:?}" = "true" ]; then
add_php "upgrade" "$existing_version" >/dev/null 2>&1
2020-11-08 14:36:21 +07:00
status="Updated to"
else
status="Found"
fix_dependencies >/dev/null 2>&1
2020-11-08 14:36:21 +07:00
fi
2022-01-16 13:33:31 +07:00
php_config="$(command -v php-config)"
ext_dir="$(grep 'extension_dir=' "$php_config" | cut -d "'" -f 2)"
2022-01-18 10:14:46 +07:00
ini_dir="$(php_ini_path)"
scan_dir="$(get_scan_dir)"
2022-01-16 13:33:31 +07:00
ini_file="$ini_dir"/php.ini
2020-11-08 14:36:21 +07:00
sudo mkdir -m 777 -p "$ext_dir" "$HOME/.composer"
2022-01-16 13:33:31 +07:00
sudo chmod 777 "$ini_file" "${tool_path_dir:?}"
2022-01-18 10:14:46 +07:00
semver="$(php_semver)"
extra_version="$(php_extra_version)"
2022-01-16 13:33:31 +07:00
configure_php
set_output "php-version" "$semver"
if [ "${semver%.*}" != "$version" ]; then
add_log "${cross:?}" "PHP" "Could not setup PHP $version"
2020-12-17 05:50:39 +07:00
exit 1
fi
2021-07-12 18:30:40 +07:00
2022-01-29 13:44:42 +07:00
sudo cp "$src"/configs/pm/*.json "$RUNNER_TOOL_CACHE/"
2021-07-12 18:30:40 +07:00
add_log "$tick" "PHP" "$status PHP $semver$extra_version"
2020-11-08 14:36:21 +07:00
}
# Variables
2022-01-25 15:13:49 +07:00
version=${1:-'8.1'}
ini=${2:-'production'}
2022-01-29 13:44:42 +07:00
src=${0%/*}/..
php_formula=shivammathur/php/php@"$version"
2022-01-18 10:14:46 +07:00
brew_path="$(command -v brew)"
brew_path_dir="$(dirname "$brew_path")"
brew_prefix="$brew_path_dir"/..
brew_repo="$brew_path_dir/$(dirname "$(readlink "$brew_path")")"/..
2020-12-25 23:29:40 +07:00
tap_dir="$brew_repo"/Library/Taps
core_repo="$tap_dir"/homebrew/homebrew-core
2022-01-29 13:44:42 +07:00
scripts="$src"/scripts
ext_tap=shivammathur/homebrew-extensions
php_tap=shivammathur/homebrew-php
2020-12-25 23:29:40 +07:00
export HOMEBREW_CHANGE_ARCH_TO_ARM=1
2021-08-15 11:59:12 +07:00
export HOMEBREW_DEVELOPER=1
2020-11-08 14:36:21 +07:00
export HOMEBREW_NO_AUTO_UPDATE=1
2022-01-16 14:13:52 +07:00
export HOMEBREW_NO_ENV_HINTS=1
export HOMEBREW_NO_INSTALL_CLEANUP=1
export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1
2020-11-08 14:36:21 +07:00
# shellcheck source=.
2022-01-02 19:20:00 +07:00
. "${scripts:?}"/unix.sh
. "${scripts:?}"/tools/add_tools.sh
. "${scripts:?}"/extensions/source.sh
. "${scripts:?}"/extensions/add_extensions.sh
2020-05-27 17:53:52 +07:00
read_env
2020-11-08 14:36:21 +07:00
self_hosted_setup
setup_php