1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00
qTox/osx/qTox-Mac-Deployer-ULTIMATE.sh
Mick Sayson 8abe8320d2 chore(CI): Use docker for CI scripts
Motiviation:
* Reproducing issues in CI is currently difficult
* Predicting issues in CI is currently difficult if you are not on
  ubuntu 18.04
* Reproducing issues submitted from other distros is currently done by
  creating a VM of that distro and building qtox for it locally
* Documentation for how to build on different distros is out of date
* Issues on non-ubuntu distributions are not caught by CI
* Cross compiling for windows locally is not trivial
* Iterating when working with custom build scripts is slow, scripts
  don't necessarily support re-running without re-starting the docker
  container and re-building qtox again
* Updating dependencies is a pain

Changes:
* docker-compose file has been added to the root of our repo.
  After `docker compose run --rm ubuntu` (or other supported distros),
  you are ready to compile and run qtox
* Dependencies are owned by dependency install scripts in buildscripts/.
  This allows us to use the same exact dependencies in our
  OSX/windows/linux scripts
* New docker images have been added for a variety of distributions.
  These are now run in CI in a variety of configurations
  * Docker images are cached in CI so rebuild time for the majority of
    jobs is quite quick
* Build scripts have been trimmed to leverage state of docker
  containers.
  * Windows build script no longer installs anything, dependencies are
    now managed by the windows_builder docker images
  * Build scripts should now be easily re-runnable. Usage is now `docker
    compose run --rm <image>` and then run the scripts
* All artifacts are now uploaded to github after build, this means we
  can take an appimage/flatpak/exe/dmg for any given PR and try it out
  without having to build it ourselves

Notes:
* Docker image size is quite important. We have a maximum of 5GB cache
  space on github actions. The majority of the linux distro docker
  images cache at ~300-400MB, which gives us room to test ~6 distros
  after accounting for the sizes of flatpak/windows docker images
* Docker layer ordering is relatively intentional. Approximate order
  should be that large dependencies that change infrequently should be
  farther up. This lowers the amount of rebuilding we have to do when
  dependencies are updated
* download_xxx.sh scripts are the cleanest way I could find to implement
  a shared dependency map between osx scripts and docker containers.
  Although it would be nice to have a single dependency mapping file,
  splitting it into individual scripts allows us to only rebuild some
  docker layers when dependencies are updated.
* Github actions are split between docker image building and docker
  image use. This allows us to re-use the same docker images for
  multiple jobs, but only build it once
  * Unfortunately I could not find a way to de-duplicate the stitching
    between jobs, so we have a lot of copy pasta in that area
2021-12-19 14:56:05 -08:00

412 lines
12 KiB
Bash
Executable File

