diff --git a/.gitignore b/.gitignore index 6955ad75bf..ef53118a33 100644 --- a/.gitignore +++ b/.gitignore @@ -90,6 +90,11 @@ drupal/sites/default/project ## translation system locale/*/*.flag +## dependency builds and CI cache directories +3rdParty/linux/ +3rdParty/mac/ +3rdParty/buildCache/ + .libs/ svn_version.h diff --git a/.travis.yml b/.travis.yml index e50ef70d55..597fc8b4c2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,7 +21,7 @@ sudo: false cache: apt: true directories: - - build/wxWidgets-3.0.2 + - 3rdParty/buildCache addons: coverity_scan: @@ -80,5 +80,5 @@ script: - if [[ "${BOINC_TYPE}" == "server" ]]; then ( ./configure --disable-client --disable-manager && make ) fi - if [[ "${BOINC_TYPE}" == "client" ]]; then ( ./configure --disable-server --disable-manager && make ) fi - if [[ "${BOINC_TYPE}" == "apps" ]]; then ( ./configure --enable-apps --disable-server --disable-client --disable-manager && make ) fi -- if [[ "${BOINC_TYPE}" == "manager" ]]; then ( ./build/getWxWidgets.sh && ./configure --disable-server --disable-client --with-wxdir=./build/wxWidgets-3.0.2/buildgtk && make ) fi - if [[ "${BOINC_TYPE}" == "libs-mingw" ]]; then ( cd lib && CC=/usr/bin/x86_64-w64-mingw32-gcc; CXX=/usr/bin/x86_64-w64-mingw32-g++; make -f Makefile.mingw ) fi +- if [[ "${BOINC_TYPE}" == "manager" ]]; then ( ./3rdParty/buildLinuxDependencies.sh && ./configure --disable-server --disable-client --with-wxdir=./3rdParty/buildCache/linux && make ) fi diff --git a/3rdParty/README.md b/3rdParty/README.md new file mode 100644 index 0000000000..5182e86841 --- /dev/null +++ b/3rdParty/README.md @@ -0,0 +1,12 @@ +# Purpose of 3rdParty + +This directory is used to download and build dependencies for BOINC components. +Archives should be downloaded into a platform specific subdirectory (e.g linux, mac, ...) +to allow cross compilation of several platforms on a single host. + +Build products of dependencies should be installed into a corresponding subdirectory of +3rdParty/buildCache to allow CI systems to cache this data between BOINC builds. + +See the existing [buildLinuxDependencies.sh](buildLinuxDependencies.sh) and +[buildMacDependencies.sh](buildMacDependencies.sh) scripts for how this is done +on Linux and Mac currently. diff --git a/3rdParty/buildLinuxDependencies.sh b/3rdParty/buildLinuxDependencies.sh new file mode 100755 index 0000000000..b71bdcd43f --- /dev/null +++ b/3rdParty/buildLinuxDependencies.sh @@ -0,0 +1,123 @@ +#!/bin/bash + +# This file is part of BOINC. +# http://boinc.berkeley.edu +# Copyright (C) 2017 University of California +# +# BOINC is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation, +# either version 3 of the License, or (at your option) any later version. +# +# BOINC 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with BOINC. If not, see . +# + +## support script to build a specific wxWidgets version for linux +## This script checks if a cached version is available and builts one if not. +## The build is done in 3rdParty/linux and usable files are installed to 3rdParty/buildCache/linux +## in order to keep the cache as small as possible +## The 3rdParty/buildCache directory can be cached by CI systems for all subsequent builds + +# checks if a given path is canonical (absolute and does not contain relative links) +# from http://unix.stackexchange.com/a/256437 +isPathCanonical() { + case "x$1" in + (x*/..|x*/../*|x../*|x*/.|x*/./*|x./*) + rc=1 + ;; + (x/*) + rc=0 + ;; + (*) + rc=1 + ;; + esac + return $rc +} + +# check working directory because the script needs to be called like: ./3rdParty/buildLinuxDependencies.sh +if [ ! -d "3rdParty" ]; then + echo "start this script in the source root directory" + exit 1 +fi + +ROOTDIR=$(pwd) +cache_dir="" +doclean="" +wxoption="" +while [[ $# -gt 0 ]]; do + key="$1" + case $key in + --cache_dir) + cache_dir="$2" + shift + ;; + --clean) + doclean="yes" + ;; + --debug) + wxoption="--debug" + ;; + *) + echo "unrecognized option $key" + ;; + esac + shift # past argument or value +done + +if [ "x$cache_dir" != "x" ]; then + if isPathCanonical "$cache_dir" && [ "$cache_dir" != "/" ]; then + PREFIX="$cache_dir" + else + echo "cache_dir must be an absolute path without ./ or ../ in it" + exit 1 + fi +else + PREFIX="$(pwd)/3rdParty/buildCache/linux" +fi + +download_and_build() { + cd "${ROOTDIR}/3rdParty/linux" || exit 1 + DIRNAME="${1}" + FILENAME="${2}" + DLURL="${3}" + BUILDSCRIPT="${4}" + FLAGFILE="${PREFIX}/${DIRNAME}_done" + if [ -e "${FLAGFILE}" ]; then + echo "${DIRNAME} seems already to be present in ${PREFIX}" + return 0 + fi + if [ ! -d ${DIRNAME} ]; then + if [ ! -e ${FILENAME} ]; then + wget ${DLURL} + fi + tar -xf ${FILENAME} + fi + cd ${DIRNAME} || exit 1 + source ${BUILDSCRIPT} --prefix ${PREFIX} + if [ $? -ne 0 ]; then exit 1; fi + cd ../.. || exit 1 + touch ${FLAGFILE} +} + +mkdir -p 3rdParty/linux +mkdir -p ${PREFIX} +cd "${ROOTDIR}/3rdParty/linux" || exit 1 + +if [ "${doclean}" = "yes" ]; then + echo "cleaning cache" + rm -rf ${PREFIX} + mkdir -p ${PREFIX} +fi + +#download_and_build $DIRNAME $FILENAME $DOWNLOADURL $BUILDSCRIPT +download_and_build "wxWidgets-3.0.2" "wxWidgets-3.0.2.tar.bz2" "https://sourceforge.net/projects/wxwindows/files/3.0.2/wxWidgets-3.0.2.tar.bz2" "${ROOTDIR}/3rdParty/buildWxLinux.sh ${wxoption}" + +# change back to root directory +cd ${ROOTDIR} || exit 1 diff --git a/3rdParty/buildWxLinux.sh b/3rdParty/buildWxLinux.sh new file mode 100644 index 0000000000..68cabe5d36 --- /dev/null +++ b/3rdParty/buildWxLinux.sh @@ -0,0 +1,71 @@ +#!/bin/bash + +# This file is part of BOINC. +# http://boinc.berkeley.edu +# Copyright (C) 2017 University of California +# +# BOINC is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation, +# either version 3 of the License, or (at your option) any later version. +# +# BOINC 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with BOINC. If not, see . + +# Script to build a wxWidgets GTK version for BOINC + +# Usage: +# cd [path]/wxWidgets-3.0.2/ +# source path_to_this_script [--clean] [--debug] [--prefix PATH] +# +# the --clean argument will force a full rebuild. +# the --debug argument will build the debug version of the library +# if --prefix is given as absolute path the library is installed into there + + +doclean="" +configuration="Release" +while [[ $# -gt 0 ]]; do + key="$1" + case $key in + -clean|--clean) + doclean="yes" + ;; + -debug|--debug) + configuration="Debug" + ;; + -prefix|--prefix) + lprefix="$2" + shift + ;; + esac + shift # past argument or value +done + +debug_flag="--disable-debug_flag" +if [ $configuration = "Debug" ]; then + debug_flag="--enable-debug" +fi + +if [ "${doclean}" = "yes" ]; then + make clean +fi + +mkdir buildgtk +if [ $? -ne 0 ]; then exit 1; fi +cd buildgtk || return 1 + +../configure --prefix="${lprefix}" --with-gtk --disable-shared --enable-webview --disable-gtktest --disable-sdltest ${debug_flag} +if [ $? -ne 0 ]; then cd ..; return 1; fi +make 1>/dev/null # the wxWidgets build is very noisy so tune it down to warnings and errors only +if [ $? -ne 0 ]; then cd ..; return 1; fi +make install +if [ $? -ne 0 ]; then cd ..; return 1; fi + +cd .. +return 0 diff --git a/build/getWxWidgets.sh b/build/getWxWidgets.sh deleted file mode 100755 index 273a199b2c..0000000000 --- a/build/getWxWidgets.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -set -x - -## Travis-CI support script to built a specific wxWidgets version -## This script checks if a cached version is available and builts one if not. -## The directory is cached by Travis-CI for all subsequent runs of the VM - -# change to correct working directory because the script is called like: ./build/getWxWidgets.sh -cd ./build - -# if the versioning changes try to delete the old directory and change .travis.yml to cache the new directory -if [ ! -e "wxWidgets-3.0.2/build_complete" ]; then - wget https://sourceforge.net/projects/wxwindows/files/3.0.2/wxWidgets-3.0.2.tar.bz2 - tar -xf wxWidgets-3.0.2.tar.bz2 - cd wxWidgets-3.0.2 - mkdir buildgtk - cd buildgtk - ../configure --with-gtk --disable-shared --enable-webview --disable-gtktest --disable-sdltest - make - cd .. - touch build_complete - cd .. -fi - -# change back to root directory -cd ..