JD2022-TU1/main/extern/SteamSDK/tools/linux/setup.sh

368 lines
8.7 KiB
Bash

#!/bin/bash
#
# This script runs a shell with the environment set up for the Steam runtime
# development environment.
# The top level of the cross-compiler tree
ORIG_PWD="${PWD}"
TOP=$(cd "${0%/*}" 2>/dev/null; echo "${PWD}")
cd "${TOP}"
CONFIG=.config
ARCHITECTURES="i386 amd64"
ARCHIVE_EXT="tar.xz"
RUNTIME_VERSION=latest
exit_usage()
{
echo "Usage: $0 [--host=<arch>] [--target=<arch>] [--debug|--release] [--version=<version>] [--depot=<url>] [--perforce] [--reset] [--auto-update] [--checkonly]" >&2
exit 1
}
function has_command()
{
command -v $1 >/dev/null
return $?
}
function detect_arch()
{
case $(uname -m) in
*64)
echo "amd64"
;;
*)
echo "i386"
;;
esac
}
function reset_sdk()
{
if [ "${AUTO_UPGRADE}" != "true" ]; then
echo "This will clean the SDK and redownload packages."
read -p "Are you sure you want to continue? [y/N]: " response
if [ "${response}" != "y" -a "${response}" != "Y" ]; then
exit 2
fi
fi
rm -rf checksums ${ARCHITECTURES} runtime*
echo "Reset complete."
echo
}
declare -a ARGS=("$@")
while [ "$1" ]; do
case "$1" in
--relaunch)
RELAUNCHED=true
;;
--host=*)
HOST_ARCH=$(expr "$1" : '[^=]*=\(.*\)')
;;
--target=*)
TARGET_ARCH=$(expr "$1" : '[^=]*=\(.*\)')
;;
--debug)
RUNTIME_FLAVOR="debug"
;;
--release)
RUNTIME_FLAVOR="release"
;;
--version=*)
RUNTIME_VERSION=$(expr "$1" : '[^=]*=\(.*\)')
;;
--depot=*)
URL_PREFIX=$(expr "$1" : '[^=]*=\(.*\)')
;;
--perforce)
USE_P4=true
;;
--reset)
if [ "${RELAUNCHED}" != "true" ]; then
reset_sdk
fi
;;
--auto-update|--auto-upgrade)
AUTO_UPGRADE=true
;;
--checkonly)
CHECK_ONLY=true
;;
-h|--help)
exit_usage
;;
-*)
echo "Unknown command line parameter: $1" >&2
exit_usage
;;
*)
break
;;
esac
shift
done
function check_curl()
{
if ! has_command curl; then
if has_command apt-get; then
echo "Installing curl to download packages..."
sudo apt-get install curl
echo
else
echo "Please install curl to download packages."
exit 2
fi
fi
}
# Make sure we have curl to download packages
check_curl
if [ -z "${HOST_ARCH}" ]; then
HOST_ARCH=$(grep HOST_ARCH ${CONFIG} 2>/dev/null | awk -F= '{print $2}')
if [ "${HOST_ARCH}" = "" ]; then
HOST_ARCH=$(detect_arch)
fi
fi
DEFAULT_TARGET=$(grep TARGET_ARCH ${CONFIG} 2>/dev/null | awk -F= '{print $2}')
if [ "${DEFAULT_TARGET}" = "" ]; then
# Most people are targeting i386 (for now!)
DEFAULT_TARGET=i386
fi
if [ -z "${TARGET_ARCH}" -a "${AUTO_UPGRADE}" = "true" ]; then
TARGET_ARCH="${DEFAULT_TARGET}"
fi
if [ -z "${TARGET_ARCH}" ]; then
cat <<__EOF__
======================================
Which architectures would you like to target?
1) i386 (x86 32-bit)
2) amd64 (x64 64-bit)
3) all supported architectures
__EOF__
read -p "Default ${DEFAULT_TARGET}: " response
case "${response}" in
1|i386)
TARGET_ARCH=i386
;;
2|amd64)
TARGET_ARCH=amd64
;;
3|all)
TARGET_ARCH="${ARCHITECTURES}"
;;
*)
TARGET_ARCH="${DEFAULT_TARGET}"
;;
esac
echo "Set target architecture to: ${TARGET_ARCH}"
echo
fi
DEFAULT_FLAVOR=$(grep RUNTIME_FLAVOR ${CONFIG} 2>/dev/null | awk -F= '{print $2}')
if [ "${DEFAULT_FLAVOR}" = "" ]; then
DEFAULT_FLAVOR=release
fi
if [ -z "${RUNTIME_FLAVOR}" -a "${AUTO_UPGRADE}" = "true" ]; then
RUNTIME_FLAVOR="${DEFAULT_FLAVOR}"
fi
if [ -z "${RUNTIME_FLAVOR}" ]; then
cat <<__EOF__
======================================
Which runtime flavor would you like to use?
1) release
2) debug
__EOF__
read -p "Default ${DEFAULT_FLAVOR}: " response
case "${response}" in
1) RUNTIME_FLAVOR=release;;
2) RUNTIME_FLAVOR=debug;;
*) RUNTIME_FLAVOR="${DEFAULT_FLAVOR}";;
esac
echo "Set runtime flavor to: ${RUNTIME_FLAVOR}"
echo
fi
if [ -z "${URL_PREFIX}" ]; then
URL_PREFIX="http://media.steampowered.com/client/runtime"
fi
# Make everything writable if we're using Perforce
if [ "${USE_P4}" = "true" ]; then
chmod -R +w .
fi
# Save our config
: >${CONFIG}
echo "HOST_ARCH=${HOST_ARCH}" >>${CONFIG}
echo "TARGET_ARCH=${TARGET_ARCH}" >>${CONFIG}
echo "RUNTIME_FLAVOR=${RUNTIME_FLAVOR}" >>${CONFIG}
UPDATED_FILES_RETURNCODE=42
function update_archive()
{
local NAME=$1
local DEST=$2
if [ -z "${NAME}" -o -z "${DEST}" ]; then
echo "Internal error: update_archive <name> <dest>" 2>&1
exit 255
fi
# Download the latest archive checksum and see if we already have it
local ARCHIVE="${NAME}_${RUNTIME_VERSION}.${ARCHIVE_EXT}"
local CHECKSUM_FILE="${ARCHIVE}.md5"
local CHECKSUM=$(curl -sf "${URL_PREFIX}/${CHECKSUM_FILE}")
if [ "${CHECKSUM}" = "" ]; then
# No updates available
return 0
fi
if [ -f "checksums/${CHECKSUM_FILE}" ] && \
[ "$(cat "checksums/${CHECKSUM_FILE}")" = "${CHECKSUM}" ]; then
# We're all done!
return 0
fi
if [ "$CHECK_ONLY" = "true" ]; then
echo "Update available: ${URL_PREFIX}/${ARCHIVE}"
return 1
fi
# Download and extract the archive
echo "Installing ${URL_PREFIX}/${ARCHIVE}..."
curl -#f "${URL_PREFIX}/${ARCHIVE}" | tar xJf - --strip-components=1 -C "${DEST}"
# Update the checksum
mkdir -p checksums
rm -f checksums/${NAME}_*
echo "${CHECKSUM}" >"checksums/${CHECKSUM_FILE}"
# All done!
return ${UPDATED_FILES_RETURNCODE}
}
function fold_case()
{
echo "Removing files with the same case..."
find . \( -type f -o -type l \) | sort -f | uniq -i -d | while read file; do
find "$(dirname "$file")" -iname "$(basename "$file")" | while read other; do
if [ "$other" != "$file" ]; then
rm -v "$other"
fi
done
done
}
function p4reconcile()
{
P4LOG=/tmp/p4.log
fold_case
p4 reconcile -f ... >"${P4LOG}"
echo "Perforce log is in ${P4LOG}"
}
# Update SDK files and restart if necessary
if [ "${RELAUNCHED}" = "true" ]; then
response=n
elif [ "${AUTO_UPGRADE}" = "true" ]; then
response=y
else
echo "======================================"
read -p "Update base SDK? [Y/n]: " response
fi
if [ "${response}" != "n" ]; then
update_archive steam-runtime-sdk .
case $? in
0)
if [ "${AUTO_UPGRADE}" != "true" ]; then
echo "No updates available."
fi
;;
${UPDATED_FILES_RETURNCODE})
echo
cd "${ORIG_PWD}"
exec "$0" --relaunch --host="${HOST_ARCH}" --target="${TARGET_ARCH}" --${RUNTIME_FLAVOR} "${ARGS[@]}"
;;
esac
echo
fi
# Update tools
if [ "${AUTO_UPGRADE}" = "true" ]; then
response=y
else
echo "======================================"
read -p "Update tools? [Y/n]: " response
fi
if [ "${response}" != "n" ]; then
AVAILABLE_UPDATES=false
for host_arch in ${HOST_ARCH}; do
for target_arch in ${TARGET_ARCH}; do
update_archive x-tools-${host_arch}-${target_arch} .
case $? in
0)
;;
*)
AVAILABLE_UPDATES=true
;;
esac
done
done
if [ "${AVAILABLE_UPDATES}" != "true" -a "${AUTO_UPGRADE}" != "true" ]; then
echo "No updates available."
fi
echo
fi
# Update runtime
if [ "${AUTO_UPGRADE}" = "true" ]; then
response=y
else
echo "======================================"
read -p "Update runtime? [Y/n]: " response
fi
if [ "${response}" != "n" ]; then
AVAILABLE_UPDATES=false
for target_arch in ${TARGET_ARCH}; do
mkdir -p runtime-${RUNTIME_FLAVOR}
update_archive steam-runtime-dev-${RUNTIME_FLAVOR}-${target_arch} runtime-${RUNTIME_FLAVOR}
case $? in
0)
;;
*)
AVAILABLE_UPDATES=true
;;
esac
done
if [ "${AVAILABLE_UPDATES}" != "true" -a "${AUTO_UPGRADE}" != "true" ]; then
echo "No updates available."
fi
echo
fi
rm -f runtime || exit 16
ln -s runtime-${RUNTIME_FLAVOR} runtime
# Set up symbolic link to automatically find source when debugging
if [ "${RUNTIME_FLAVOR}" = "debug" ]; then
rm -f /tmp/source && \
ln -sf "${TOP}/runtime-${RUNTIME_FLAVOR}/source" /tmp/source
fi
if [ "${USE_P4}" = "true" ]; then
echo "======================================"
echo "Creating Perforce changelist..."
p4reconcile
echo
fi
echo "======================================"
echo "Update complete!"
# vi: ts=4 sw=4 expandtab