Skip to content

Use opam2 #232

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Aug 2, 2018
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 21 additions & 2 deletions .travis-docker.sh
Original file line number Diff line number Diff line change
@@ -5,10 +5,12 @@ echo -en "travis_fold:start:prepare.ci\r"
default_user=ocaml
default_branch=master
default_hub_user=ocaml
default_opam_version=2.0.0

fork_user=${FORK_USER:-$default_user}
fork_branch=${FORK_BRANCH:-$default_branch}
hub_user=${HUB_USER:-$default_hub_user}
opam_version=${OPAM_VERSION:-$default_opam_version}

# create env file
echo PACKAGE="$PACKAGE" > env.list
@@ -24,14 +26,22 @@ echo POST_INSTALL_HOOK="$POST_INSTALL_HOOK" >> env.list
echo $EXTRA_ENV >> env.list

# build a local image to trigger any ONBUILDs
echo FROM ${hub_user}/opam:${DISTRO}_ocaml-${OCAML_VERSION} > Dockerfile
case $opam_version in
2.0.0) from=${hub_user}/opam2:${DISTRO} ;;
*) from=${hub_user}/opam:${DISTRO}_ocaml-${OCAML_VERSION} ;;
esac

echo FROM $from > Dockerfile
echo WORKDIR /home/opam/opam-repository >> Dockerfile

if [ -n "$BASE_REMOTE" ]; then
echo "RUN git remote set-url origin ${BASE_REMOTE} &&\
git fetch origin && git reset --hard origin/master" >> Dockerfile
else
echo RUN git pull -q origin master >> Dockerfile
case $opam_version in
2.0.0) echo RUN git pull -q origin 2.0.0 >> Dockerfile ;;
*) echo RUN git pull -q origin master >> Dockerfile ;;
esac
fi


@@ -42,13 +52,22 @@ if [ $fork_user != $default_user -o $fork_branch != $default_branch ]; then
>> Dockerfile
fi

case $opam_version in
2.0.0)
echo ENV OPAMYES=1 >> Dockerfile
[[ ${DISTRO} = "fedora"* ]] &&
echo RUN sudo yum install rsync -y >> Dockerfile ;;
*) ;;
esac

echo RUN opam update -u -y >> Dockerfile
echo RUN opam depext -ui travis-opam >> Dockerfile
echo RUN cp '~/.opam/$(opam switch show)/bin/ci-opam' "~/" >> Dockerfile
echo RUN opam remove -a travis-opam >> Dockerfile
echo RUN mv "~/ci-opam" '~/.opam/$(opam switch show)/bin/ci-opam' >> Dockerfile
echo VOLUME /repo >> Dockerfile
echo WORKDIR /repo >> Dockerfile

docker build -t local-build .

echo Dockerfile:
152 changes: 110 additions & 42 deletions .travis-ocaml.sh
Original file line number Diff line number Diff line change
@@ -28,11 +28,14 @@ fi

# the ocaml version to test
OCAML_VERSION=${OCAML_VERSION:-latest}
OPAM_VERSION=${OPAM_VERSION:-1.2.2}
OPAM_VERSION=${OPAM_VERSION:-2.0.0}
OPAM_INIT=${OPAM_INIT:-true}

