Skip to content
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

Add stub implementation of emit #8

Open
wants to merge 15 commits into
base: master
Choose a base branch
from
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
target
*.asm
*.asm
*.ans
*.out
*.x
337 changes: 337 additions & 0 deletions .travis-ocaml.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,337 @@
## basic OCaml and opam installation

full_apt_version () {
package=$1
version=$2
case "${version}" in
latest) echo -n "${package}" ;;
*) echo -n "${package}="
apt-cache show "$package" \
| sed -n "s/^Version: \(${version}\)/\1/p" \
| head -1
esac
}

set -uex


# the ocaml version to test
OCAML_VERSION=${OCAML_VERSION:-latest}
SYS_OCAML_VERSION=4.02
# Default opam is the latest release of opam 2
OPAM_VERSION=${OPAM_VERSION:-2}
OPAM_INIT=${OPAM_INIT:-true}

OPAM_LATEST_RELEASE=2.0.5

case $OPAM_VERSION in
2|2.0) OPAM_VERSION=$OPAM_LATEST_RELEASE;;
esac

if [ "$TRAVIS_OS_NAME" = "osx" ] ; then
brew update &> /dev/null
BREW_OPAM_VERSION=$(brew info opam --json=v1 | sed -e 's/.*"versions":{[^}]*"stable":"//' -e 's/".*//')
if [ "$OPAM_VERSION" != "$BREW_OPAM_VERSION" ] ; then
set +x
echo -e "[\e[0;31mWARNING\e[0m] Ignored OPAM_VERSION=$OPAM_VERSION; interpreted as \"$BREW_OPAM_VERSION\"" >&2
echo -e "[\e[0;31mWARNING\e[0m] opam 2 is installed via Homebrew" >&2
set -x
fi
OPAM_VERSION="$BREW_OPAM_VERSION"
fi

if [ "$OPAM_VERSION" != "$OPAM_LATEST_RELEASE" ] ; then
set +x
echo -e "[\e[0;31mWARNING\e[0m] Out-of-date opam $OPAM_VERSION requested" >&2
echo -e "[\e[0;31mWARNING\e[0m] Latest release is $OPAM_LATEST_RELEASE" >&2
set -x
fi

if [ "${INSTALL_LOCAL+x}" = x ] ; then
if [ "$TRAVIS_OS_NAME" = osx ] ; then
echo INSTALL_LOCAL not permitted for macOS targets
exit 1
fi

case ${OPAM_VERSION} in
2*)
if [ "${OPAM_SWITCH:=ocaml-system}" != ocaml-system ] ; then
echo "INSTALL_LOCAL requires OPAM_SWITCH=ocaml-system (or unset/null)"
exit 1
fi ;;
*)
if [ "${OPAM_SWITCH:=system}" != system ] ; then
echo "INSTALL_LOCAL requires OPAM_SWITCH=system (or unset/null)"
exit 1
fi ;;
esac
fi

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

# whether we need a new gcc and binutils
UPDATE_GCC_BINUTILS=${UPDATE_GCC_BINUTILS:-"0"}

# Install Trusty remotes
UBUNTU_TRUSTY=${UBUNTU_TRUSTY:-"0"}

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

APT_UPDATED=0

add_ppa () {
if [ "$TRAVIS_OS_NAME" = "linux" ] ; then
APT_UPDATED=0
sudo add-apt-repository --yes ppa:$1
fi
}

apt_install () {
if [ "$TRAVIS_OS_NAME" = "linux" ] ; then
if [ "$APT_UPDATED" -eq 0 ] ; then
APT_UPDATED=1
sudo apt-get update -qq
fi
sudo apt-get install --no-install-recommends -y "$@"
fi
}

install_ocaml () {
apt_install \
ocaml ocaml-base ocaml-native-compilers ocaml-compiler-libs \
ocaml-interp ocaml-base-nox ocaml-nox
}

install_opam2 () {
case $TRAVIS_OS_NAME in
linux)
case $TRAVIS_DIST in
precise|trusty|xenial)
add_ppa ansible/bubblewrap ;;
esac
if [ "${INSTALL_LOCAL:=0}" = 0 ] ; then
install_ocaml
fi
apt_install bubblewrap
sudo wget https://github.com/ocaml/opam/releases/download/$OPAM_VERSION/opam-$OPAM_VERSION-x86_64-linux -O /usr/local/bin/opam
sudo chmod +x /usr/local/bin/opam ;;
osx)
if [ "${INSTALL_LOCAL:=0}" = 0 ] ; then
brew install ocaml
fi
sudo curl -fsSL https://github.com/ocaml/opam/releases/download/$OPAM_VERSION/opam-$OPAM_VERSION-x86_64-macos -o /usr/local/bin/opam
sudo chmod +x /usr/local/bin/opam ;;
esac
}

