mirror of
https://github.com/qTox/qTox.git
synced 2024-03-22 14:00:36 +08:00
8abe8320d2
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
412 lines
12 KiB
Bash
Executable File
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
|