# the base opam repository to use for bootstrapping and catch-all namespace
BASE_REMOTE=${BASE_REMOTE:-git://github.com/ocaml/opam-repository}
case $OPAM_VERSION in
2.0.0) BASE_REMOTE=${BASE_REMOTE:-git://github.com/ocaml/opam-repository#2.0.0} ;;
*) BASE_REMOTE=${BASE_REMOTE:-git://github.com/ocaml/opam-repository} ;;
esac

# whether we need a new gcc and binutils
UPDATE_GCC_BINUTILS=${UPDATE_GCC_BINUTILS:-"0"}
@@ -41,44 +44,24 @@ UPDATE_GCC_BINUTILS=${UPDATE_GCC_BINUTILS:-"0"}
UBUNTU_TRUSTY=${UBUNTU_TRUSTY:-"0"}

# Install XQuartz on OSX
INSTALL_XQUARTZ=${INSTALL_XQUARTZ:-"true"}

install_on_linux () {
case "$OCAML_VERSION,$OPAM_VERSION" in
3.12,1.2.2)
OCAML_VERSION=4.02; OCAML_FULL_VERSION=3.12.1
ppa=avsm/ocaml42+opam12 ;;
4.00,1.2.2)
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.00.1
ppa=avsm/ocaml42+opam12 ;;
4.01,1.2.2)
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.01.0
ppa=avsm/ocaml42+opam12 ;;
4.02,1.1.2) OCAML_FULL_VERSION=4.02.3; OPAM_SWITCH=${OPAM_SWITCH:-system}; ppa=avsm/ocaml42+opam11 ;;
4.02,1.2.0) OCAML_FULL_VERSION=4.02.3; OPAM_SWITCH=${OPAM_SWITCH:-system}; ppa=avsm/ocaml42+opam120 ;;
4.02,1.2.1) OCAML_FULL_VERSION=4.02.3; OPAM_SWITCH=${OPAM_SWITCH:-system}; ppa=avsm/ocaml42+opam121 ;;
4.02,1.2.2) OCAML_FULL_VERSION=4.02.3; OPAM_SWITCH=${OPAM_SWITCH:-system}; ppa=avsm/ocaml42+opam12 ;;
4.03,1.2.2)
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.03.0
ppa=avsm/ocaml42+opam12 ;;
4.04,1.2.2)
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.04.2
ppa=avsm/ocaml42+opam12 ;;
4.05,1.2.2)
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.05.0
ppa=avsm/ocaml42+opam12 ;;
4.06,1.2.2)
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.06.1
ppa=avsm/ocaml42+opam12 ;;
4.07,1.2.2)
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.07.0
ppa=avsm/ocaml42+opam12 ;;
*) echo "Unknown OCAML_VERSION=$OCAML_VERSION OPAM_VERSION=$OPAM_VERSION"
echo "(An unset OCAML_VERSION used to default to \"latest\", but you must now specify it."
echo "Try something like \"OCAML_VERSION=3.12\", \"OCAML_VERSION=4.07\", or see README-travis.md at https://github.com/ocaml/ocaml-ci-scripts )"
exit 1 ;;
esac
INSTALL_XQUARTZ=${INSTALL_XQUARTZ:-"false"}

install_opam2 () {
case $TRAVIS_OS_NAME in
linux)
sudo add-apt-repository --yes ppa:ansible/bubblewrap
sudo apt-get update -qq
sudo apt-get install -y bubblewrap
sudo wget https://github.com/ocaml/opam/releases/download/2.0.0-rc4/opam-2.0.0-rc4-x86_64-linux -O /usr/local/bin/opam
sudo chmod +x /usr/local/bin/opam ;;
osx)
sudo curl -sL https://github.com/ocaml/opam/releases/download/2.0.0-rc4/opam-2.0.0-rc4-x86_64-darwin -o /usr/local/bin/opam
sudo chmod +x /usr/local/bin/opam ;;
esac
}

install_ppa () {
ppa=$1
sudo add-apt-repository --yes ppa:${ppa}
sudo apt-get update -qq
if [ "${INSTALL_LOCAL:=0}" = 0 ] ; then
@@ -96,6 +79,78 @@ install_on_linux () {
else
sudo apt-get install -y opam
fi
}

install_on_linux () {
case "$OCAML_VERSION,$OPAM_VERSION" in
3.12,1.2.2)
install_ppa avsm/ocaml42+opam12
OCAML_VERSION=4.02; OCAML_FULL_VERSION=3.12.1 ;;
3.12,2.0.0)
install_opam2
OCAML_VERSION=4.01; OCAML_FULL_VERSION=3.12.1 ;;
4.00,1.2.2)
install_ppa avsm/ocaml42+opam12
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.00.1 ;;
4.00,2.0.0)
install_opam2
OCAML_VERSION=4.01; OCAML_FULL_VERSION=4.00.1 ;;
4.01,1.2.2)
install_ppa avsm/ocaml42+opam12
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.01.0 ;;
4.01,2.0.0)
install_opam2
OCAML_FULL_VERSION=4.01.0 OPAM_SWITCH=${OPAM_SWITCH:-ocaml-system} ;;
4.02,1.1.2)
install_ppa avsm/ocaml42+opam11
OCAML_FULL_VERSION=4.02.3; OPAM_SWITCH=${OPAM_SWITCH:-system} ;;
4.02,1.2.0)
install_ppa avsm/ocaml42+opam120
OCAML_FULL_VERSION=4.02.3; OPAM_SWITCH=${OPAM_SWITCH:-system} ;;
4.02,1.2.1)
install_ppa avsm/ocaml42+opam121
OCAML_FULL_VERSION=4.02.3; OPAM_SWITCH=${OPAM_SWITCH:-system} ;;
4.02,1.2.2)
install_ppa avsm/ocaml42+opam12
OCAML_FULL_VERSION=4.02.3; OPAM_SWITCH=${OPAM_SWITCH:-system} ;;
4.02,2.0.0)
install_opam2
OCAML_VERSION=4.01; OCAML_FULL_VERSION=4.02.3 ;;
4.03,1.2.2)
install_ppa avsm/ocaml42+opam12
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.03.0 ;;
4.03,2.0.0)
install_opam2
OCAML_VERSION=4.01; OCAML_FULL_VERSION=4.03.0 ;;
4.04,1.2.2)
install_ppa avsm/ocaml42+opam12
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.04.2 ;;
4.04,2.0.0)
install_opam2
OCAML_VERSION=4.01; OCAML_FULL_VERSION=4.04.2 ;;
4.05,1.2.2)
install_ppa avsm/ocaml42+opam12
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.05.0 ;;
4.05,2.0.0)
install_opam2
OCAML_VERSION=4.01; OCAML_FULL_VERSION=4.05.0 ;;
4.06,1.2.2)
install_ppa avsm/ocaml42+opam12
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.06.1 ;;
4.06,2.0.0)
install_opam2
OCAML_VERSION=4.01; OCAML_FULL_VERSION=4.06.1 ;;
4.07,1.2.2)
install_ppa avsm/ocaml42+opam12
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.07.0 ;;
4.07,2.0.0)
install_opam2
OCAML_VERSION=4.01; OCAML_FULL_VERSION=4.07.0 ;;
*) echo "Unknown OCAML_VERSION=$OCAML_VERSION OPAM_VERSION=$OPAM_VERSION"
echo "(An unset OCAML_VERSION used to default to \"latest\", but you must now specify it."
echo "Try something like \"OCAML_VERSION=3.12\", \"OCAML_VERSION=4.07\", or see README-travis.md at https://github.com/ocaml/ocaml-ci-scripts )"
exit 1 ;;
esac