install_ppa () {
add_ppa $1
if [ "${INSTALL_LOCAL:=0}" = 0 ] ; then
sudo apt-get -qq update
APT_UPDATED=1
apt_install \
"$(full_apt_version ocaml $SYS_OCAML_VERSION)" \
"$(full_apt_version ocaml-base $SYS_OCAML_VERSION)" \
"$(full_apt_version ocaml-native-compilers $SYS_OCAML_VERSION)" \
"$(full_apt_version ocaml-compiler-libs $SYS_OCAML_VERSION)" \
"$(full_apt_version ocaml-interp $SYS_OCAML_VERSION)" \
"$(full_apt_version ocaml-base-nox $SYS_OCAML_VERSION)" \
"$(full_apt_version ocaml-nox $SYS_OCAML_VERSION)"
fi
apt_install opam
}

install_on_linux () {
case "$OCAML_VERSION,$OPAM_VERSION" in
3.12,1.2.2)
OCAML_FULL_VERSION=3.12.1
install_ppa avsm/ocaml42+opam12 ;;
3.12,2*)
OCAML_FULL_VERSION=3.12.1
install_opam2 ;;
4.00,1.2.2)
OCAML_FULL_VERSION=4.00.1
install_ppa avsm/ocaml42+opam12 ;;
4.00,2*)
OCAML_FULL_VERSION=4.00.1
install_opam2 ;;
4.01,1.2.2)
OCAML_FULL_VERSION=4.01.0
install_ppa avsm/ocaml42+opam12 ;;
4.01,2*)
OCAML_FULL_VERSION=4.01.0
install_opam2 ;;
4.02,1.1.2)
OCAML_FULL_VERSION=4.02.3
OPAM_SWITCH=${OPAM_SWITCH:-system}
install_ppa avsm/ocaml42+opam11 ;;
4.02,1.2.0)
OCAML_FULL_VERSION=4.02.3
OPAM_SWITCH=${OPAM_SWITCH:-system}
install_ppa avsm/ocaml42+opam120 ;;
4.02,1.2.1)
OCAML_FULL_VERSION=4.02.3
OPAM_SWITCH=${OPAM_SWITCH:-system}
install_ppa avsm/ocaml42+opam121 ;;
4.02,1.2.2)
OCAML_FULL_VERSION=4.02.3
OPAM_SWITCH=${OPAM_SWITCH:-system}
install_ppa avsm/ocaml42+opam12 ;;
4.02,2*)
OCAML_FULL_VERSION=4.02.3
install_opam2 ;;
4.03,1.2.2)
OCAML_FULL_VERSION=4.03.0
install_ppa avsm/ocaml42+opam12 ;;
4.03,2*)
OCAML_FULL_VERSION=4.03.0
install_opam2 ;;
4.04,1.2.2)
OCAML_FULL_VERSION=4.04.2
install_ppa avsm/ocaml42+opam12 ;;
4.04,2*)
OCAML_FULL_VERSION=4.04.2
install_opam2 ;;
4.05,1.2.2)
OCAML_FULL_VERSION=4.05.0
install_ppa avsm/ocaml42+opam12 ;;
4.05,2*)
OCAML_FULL_VERSION=4.05.0
install_opam2 ;;
4.06,1.2.2)
OCAML_FULL_VERSION=4.06.1
install_ppa avsm/ocaml42+opam12 ;;
4.06,2*)
OCAML_FULL_VERSION=4.06.1
install_opam2 ;;
4.07,1.2.2)
OCAML_FULL_VERSION=4.07.1
install_ppa avsm/ocaml42+opam12 ;;
4.07,2*)
OCAML_FULL_VERSION=4.07.1
install_opam2 ;;
4.08,1.2.2)
OCAML_FULL_VERSION=4.08.1
install_ppa avsm/ocaml42+opam12 ;;
4.08,2*)
OCAML_FULL_VERSION=4.08.1
install_opam2 ;;
4.09,1.2.2)
OCAML_FULL_VERSION=4.09.0
install_ppa avsm/ocaml42+opam12 ;;
4.09,2*)
OCAML_FULL_VERSION=4.09.0
install_opam2 ;;
*) 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.09\", 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"

if [ "$UPDATE_GCC_BINUTILS" != "0" ] ; then
echo "installing a recent gcc and binutils (mainly to get mirage-entropy-xen working!)"
sudo add-apt-repository "${TRUSTY}"
sudo add-apt-repository --yes ppa:ubuntu-toolchain-r/test
sudo apt-get -qq update
sudo apt-get install -y gcc-4.8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 90
sudo add-apt-repository -r "${TRUSTY}"
fi

