-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathappveyor.sh
189 lines (177 loc) · 7.46 KB
/
appveyor.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#!/bin/bash
TERM=st
# Increment whenever the OCaml version or a package is updated to invalidate the caches
SERIAL=2
ROOT=C:/OCaml
ROOT_CYG=$(echo $ROOT| cygpath -f -)
APPVEYOR_BUILD_FOLDER=$(echo $APPVEYOR_BUILD_FOLDER| cygpath -f -)
ERRORS_ALLOWED=0
function quietly_log {
if ! script --quiet --return --append --command "$1" $LOG_FILE > /dev/null 2>&1 ; then
cat $LOG_FILE
if ((ERRORS_ALLOWED)) ; then
return 1
else
exit 1
fi
fi
}
function msvs_promote_path {
if [[ ${1%64} = "msvc" ]] ; then
eval $($ROOT_CYG/msvs-promote-path)
fi
}
if ! cat $APPVEYOR_BUILD_FOLDER/appveyor.yml | tr -d '\015' | sed -e '1,/^cache:/d' -e '/^$/,$d' | grep -q "^ \+- \+C:\\\\OCaml$" ; then
echo "$(tput setf 4)ERROR$(tput sgr0) C:\\OCaml doesn't appear to be cached in appveyor.yml"
exit 1
fi
if [[ ! -e $ROOT_CYG/$OCAML_VERSION/$PORT/bin/ocamlopt.exe || ! -e $ROOT_CYG/$OCAML_VERSION/version || $(cat $ROOT_CYG/$OCAML_VERSION/version) != "$OCAML_VERSION-$SERIAL" ]] ; then
if [[ -e $ROOT_CYG/$OCAML_VERSION/version && $(cat $ROOT_CYG/$OCAML_VERSION/version) != "$OCAML_VERSION-$SERIAL" ]] ; then
echo "Build cache for $OCAML_VERSION has serial $(cat $ROOT_CYG/$OCAML_VERSION/version); should be $OCAML_VERSION-$SERIAL -- clearing"
rm -rf $ROOT_CYG/$OCAML_VERSION
elif [[ ! -e $ROOT_CYG/$OCAML_VERSION/version ]] ; then
rm -rf $ROOT_CYG/$OCAML_VERSION
fi
PREFIX=$ROOT_CYG/$OCAML_VERSION/$PORT
ROOT=$ROOT/$OCAML_VERSION/$PORT
OCAML_BRANCH=${OCAML_VERSION%.*}
OCAML_BRANCH=${OCAML_BRANCH/.}
if [[ ! -d $APPVEYOR_BUILD_FOLDER/../src ]] ; then
mkdir -p $APPVEYOR_BUILD_FOLDER/../src
cd $APPVEYOR_BUILD_FOLDER/../src
git clone https://github.com/ocaml/ocaml.git
cd ocaml
mkdir -p $PREFIX
cp tools/msvs-promote-path $ROOT_CYG/
cd ..
FLEXDLL_VER=0.37
CPPO_VER=1.6.6
FINDLIB_VER=1.8.0
DUNE_VER=1.10.0
OCAMLBUILD_VER=0.14.0
# NB CUDF URL will also need updating
CUDF_VER=0.9
EXTLIB_VER=1.7.6
CBC_VER=2.9.9
appveyor DownloadFile "https://bintray.com/coin-or/download/download_file?file_path=Cbc-$CBC_VER-win32-msvc14.zip" -FileName Cbc-$CBC_VER-win32-msvc14.zip
appveyor DownloadFile "https://github.com/alainfrisch/flexdll/releases/download/$FLEXDLL_VER/flexdll-bin-$FLEXDLL_VER.zip" -FileName flexdll-bin-$FLEXDLL_VER.zip
appveyor DownloadFile "https://github.com/mjambon/cppo/archive/v$CPPO_VER.tar.gz" -FileName cppo-$CPPO_VER.tar.gz
appveyor DownloadFile "http://download.camlcity.org/download/findlib-$FINDLIB_VER.tar.gz" -FileName findlib-$FINDLIB_VER.tar.gz
appveyor DownloadFile "https://github.com/ocaml/dune/archive/$DUNE_VER.tar.gz" -FileName dune-$DUNE_VER.tar.gz
appveyor DownloadFile "https://github.com/ocaml/ocamlbuild/archive/$OCAMLBUILD_VER.tar.gz" -FileName ocamlbuild-$OCAMLBUILD_VER.tar.gz
appveyor DownloadFile "https://gforge.inria.fr/frs/download.php/file/36602/cudf-0.9.tar.gz" -FileName cudf-$CUDF_VER.tar.gz
appveyor DownloadFile "https://github.com/ygrek/ocaml-extlib/releases/download/$EXTLIB_VER/extlib-$EXTLIB_VER.tar.gz" -FileName extlib-$EXTLIB_VER.tar.gz
cp $APPVEYOR_BUILD_FOLDER/appveyor/*.patch $APPVEYOR_BUILD_FOLDER/../src/
[[ -e $PREFIX/../version ]] || echo $OCAML_VERSION-$SERIAL> $PREFIX/../version
fi
export PATH=$PREFIX/bin:$PATH
cd $APPVEYOR_BUILD_FOLDER/../src/ocaml
git checkout $OCAML_VERSION
git worktree add ../$OCAML_VERSION/$PORT/ocaml -b build-$OCAML_VERSION-$PORT
if [[ $OCAML_BRANCH -ge 403 ]] ; then
pushd ../$OCAML_VERSION/$PORT/ocaml > /dev/null
git submodule update --init
# PR#48 (not yet merged)
cd flexdll
git remote add -f dra27 https://github.com/dra27/flexdll.git
git checkout linking-c++
cd ..
popd > /dev/null
fi
cd ../$OCAML_VERSION/$PORT/ocaml
if [[ $OCAML_BRANCH -ge 406 ]] ; then
cp config/s-nt.h byterun/caml/s.h
cp config/m-nt.h byterun/caml/m.h
else
cp config/s-nt.h config/s.h
cp config/m-nt.h config/m.h
fi
if [[ $OCAML_BRANCH -ge 405 ]] ; then
POST_WORLD=flexlink.opt
else
POST_WORLD=
fi
if [[ $OCAML_BRANCH -lt 403 ]] ; then
mkdir -p $PREFIX/bin
pushd $PREFIX/bin > /dev/null
case $PORT in
msvc)
MANIFEST=default.manifest;;
msvc64)
MANIFEST=default_amd64.manifest;;
*)
MANIFEST=;;
esac
unzip $APPVEYOR_BUILD_FOLDER/../src/flexdll-bin-$FLEXDLL_VER.zip flexdll_*$PORT.* flexdll.h flexlink.exe $MANIFEST
popd > /dev/null
PRE_WORLD=
else
PRE_WORLD=flexdll
fi
sed -e "s|PREFIX=[^\r]*|PREFIX=$ROOT|" config/Makefile.$PORT > config/Makefile
msvs_promote_path $PORT
cd ..
tar -xzf $APPVEYOR_BUILD_FOLDER/../src/findlib-$FINDLIB_VER.tar.gz
cd findlib-$FINDLIB_VER
# Not yet upstreamed
sed -i -e 's/\.a/$(LIB_SUFFIX)/g' src/findlib/Makefile
cd ..
tar -xzf $APPVEYOR_BUILD_FOLDER/../src/dune-$DUNE_VER.tar.gz
if [[ $OCAML_BRANCH -ge 403 ]] ; then
tar -xzf $APPVEYOR_BUILD_FOLDER/../src/ocamlbuild-$OCAMLBUILD_VER.tar.gz
fi
tar -xzf $APPVEYOR_BUILD_FOLDER/../src/cppo-$CPPO_VER.tar.gz
tar -xzf $APPVEYOR_BUILD_FOLDER/../src/cudf-$CUDF_VER.tar.gz
cd cudf-$CUDF_VER
# Upstreamed; not merged
patch -p1 -i ../../../cudf-0.9.patch
cd ..
tar -xzf $APPVEYOR_BUILD_FOLDER/../src/extlib-$EXTLIB_VER.tar.gz
cd ocaml
LOG_FILE=OCaml-$OCAML_VERSION-$PORT.log
echo "Building OCaml $OCAML_VERSION for $PORT" | tee $LOG_FILE
echo "Please see $LOG_FILE for further information"
LOG_FILE="$APPVEYOR_BUILD_FOLDER/$LOG_FILE"
quietly_log "make -f Makefile.nt $PRE_WORLD world.opt $POST_WORLD install"
# Remove unnecessary executables to keep the build cache size down
# These are removed here to ensure findlib doesn't configure itself
# to use .opt commands
if [[ $OCAML_BRANCH -ge 404 ]] ; then
rm $PREFIX/bin/*.byte.exe $PREFIX/bin/*.opt.exe
else
for i in $PREFIX/bin/*.opt.exe ; do
rm ${i%.opt.exe}.exe
mv $i ${i%.opt.exe}.exe
done
fi
cd ../findlib-$FINDLIB_VER
quietly_log "./configure && make all opt && make install"
cd ../dune-$DUNE_VER
quietly_log "ocaml bootstrap.ml && ./boot.exe --release && cp _boot/install/default/bin/dune.exe $PREFIX/bin/dune.exe"
if [[ $OCAML_BRANCH -ge 403 ]] ; then
cd ../ocamlbuild-$OCAMLBUILD_VER
quietly_log "make -f configure.make all OCAMLBUILD_PREFIX=$ROOT OCAMLBUILD_BINDIR=$ROOT/bin OCAMLBUILD_LIBDIR=$(ocamlfind printconf path | cygpath -f - -m) OCAML_NATIVE=true OCAML_NATIVE_TOOLS=false && make all findlib-install"
rm $PREFIX/bin/ocamlbuild.{byte,native}.exe
fi
cd ../cppo-$CPPO_VER
quietly_log "dune build @install -p cppo && cp _build/install/default/bin/cppo.exe $PREFIX/bin/"
cd ../extlib-$EXTLIB_VER
quietly_log "make minimal=1 build install"
cd ../cudf-$CUDF_VER
quietly_log "make DOC= BINDIR=$PREFIX/bin all opt install"
pushd $PREFIX > /dev/null
unzip $APPVEYOR_BUILD_FOLDER/../src/Cbc-$CBC_VER-win32-msvc14.zip bin/cbc.exe
chmod +x bin/cbc.exe
popd > /dev/null
# Remove unnecessary commands to keep the build cache size down
rm $PREFIX/bin/{ocamlcp,ocamldebug,ocamldoc,ocamlmktop,ocamlobjinfo,ocamloptp,ocamlprof}.exe $PREFIX/lib/{expunge,extract_crc,objinfo_helper}.exe
# Remove unnecessary files
if [[ $OCAML_BRANCH -lt 405 && $OCAML_BRANCH -gt 402 ]] ; then
rm $PREFIX/*.txt
fi
find $PREFIX -name \*.cmt\* | xargs rm
find $PREFIX -name \*.ml\* | xargs rm
rm -f $PREFIX/lib/compiler-libs/*.cmx* $PREFIX/lib/compiler-libs/*.{lib,a} $PREFIX/lib/compiler-libs/ocamloptcomp.cma
echo "Complete"
appveyor PushArtifact $(echo $LOG_FILE| cygpath -m -f -)
fi