TRUSTY="deb mirror://mirrors.ubuntu.com/mirrors.txt trusty main restricted universe"

@@ -115,7 +170,7 @@ install_on_linux () {
sudo apt-get -qq update
fi

if [ "$INSTALL_LOCAL" != 0 ] ; then
if [ "${INSTALL_LOCAL:=0}" != 0 ] ; then
echo -en "travis_fold:start:build.ocaml\r"
echo "Building a local OCaml; this may take a few minutes..."
wget "http://caml.inria.fr/pub/distrib/ocaml-${OCAML_FULL_VERSION%.*}/ocaml-$OCAML_FULL_VERSION.tar.gz"
@@ -141,15 +196,28 @@ install_on_osx () {
brew upgrade python || true
case "$OCAML_VERSION,$OPAM_VERSION" in
3.12,1.2.2) OCAML_FULL_VERSION=3.12.1; brew install opam ;;
3.12,2.0.0) OCAML_FULL_VERSION=3.12.1; install_opam2 ;;
4.00,1.2.2) OCAML_FULL_VERSION=4.00.1; brew install opam ;;
4.00,2.0.0) OCAML_FULL_VERSION=4.00.1; install_opam2 ;;
4.01,1.2.2) OCAML_FULL_VERSION=4.01.0; brew install opam ;;
4.01,2.0.0) OCAML_FULL_VERSION=4.01.0; install_opam2 ;;
4.02,1.2.2) OCAML_FULL_VERSION=4.02.3; brew install opam ;;
4.02,1.3.0) OCAML_FULL_VERSION=4.02.3; brew install opam --HEAD ;;
4.02,2.0.0) OCAML_FULL_VERSION=4.02.3; install_opam2 ;;
4.03,1.2.2) OCAML_FULL_VERSION=4.03.0; brew install opam ;;
4.03,2.0.0) OCAML_FULL_VERSION=4.03.0; install_opam2 ;;
4.04,1.2.2) OCAML_FULL_VERSION=4.04.2; brew install opam ;;
4.04,2.0.0) OCAML_FULL_VERSION=4.04.2; install_opam2 ;;
4.05,1.2.2) OCAML_FULL_VERSION=4.05.0; brew install opam ;;
4.05,2.0.0) OCAML_FULL_VERSION=4.05.0; install_opam2 ;;
4.06,1.2.2) OCAML_FULL_VERSION=4.06.1; brew install opam ;;
4.07,1.2.2) OCAML_FULL_VERSION=4.07.0; OPAM_SWITCH=${OPAM_SWITCH:-system}; brew install ocaml; brew install opam ;;
4.06,2.0.0) OCAML_FULL_VERSION=4.06.1; install_opam2 ;;
4.07,1.2.2) OCAML_FULL_VERSION=4.07.0;
OPAM_SWITCH=${OPAM_SWITCH:-system};
brew install ocaml; brew install opam ;;
4.07,2.0.0) OCAML_FULL_VERSION=4.07.0;
OPAM_SWITCH=${OPAM_SWITCH:-ocaml-system};
brew install ocaml;
install_opam2 ;;
*) echo "Unknown OCAML_VERSION=$OCAML_VERSION OPAM_VERSION=$OPAM_VERSION"
exit 1 ;;
esac
2 changes: 2 additions & 0 deletions .travis-opam.sh
Original file line number Diff line number Diff line change
@@ -22,7 +22,9 @@ eval $(opam config env)
opam depext -y conf-m4
opam pin add travis-opam https://github.com/${fork_user}/ocaml-ci-scripts.git#${fork_branch}
cp ~/.opam/$(opam switch show)/bin/ci-opam ~/