if [ "$UBUNTU_TRUSTY" != "0" ] ; then
echo "Adding Ubuntu Trusty mirrors"
sudo add-apt-repository "${TRUSTY}"
sudo apt-get -qq update
APT_UPDATED=1
fi

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"
tar -xzf "ocaml-$OCAML_FULL_VERSION.tar.gz"
cd "ocaml-$OCAML_FULL_VERSION"
./configure -prefix /usr/local ${OCAML_CONFIGURE_ARGS:=--with-debug-runtime}
make world.opt
sudo make install
cd ..
echo -en "travis_fold:end:build.ocaml\r"
fi
}

install_on_osx () {
case $INSTALL_XQUARTZ in
true)
curl -OL "http://xquartz.macosforge.org/downloads/SL/XQuartz-2.7.6.dmg"
sudo hdiutil attach XQuartz-2.7.6.dmg
sudo installer -verbose -pkg /Volumes/XQuartz-2.7.6/XQuartz.pkg -target /
;;
esac
case "$OCAML_VERSION,$OPAM_VERSION" in
3.12,1.2.2) OCAML_FULL_VERSION=3.12.1; brew install opam ;;
3.12,2*) 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*) 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*) OCAML_FULL_VERSION=4.01.0; install_opam2 ;;
4.02,1.2.2) OCAML_FULL_VERSION=4.02.3; brew install opam ;;
4.02,2*) 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*) 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*) 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*) OCAML_FULL_VERSION=4.05.0; install_opam2 ;;
4.06,1.2.2) OCAML_FULL_VERSION=4.06.1; brew install opam ;;
4.06,2*) OCAML_FULL_VERSION=4.06.1; install_opam2 ;;
4.07,1.2.2) OCAML_FULL_VERSION=4.07.1; brew install opam ;;
4.07,2*) OCAML_FULL_VERSION=4.07.1; install_opam2 ;;
4.08,1.2.2) OCAML_FULL_VERSION=4.08.1;
OPAM_SWITCH=${OPAM_SWITCH:-system};
brew install ocaml;
brew install opam ;;
4.08,2*) OCAML_FULL_VERSION=4.08.1;
OPAM_SWITCH=${OPAM_SWITCH:-ocaml-system};
brew install ocaml;
install_opam2 ;;
4.09,1.2.2) OCAML_FULL_VERSION=4.09.0; brew install opam ;;
4.09,2*) OCAML_FULL_VERSION=4.09.0; install_opam2 ;;
*) echo "Unknown OCAML_VERSION=$OCAML_VERSION OPAM_VERSION=$OPAM_VERSION"
exit 1 ;;
esac
}

case $TRAVIS_OS_NAME in
osx) install_on_osx ;;
linux) install_on_linux ;;
esac

OPAM_SWITCH=${OPAM_SWITCH:-ocaml-base-compiler.$OCAML_FULL_VERSION}

export OPAMYES=1

case $OPAM_INIT in
true)
opam init -a "$BASE_REMOTE" --comp="$OPAM_SWITCH"
eval $(opam config env)
;;
esac

echo OCAML_VERSION=$OCAML_VERSION > .travis-ocaml.env
echo OPAM_SWITCH=$OPAM_SWITCH >> .travis-ocaml.env

if [ -x "$(command -v ocaml)" ]; then
ocaml -version
else
echo "OCaml is not yet installed"
fi

opam --version
opam --git-version
5 changes: 5 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
language: rust
env:
global:
- OCAML_VERSION=4.02
matrix:
include:
- rust: stable
Expand All @@ -9,7 +12,9 @@ matrix:
env: RUST_CHANNEL=nightly
allow_failures:
- rust: nightly
fast_finish: true
install:
- bash -ex .travis-ocaml.sh
- cargo install cargo-bloat
- rustup component add clippy rustfmt
- if [ $RUST_CHANNEL == "nightly" ]; then
Expand Down
4 changes: 4 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
%.x: %.S assets/x86_64/libmincaml.S assets/stub.c
cc assets/stub.c assets/x86_64/libmincaml.S $*.S -o $*.x
%.S: %.ml
cargo run $< $@
26 changes: 26 additions & 0 deletions assets/stub.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// https://github.com/esumii/min-caml/blob/master/stub.c
#include <stdio.h>
#include <stdlib.h>

extern void min_caml_start(char *, char *);

/* "stderr" is a macro and cannot be referred to in libmincaml.S, so
this "min_caml_stderr" is used (in place of "__iob+32") for better
portability (under SPARC emulators, for example). Thanks to Steven
Shaw for reporting the problem and proposing this solution. */
FILE *min_caml_stderr;

int main() {
char *hp, *sp;

min_caml_stderr = stderr;
sp = alloca(1000000); hp = malloc(4000000);
if (hp == NULL || sp == NULL) {
fprintf(stderr, "malloc or alloca failed\n");
return 1;
}
fprintf(stderr, "sp = %p, hp = %p\n", sp, hp);
min_caml_start(sp, hp);

return 0;
}
Loading