#!/usr/bin/env bash
# Copyright © 2015 by RowenStipe
# Copyright © 2016-2019 by The qTox Project Contributors
#
# This program is libre software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# This uses the same process as doing it manually but with a few varients
# Use: ./qTox-Mac-Deployer-ULTIMATE.sh -h
set -e
# Your home DIR really (Most of this happens in it) {DONT USE: ~ }
SUBGIT="" #Change this to define a 'sub' git folder e.g. "-Patch"
#Applies to $QTOX_DIR, $BUILD_DIR, and $DEPLOY_DIR folders for organization puropses
if [[ $TRAVIS = true ]]
then
MAIN_DIR="${TRAVIS_BUILD_DIR}"
QTOX_DIR="${MAIN_DIR}"
else
# the directory which qTox is cloned in, wherever that is
MAIN_DIR="$(dirname $(readlink -f $0))/../.."
QTOX_DIR="${MAIN_DIR}/qTox${SUBGIT}"
fi
QT_DIR="/usr/local/Cellar/qt5" # Folder name of QT install
# Figure out latest version
QT_VER=($(ls ${QT_DIR} | sed -n -e 's/^\([0-9]*\.([0-9]*\.([0-9]*\).*/\1/' -e '1p;$p'))
QT_DIR_VER="${QT_DIR}/${QT_VER[1]}"
SCRIPT_DIR=$( cd $(dirname $0); pwd -P)
TOXCORE_DIR="${MAIN_DIR}/toxcore" # Change to Git location
TOX_EXT_DIR="${MAIN_DIR}/toxext"
TOX_EXT_MESSAGES_DIR="${MAIN_DIR}/tox_extension_messages"
LIB_INSTALL_PREFIX="${QTOX_DIR}/libs"
[[ ! -e "${LIB_INSTALL_PREFIX}" ]] \
&& mkdir -p "${LIB_INSTALL_PREFIX}"
BUILD_DIR="${MAIN_DIR}/qTox-Mac_Build${SUBGIT}"
DEPLOY_DIR="${MAIN_DIR}/qTox-Mac_Deployed${SUBGIT}"
# helper function to "pretty-print"
fcho() {
local msg="$1"; shift
printf "\n$msg\n" "$@"
}
build_toxcore() {
echo "Starting Toxcore build and install"
cd $TOXCORE_DIR
echo "Now working in: ${PWD}"
local LS_DIR="/usr/local/Cellar/libsodium/"
#Figure out latest version
local LS_VER=($(ls ${LS_DIR} | sed -n -e 's/^\([0-9]*\.([0-9]*\.([0-9]*\).*/\1/' -e '1p;$p'))
local LS_DIR_VER="${LS_DIR}/${LS_VER[1]}"
[[ $TRAVIS != true ]] \
&& sleep 3
mkdir -p _build && cd _build
fcho "Starting cmake ..."
#Make sure the correct version of libsodium is used
cmake -DBOOTSTRAP_DAEMON=OFF -DLIBSODIUM_CFLAGS="-I${LS_DIR_VER}/include/" -DLIBSODIUM_LDFLAGS="L${LS_DIR_VER}/lib/" -DCMAKE_INSTALL_PREFIX="${LIB_INSTALL_PREFIX}" ..
make clean &> /dev/null
fcho "Compiling toxcore."
make > /dev/null || exit 1
fcho "Installing toxcore."
make install > /dev/null || exit 1
}
build_toxext() {
echo "Starting Toxext build and install"
cd $TOX_EXT_DIR
echo "Now working in: ${PWD}"
[[ $TRAVIS != true ]] \
&& sleep 3
mkdir _build && cd _build
fcho "Starting cmake ..."
PKG_CONFIG_PATH="${LIB_INSTALL_PREFIX}"/lib/pkgconfig cmake -DCMAKE_INSTALL_PREFIX="${LIB_INSTALL_PREFIX}" ..
make clean &> /dev/null
fcho "Compiling toxext."
make > /dev/null || exit 1
fcho "Installing toxext."
make install > /dev/null || exit 1
}
build_tox_extension_messages() {
echo "Starting tox_extension_messages build and install"
cd $TOX_EXT_MESSAGES_DIR
echo "Now working in: ${PWD}"
[[ $TRAVIS != true ]] \
&& sleep 3
mkdir _build && cd _build
fcho "Starting cmake ..."
PKG_CONFIG_PATH="${LIB_INSTALL_PREFIX}"/lib/pkgconfig cmake -DCMAKE_INSTALL_PREFIX="${LIB_INSTALL_PREFIX}" ..
make clean &> /dev/null
fcho "Compiling tox_extension_messages."
make > /dev/null || exit 1
fcho "Installing tox_extension_messages."
make install > /dev/null || exit 1
}
install() {
fcho "=============================="
fcho "This script will install the necessary applications and libraries needed to compile qTox properly."
fcho "Note that this is not a 100 percent automated install it just helps simplify the process for less experienced or lazy users."
if [[ $TRAVIS = true ]]
then
echo "Oh... It's just Travis...."
else
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
fi
# osx 10.13 High Sierra doesn't come with a /usr/local/sbin, yet it is needed by some brew packages
NEEDED_DEP_DIR="/usr/local/sbin"
if [[ $TRAVIS = true ]]
then
sudo mkdir -p $NEEDED_DEP_DIR
sudo chown -R $(whoami) $NEEDED_DEP_DIR
elif [[ ! -d $NEEDED_DEP_DIR ]]
then
fcho "The direcory $NEEDED_DEP_DIR must exist for some development packages."
read -r -p "Would you like to create it now, and set the owner to $(whoami)? [y/N] " response
if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
then
sudo mkdir $NEEDED_DEP_DIR
sudo chown -R $(whoami) $NEEDED_DEP_DIR
else
fcho "Cannot proceed without $NEEDED_DEP_DIR. Exiting."
exit 0
fi
fi
#fcho "Installing x-code Command line tools ..."
#xcode-select --install
if [[ -e /usr/local/bin/brew ]]
then
fcho "Homebrew already installed!"
else
fcho "Installing homebrew ..."
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
fi
if [[ $TRAVIS != true ]]
then
fcho "Updating brew formulas ..."
brew update
fi
fcho "Getting home brew formulas ..."
if [[ $TRAVIS != true ]]
then
brew bundle install -f ./osx/Brewfile
fi
fcho "Starting git repo checks ..."
#cd $MAIN_DIR # just in case
# Toxcore
rm -fr "${TOXCORE_DIR}"
mkdir -p "${TOXCORE_DIR}"
cd "${TOXCORE_DIR}"
"${SCRIPT_DIR}"/../buildscripts/download/download_toxcore.sh
rm -fr "${TOX_EXT_DIR}"
mkdir -p "${TOX_EXT_DIR}"
cd "${TOX_EXT_DIR}"
"${SCRIPT_DIR}"/../buildscripts/download/download_toxext.sh
rm -fr "${TOX_EXT_MESSAGES_DIR}"
mkdir -p "${TOX_EXT_MESSAGES_DIR}"
cd "${TOX_EXT_MESSAGES_DIR}"
"${SCRIPT_DIR}"/../buildscripts/download/download_toxext_messages.sh
# qTox
if [[ $TRAVIS = true ]]
then
fcho "Travis... You already have qTox..."
else
if [[ -e $QTOX_DIR/.git/index ]]
then
fcho "qTox git repo already in place !"
cd $QTOX_DIR
git pull
else
fcho "Cloning qTox git ... "
git clone https://github.com/qTox/qTox.git
fi
fi
if [[ $TRAVIS != true ]]
then
fcho "If all went well you should now have all the tools needed to compile qTox!"
fi
# toxcore build
if [[ $TRAVIS = true ]]
then
build_toxcore
else
read -r -p "Would you like to install toxcore now? [y/N] " response
if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
then
build_toxcore
else
fcho "You can simply use the -u command and say [Yes/n] when prompted"
fi
fi
# toxext build
if [[ $TRAVIS = true ]]
then
build_toxext
else
read -r -p "Would you like to install toxext now? [y/N] " response
if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
then
build_toxext
else
fcho "You can simply use the -u command and say [Yes/n] when prompted"
fi
fi
# tox_extension_messages build
if [[ $TRAVIS = true ]]
then
build_tox_extension_messages
else
read -r -p "Would you like to install tox_extension_messages now? [y/N] " response
if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
then
build_tox_extension_messages
else
fcho "You can simply use the -u command and say [Yes/n] when prompted"
fi
fi
QT_VER=($(ls ${QT_DIR} | sed -n -e 's/^\([0-9]*\.([0-9]*\.([0-9]*\).*/\1/' -e '1p;$p'))
QT_DIR_VER="${QT_DIR}/${QT_VER[1]}"
# put required by qTox libs/headers in `libs/`
cd "${QTOX_DIR}"
sudo ./bootstrap-osx.sh
}
update() {
fcho "------------------------------"
fcho "Starting update process ..."
#First update Toxcore from git
cd $TOXCORE_DIR
fcho "Now in ${PWD}"
fcho "Pulling ..."
# make sure that pull can be applied, i.e. clean up files from any
# changes that could have been applied to them
git checkout -f
git pull
read -r -p "Did Toxcore update from git? [y/N] " response
if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
then
build_toxcore
else
fcho "Moving on!"
fi
#Now let's update qTox!
cd $QTOX_DIR
fcho "Now in ${PWD}"
fcho "Pulling ..."
# make sure that pull can be applied, i.e. clean up files from any
# changes that could have been applied to them
git checkout -f
git pull
read -r -p "Did qTox update from git? [y/N] " response
if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
then
fcho "Starting OSX bootstrap ..."
sudo ./bootstrap-osx.sh
else
fcho "Moving on!"
fi
}
build() {
fcho "------------------------------"
fcho "Starting build process ..."
rm -rf $BUILD_DIR
rm -rf $DEPLOY_DIR
mkdir $BUILD_DIR
cd $BUILD_DIR
fcho "Now working in ${PWD}"
fcho "Starting cmake ..."
if [[ $TRAVIS = true ]]
then
STRICT_OPTIONS="ON"
else
STRICT_OPTIONS="OFF"
fi
cmake -H$QTOX_DIR -B. \
-DUPDATE_CHECK=ON \
-DSPELL_CHECK=OFF \
-DSTRICT_OPTIONS="${STRICT_OPTIONS}" \
-DCMAKE_PREFIX_PATH="$(brew --prefix qt5);${LIB_INSTALL_PREFIX}"
make -j$(sysctl -n hw.ncpu)
}
deploy() {
fcho "------------------------------"
fcho "starting deployment process ..."
cd $BUILD_DIR
if [ ! -d $BUILD_DIR ]
then
fcho "Error: Build directory not detected, please run -ubd, or -b before deploying"
exit 0
fi
mkdir $DEPLOY_DIR
make install
cp -r $BUILD_DIR/qTox.app $DEPLOY_DIR/qTox.app
}
bootstrap() {
fcho "------------------------------"
fcho "starting bootstrap process ..."
#Toxcore
build_toxcore
build_toxext
build_tox_extension_messages
#Boot Strap
fcho "Running: sudo ${QTOX_DIR}/bootstrap-osx.sh"
cd $QTOX_DIR
sudo ./bootstrap-osx.sh
}
dmgmake() {
fcho "------------------------------"
fcho "Starting DMG creation"
cp $BUILD_DIR/qTox.dmg $QTOX_DIR/
}
helpme() {
echo "This script was created to help ease the process of compiling and creating a distributable qTox package for OSX systems."
echo "The available commands are:"
echo "-h | --help -- This help text."
echo "-i | --install -- A slightly automated process for getting an OSX machine ready to build Toxcore and qTox."
echo "-u | --update -- Check for updates and build Toxcore from git & update qTox from git."
echo "-b | --build -- Builds qTox in: ${BUILD_DIR}"
echo "-d | --deploy -- Makes a distributable qTox.app file in: ${DEPLOY_DIR}"
echo "-bs | --bootstrap -- Performs bootstrap steps."
fcho "Issues with Toxcore or qTox should be reported to their respective repos: https://github.com/toktok/c-toxcore | https://github.com/qTox/qTox"
exit 0
}
case "$1" in
-h | --help)
helpme
exit
;;
-i | --install)
install
exit
;;
-u | --update)
update
exit
;;
-b | --build)
build
exit
;;
-d | --deploy)
deploy
exit
;;
-bs | --bootstrap)
bootstrap
exit
;;
-dmg)
dmgmake
exit
;;
*)
;;
esac
fcho "Oh dear! You seemed to of started this script improperly! Use -h to get available commands and information!"
echo " "
say -v Kathy -r 255 "Oh dear! You seemed to of started this script improperly! Use -h to get available commands and information!"
exit 0