opam remove -a travis-opam

mv ~/ci-opam ~/.opam/$(opam switch show)/bin/ci-opam

echo -en "travis_fold:end:prepare.ci\r"
21 changes: 12 additions & 9 deletions README-travis.md
Original file line number Diff line number Diff line change
@@ -254,17 +254,14 @@ Configuration choices are passed to `mirage configure` via environment variables

### Changing the version of opam

```yaml
- [...] OPAM_VERSION="1.1.2"
```
By default, the CI scripts are using the latest RC release of opam *2.0.0*.
To use a different version of opam, use:

By default, the latest stable version of opam will be used. the scripts supports
these version:
```yaml
- [...] OPAM_VERSION="1.2.2"
```

- `OPAM_VERSION=1.1.2` only when the OS is `unix`
- `OPAM_VERSION=1.2.0` only when the OS is `unix`
- `OPAM_VERSION=1.2.2` when the OS is either `unix` or `osx` (default)
- `OPAM_VERSION=1.3.0` only when the OS is `osx`
Supported versions are `2.0.0`, `1.2.2`, `1.2.0 and `1.1.2`.

### Testing on different OS

@@ -278,6 +275,12 @@ os:
- osx
```

To enable XQuartz support on MacOS, use:

```yaml
- [...] INSTALL_XQUARTZ=true
```

## Pushing OCamldoc docs to Github page, `.travis-docgen.sh`

This relies on the existence of a `configure` script and `Makefile` such that
31 changes: 26 additions & 5 deletions src/ci_opam.ml
Original file line number Diff line number Diff line change
@@ -60,6 +60,14 @@ let revdep_run = list (getenv_default "REVDEPS" "")
(* run opam lint *)
let opam_lint = fuzzy_bool_of_string (getenv_default "OPAM_LINT" "true")

(* opam version *)
let opam_version =
let raw = ?|> "opam --version" in
match if String.length raw <= 1 then '?' else raw.[0] with
| '2' -> `V2
| '1' -> `V1
| _ -> failwith (raw ^ ": invalid opam version")

(* other variables *)
let extra_deps = list (getenv_default "EXTRA_DEPS" "")
let pre_install_hook = getenv_default "PRE_INSTALL_HOOK" ""
@@ -74,9 +82,10 @@ let add_remote =
let layer = ref 0 in
fun remote -> ?|~ "opam remote add extra%d %s" !layer remote; incr layer

let pin pin = match pair pin with
| (pkg,None) -> ?|~ "opam pin add %s --dev-repo -n" pkg
| (pkg,Some url) -> ?|~ "opam pin add %s %s -n" pkg url
let pin = function
| pkg, None -> ?|~ "opam pin add %s --dev-repo -n" pkg
| pkg, Some "." -> ?|~ "opam pin add %s --kind=path . -n" pkg
| pkg, Some url -> ?|~ "opam pin add %s %s -n" pkg url

let is_base pkg =
match trim (?|> "opam show -f version %s" pkg) with
@@ -207,6 +216,16 @@ let max_version package =
in
next_version (trim (?|> "opam show -f version %s" package))

module Strings = Map.Make(String)

let lint_pins pkg pins =
let pins = List.map pair pins in
let pkgs =
List.fold_left (fun acc (k, v) -> Strings.add k v acc) Strings.empty pins
in
let pkgs = Strings.add pkg (Some ".") pkgs in
Strings.fold (fun k v acc -> (k, v) :: acc) pkgs []

;; (* Go go go *)

with_fold "Prepare" (fun () ->
@@ -237,9 +256,11 @@ with_fold "Prepare" (fun () ->
Format.ksprintf failwith "No opam file found for %s, aborting." pkg_name
in

(if opam_lint then match opam_version with
| `V2 -> ?|~ "opam lint %s --warn=-21-32-48" opam
| _ -> ?|~ "opam lint %s" opam);
let pins = lint_pins pkg pins in
List.iter pin pins;
(if opam_lint then ?|~ "opam lint %s" opam);
?|~ "opam pin add %s . -n" pkg;
?| "eval $(opam config env)";
?| "opam install depext";
(* Install the external dependencies *)