From 99470279e32026018b28ed3b50bcfcb39d3bf722 Mon Sep 17 00:00:00 2001
From: Ralf Jung <jung@mpi-sws.org>
Date: Mon, 12 Dec 2016 16:29:00 +0100
Subject: [PATCH] use OPAM-based CI

---
 .gitlab-ci.yml     | 32 ++++++++++++++++++++++++++++----
 Makefile           | 23 ++++++++++++++++++++---
 build/opam-ci.sh   | 33 +++++++++++++++++++++++++++++++++
 build/opam-pins.sh | 17 +++++++++++++++++
 opam.pins          |  0
 5 files changed, 98 insertions(+), 7 deletions(-)
 create mode 100755 build/opam-ci.sh
 create mode 100755 build/opam-pins.sh
 create mode 100644 opam.pins

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 5c3e7df8a..8c1c988f1 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,17 +1,41 @@
-image: coq:8.5
+image: ralfjung/opam-ci:latest
 
-buildjob:
+iris-coq8.5.3:
   tags:
   - coq
   script:
-  - coqc -v
+  # prepare
+  - . build/opam-ci.sh 'coq 8.5.3' 'coq-mathcomp-ssreflect 1.6'
+  # build
   - 'time make -j8 TIMED=y 2>&1 | tee build-log.txt'
   - 'fgrep Axiom build-log.txt && exit 1'
   - 'cat build-log.txt  | egrep "[a-zA-Z0-9_/-]+ \(user: [0-9]" | tee build-time.txt'
-  - make validate
+  #- make validate
+  cache:
+    key: "coq8.5.3"
+    paths:
+    - opamroot/
   only:
   - master
+  - ci
   - timing
   artifacts:
     paths:
     - build-time.txt
+
+iris-coq8.6beta:
+  tags:
+  - coq
+  script:
+  # prepare
+  - . build/opam-ci.sh 'coq 8.6.dev 'coq-mathcomp-ssreflect dev'
+  # build
+  - 'time make -j8'
+  cache:
+    key: "coq8.6"
+    paths:
+    - opamroot/
+  only:
+  - master
+  - ci
+  - timing
diff --git a/Makefile b/Makefile
index b1c684e83..79ae75eb8 100644
--- a/Makefile
+++ b/Makefile
@@ -1,3 +1,8 @@
+# Process flags
+ifeq ($(Y), 1)
+	YFLAG=-y
+endif
+
 # Determine Coq version
 COQ_VERSION=$(shell coqc --version | egrep -o 'version 8.[0-9]' | egrep -o '8.[0-9]')
 COQ_MAKEFILE_FLAGS ?=
@@ -6,6 +11,7 @@ ifeq ($(COQ_VERSION), 8.6)
 	COQ_MAKEFILE_FLAGS += -arg -w -arg -notation-overridden,-redundant-canonical-projection
 endif
 
+# Forward most targets to Coq makefile (with some trick to make this phony)
 %: Makefile.coq phony
 	+@make -f Makefile.coq $@
 
@@ -17,18 +23,29 @@ clean: Makefile.coq
 	find \( -name "*.v.d" -o -name "*.vo" -o -name "*.aux" -o -name "*.cache" -o -name "*.glob" -o -name "*.vio" \) -print -delete
 	rm -f Makefile.coq
 
+# Create Coq Makefile
 Makefile.coq: _CoqProject Makefile
-	@# we want to pass the correct name to coq_makefile or it will be confused
+	@# we want to pass the correct name to coq_makefile or it will be confused.
 	coq_makefile $(COQ_MAKEFILE_FLAGS) -f _CoqProject -o Makefile.coq
 	mv Makefile.coq Makefile.coq.tmp
+	@# The sed script is for Coq 8.5 only, it fixes 'make verify'.
+	@# The awk script fixes 'make uninstall'.
 	sed 's/$$(COQCHK) $$(COQCHKFLAGS) $$(COQLIBS)/$$(COQCHK) $$(COQCHKFLAGS) $$(subst -Q,-R,$$(COQLIBS))/' < Makefile.coq.tmp \
 	  | awk '/^uninstall:/{print "uninstall:";print "\tif [ -d \"$$(DSTROOT)\"$$(COQLIBINSTALL)/iris/ ]; then find \"$$(DSTROOT)\"$$(COQLIBINSTALL)/iris/ -name \"*.vo\" -print -delete; fi";getline;next}1' > Makefile.coq
 	rm Makefile.coq.tmp
 
-_CoqProject: ;
+# Install build-dependencies
+build-dep:
+	build/opam-pins.sh < opam.pins
+	opam upgrade $(YFLAG) # it is not nice that we upgrade *all* packages here, but I found no nice way to upgrade only those that we pinned
+	opam pin add coq-iris "$$(pwd)#HEAD" -k git -n -y
+	opam install coq-iris --deps-only $(YFLAG)
+	opam pin remove coq-iris
 
+# some fiels that do *not* need to be forwarded to Makefile.coq
 Makefile: ;
+_CoqProject: ;
 
+# Phony targets (i.e. targets that should be run no matter the timestamps of the involved files)
 phony: ;
-
 .PHONY: all clean phony
diff --git a/build/opam-ci.sh b/build/opam-ci.sh
new file mode 100755
index 000000000..e95257363
--- /dev/null
+++ b/build/opam-ci.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+set -e
+# This script installs the build dependencies for CI builds.
+
+# Prepare OPAM configuration
+export OPAMROOT="$(pwd)/opamroot"
+export OPAMJOBS=16
+export OPAM_EDITOR="$(which false)"
+
+# Make sure we got a good OPAM
+test -d "$OPAMROOT" || (mkdir "$OPAMROOT" && opam init --no-setup -y)
+eval `opam conf env`
+test -d "$OPAMROOT/repo/coq-extra-dev" || opam repo add coq-extra-dev https://coq.inria.fr/opam/extra-dev -p 5
+test -d "$OPAMROOT/repo/coq-core-dev" || opam repo add coq-core-dev https://coq.inria.fr/opam/core-dev -p 5
+test -d "$OPAMROOT/repo/coq-released" || opam repo add coq-released https://coq.inria.fr/opam/released -p 10
+opam update
+opam install ocamlfind -y # Remove this once the Coq crew fixed their package...
+
+# Install fixed versions of some dependencies
+echo
+for PIN in "${@}"
+do
+    echo "Applying pin: $PIN"
+    opam pin add $PIN -k version -y
+done
+
+# Install build-dependencies
+echo
+make build-dep Y=1
+
+# done
+echo
+coqc -v
diff --git a/build/opam-pins.sh b/build/opam-pins.sh
new file mode 100755
index 000000000..aebd23ca2
--- /dev/null
+++ b/build/opam-pins.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+set -e
+## Process an opam.pins file from stdin: Add all the given pins, but don't install anything.
+## Usage:
+##   ./opam-pins.sh < opam.pins
+
+# Process stdin
+while read PACKAGE URL HASH; do
+    if echo "$URL" | egrep '^https://gitlab\.mpi-sws\.org' > /dev/null; then
+        echo "[opam-pins] Recursing into $URL"
+        # an MPI URL -- try doing recursive pin processing
+        curl -f "$URL/raw/$HASH" 2> /dev/null | "$0"
+    fi
+    echo "[opam-pins] Applying pin: $PACKAGE -> $URL#$HASH"
+    opam pin add "$PACKAGE.dev.$HASH" "$URL#$HASH" -k git -y -n
+    echo
+done
diff --git a/opam.pins b/opam.pins
new file mode 100644
index 000000000..e69de29bb
-- 
GitLab