#!/bin/bash

if [ ! -f VERSION ]; then
  echo "ERROR: must be executed from top directory"
  exit 1
fi

version=`cat VERSION`
pdf_build_dir=build.pdf
PUBLIC="ec:/home/swipl/web/download/devel"

build_pdf()
{ rm -rf build.pdf
  mkdir build.pdf
  ( cd build.pdf
    cmake -DBUILD_PDF_DOCUMENTATION=ON -G Ninja ..
    ninja
  )
}

# Build the Windows version using the Docker from
# https://github.com/SWI-Prolog/docker-swipl-build-mingw.git
#
# Comment to build locally. See README.win32   for the setup. Be warned,
# this is complicated! Disabled profile   guide optimization for Windows
# as it is broken in recent   Ubuntu  releases. Linking the instrumented
# binary fails due to a missing  symbols   in  libgcov.a.  The Docker is
# based on Fedora.

MINGW_DOCKER_DIR=$HOME/src/docker/docker-swipl-build-mingw

build_win32()
{ if [ ! -z "$MINGW_DOCKER_DIR" ]; then
    make -C $MINGW_DOCKER_DIR win32
  else
    rm -rf build.win32
    mkdir build.win32
    ( cd build.win32
      cmake -DCMAKE_BUILD_TYPE=Release \
	    -DCMAKE_TOOLCHAIN_FILE=../cmake/cross/linux_win32.cmake \
	    -DJAVA_COMPATIBILITY=ON \
	    -G Ninja ..
      ninja
      cpack
    )
  fi
}

build_win64()
{ if [ ! -z "$MINGW_DOCKER_DIR" ]; then
    make -C $MINGW_DOCKER_DIR win64
  else
  rm -rf build.win64
    mkdir build.win64
    ( cd build.win64
      cmake -DCMAKE_BUILD_TYPE=Release \
	    -DJAVA_HOME="$HOME/.wine/drive_c/Program Files/Java/jdk-13.0.2" \
	    -DCMAKE_TOOLCHAIN_FILE=../cmake/cross/linux_win64.cmake \
	    -DJAVA_COMPATIBILITY=ON \
	    -G Ninja ..
      ninja
      cpack
    )
  fi
}

# Used on the M1 where we build using Clang and Qt 6.2.2
build_macosx()
{ rm -rf build.macosx
  mkdir build.macosx
  ( cd build.macosx
    export PATH=$HOME/deps/bin:$HOME/Qt/6.2.2/macos/bin:$PATH
    MACOSX_DEPLOYMENT_TARGET=10.14 \
	cmake -DCMAKE_BUILD_TYPE=Release \
	      -DUSE_GMP=OFF \
	      -DMACOSX_DEPENDENCIES_FROM=$HOME/deps \
              -DBUILD_MACOS_BUNDLE=ON \
	      -DJAVA_COMPATIBILITY=ON \
	      -G Ninja ..
    ninja
    cpack
  )
}


build_macos_universal_binary()
{ rm -rf build.macosx-fat
  mkdir build.macosx-fat
  ( cd build.macosx-fat
    export PATH=$HOME/deps/bin:$HOME/Qt/6.2.2/macos/bin:$PATH
    CFLAGS="-arch x86_64" CXXFLAGS="-arch x86_64" \
    MACOSX_DEPLOYMENT_TARGET=10.14 \
	cmake -DCMAKE_BUILD_TYPE=Release \
	      -DUSE_GMP=OFF \
	      -DMACOSX_DEPENDENCIES_FROM=$HOME/deps \
              -DMACOS_UNIVERSAL_BINARY=ON \
              -DBUILD_MACOS_BUNDLE=ON \
	      -DJAVA_COMPATIBILITY=ON \
	      -DCMAKE_FRAMEWORK_PATH=/Library/Frameworks \
	      -G Ninja ..
    ninja
    cpack
  )
}


# Use gcc 11 from Macport `port install gcc11`
build_macosx_gcc()
{ rm -rf build.macosx-gcc
  mkdir build.macosx-gcc
  ( cd build.macosx-gcc
    export PATH=$HOME/deps/bin:$PATH
    export CC=gcc-mp-11
    MACOSX_DEPLOYMENT_TARGET=10.14 \
        cmake -DCMAKE_BUILD_TYPE=PGO \
              -DMACOSX_DEPENDENCIES_FROM=$HOME/deps \
              -DBUILD_MACOS_BUNDLE=ON \
              -DJAVA_COMPATIBILITY=ON \
              -G Ninja ..
    ninja
    cpack
  )
}

build_source()
{ ./scripts/make-src-tape
}

build_PPAs()
{ git branch -D ppa || true
  git checkout -b ppa
  for distro in $(./scripts/make-ppa --list-distros); do
    ./scripts/make-ppa --distro=$distro --push
  done
  git checkout master
  git submodule update debian
}

build()
{ if [ $(uname) = Darwin ]; then
    if uname -a | grep arm64 > /dev/null; then
      build_macos_universal_binary
    else
      build_macosx_gcc
    fi
  else
    build_pdf
    build_win32
    build_win64
    build_source
    build_PPAs
  fi
}

################
# Uploading

upload_file()
{ if [ -f "$2" ]; then
    rsync -Pvu "$2" ${PUBLIC}/$1
  fi
}

upload_win32()
{ upload_file bin build.win32/swipl-${version}-1.x86.exe
}

upload_win64()
{ upload_file bin build.win64/swipl-${version}-1.x64.exe
}

upload_macosx()
{ if [ -f build.macosx-fat/swipl-${version}-1.fat.dmg ]; then
    echo "Uploading universal binary version"
    upload_file bin build.macosx-fat/swipl-${version}-1.fat.dmg
  elif [ -f build.macosx-gcc/swipl-${version}-1.x86_64.dmg ]; then
    echo "Uploading fast GCC version"
    upload_file bin build.macosx-gcc/swipl-${version}-1.x86_64.dmg
  else
    echo "WARNING: uploading slow Clang version"
    upload_file bin build.macosx/swipl-${version}-1.x86_64.dmg
  fi
}

upload_pdf()
{ upload_file doc build.pdf/man/SWI-Prolog-$version.pdf
}

upload_src()
{ upload_file src ../swipl-$version.tar.gz
}

upload()
{ if [ $(uname) = Darwin ]; then
    upload_macosx
  else
    upload_win32
    upload_win64
    upload_pdf
    upload_src
  fi
}
