-
Notifications
You must be signed in to change notification settings - Fork 11
Home
These are the (most comprehensive) instructions to get a working OPAM setup.
These instructions are optimized towards compiling miTLS and F*.
- Open up a
cmd.exeprompt, and make sure that typingbashandtarresults in a'bash' is not recognized as an internal or external commanderror. Ifcmd.exepicks up any of these two programs, uninstall them. Possible culprits:- bash for windows (the new linux syscall emulation layer in windows 10)
- gnu on windows
- git for windows (comes with its own msys distribution)
- msys
- etc. etc.
-
If you already have cygwin installed: make sure it's cygwin64 (
uname -a). -
If you already have cygwin installed: open up a cygwin terminal, and run
where ocamlandwhere flexlink. If you get anything at this stage, clean up. Possible culprits include:- cygwin packages for
ocamlandflexdll; remove these! - leftover Wodi setup
- leftover old OCaml setup (e.g. the old 3.11 installer, ocpwin, etc.)
- cygwin packages for
- Open up a
cmd.exeprompt, and runset. If you have any environment variable for OCaml (e.g.OCAMLLIB), clean it up using your system properties → environment variables dialog.
Download and launch the installer from http://protz.github.io/ocaml-installer/; follow the setup instructions and make sure all of the packages below are installed.
Note: on Windows 8.1 and above, the OCaml installer will fail to launch Cygwin's setup.exe. In that case, launch it manually (it has been downloaded to your desktop).
Here's the list of Cygwin packages you'll need (the installer doesn't pre-check all of them).
- automake
- diffutils
- libreadline
- make
- m4
- mingw64-x86_64-gcc-core
- mingw64-x86_64-gmp
- mingw64-x86_64-openssl
- mingw64-x86_64-pkg-config
- mingw64-x86_64-sqlite3
- patch
- rlwrap
- unzip
- wget
- git
Run the second part of the sanity check again, to make sure you still have one ocaml and one flexlink binary.
In Cygwin Terminal, run opam init, and decline to let it customize your ~/.bash_profile. Instead, add the following to your ~/.bashrc (c:\cygwin64\home\<yourlogin>\.bashrc) (DON't use notepad, use emacs or some other advanced editor, otherwise newline characters will be messed up):
export CAML_LD_LIBRARY_PATH=$HOME/.opam/system/lib/stublibs:/cygdrive/c/OCaml/lib/stublibs
export MANPATH=$HOME/.opam/system/man:$MANPATH
export PATH=$HOME/.opam/system/bin:/usr/x86_64-w64-mingw32/sys-root/mingw/bin/:$PATH
export CAMLP4LIB=C:/OCaml/lib/camlp4
Run source ~/.bashrc in any (open) terminals to get the new (proper) environment.
opam install depext-cygwinports
Theoretically not needed now that the x86_64-mingw32-* packages are in the mainstream Cygwin repo, but the special fixes in fdopen's repository won't kick in until this is installed.
Run opam install zarith batteries stdint fileutils sqlite3 yojson.
If opam fails to install a package (e.g. sqlite3), try again opam install sqlite3.
-
If OPAM complains that it cannot install a file into
~/.opam/system/binbecause it already exists, for instance:# install: cannot create regular file '/cygdrive/d/cygwin/home/protz/.opam/system/bin/bdump': File existsthen you're hitting https://github.com/ocaml/opam/issues/2313 and you need to remove locally the
package.installfile. In this case:rm ~/.opam/repo/default/packages/biniou/biniou.1.0.12/files/biniou.install -
If that still doesn't work, a very subtle solution involves running in a separate terminal:
protz@Joprotze-Z420:~/.opam/system/bin $ while true; do \rm bdump.exe; done -
If OPAM complains that the system dependency on GMP cannot be found, and if you're positive that the cygwin package
mingw64-x86_64-gmpis installed, then open the Cygwin terminal and fake the installation of OPAM package conf-gmp:$ opam install --fake conf-gmp -
If, building miTLS, you get:
** Cannot resolve symbols for C:/cygwin/home/protz/.opam/system/lib/sqlite3\libsqlite3_stubs.a(sqlite3_stubs.o): sqlite3_enable_load_extensionthen:
opam remove sqlite3 export SQLITE3_DISABLE_LOADABLE_EXTENSIONS=1 opam install sqlite3 -
OPAM pretends to call
curlbut really it's only callingwget; make surewgetis installed -
make sure your OCaml executable is the right one (
where ocaml) -
make sure
OCAMLLIBis properly set using a Windows-style path (e.g.C:\OCaml\lib). This is known to causeopam install sqlite3to fail. -
check the output of
ocamlopt -config(should containnative_c_compiler: x86_64-w64-mingw32-gcc -O -mms-bitfields -Wall -Wno-unused)
-
Installing ppx_deriving and friends: you need these two commands:
protz@Joprotze-Z420:~/.opam/system/lib $ find . -iname '*.cmxs' -exec chmod a+x {} \; protz@Joprotze-Z420:~/.opam/system/lib/ppx_deriving $ cp ppx_deriving ppx_deriving.exe -
Installing ctypes: first, you need the libffi library installed in Cygwin, but in a MinGW variant. So, you must start cygwin-setup-x86_64.exe and choose installation of a package named:
mingw64-x86_64-libffi(not simple "libffi"). After installing it, you can verify by typing in Cygwin Terminal:pkg-config --list-all(it should show "libffi").FIXME: trying to load ctypes in utop unfortunately fails for me for now (full transcript here):
utop # #require "ctypes.foreign";; Error: Reference to undefined global `Ctypes_closure_properties'There's some comment that "a static version of libffi" might work, but I don't know yet how to do this for use in utop.
-
Installing and running utop: After successfully installing through Cygwin Terminal with
opam install utop(note: you'll need the hint above in "Troubleshooting" about removing .install files), you will see a message:=-=- utop.1.19.3 installed successfully -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= => UTop does not work inside a cygwin terminal (mintty, urxvt,...). Use cmd.exe, ConsoleZ or a similar terminal emulator.so, you can't run utop in Cygwin Terminal, but you must do this in normal cmd.exe window. For this to work correctly, you must set your PATH properly. To make it slightly easier, while still in Cygwin Terminal, type the following:
cd $HOME && cmd /c start cmdIt should start a new cmd.exe window, with Cygwin environment variables already set (specifically, $HOME). There, you should be able to start utop by typing the following commands:
set PATH=%HOME%\.opam\system\bin;%PATH% set PATH=%HOME%\.opam\system\lib\stublibs;%PATH% utop -
Merlin works very well but does not install with my current installer.
I ran:
protz@Joprotze-Z420:~/Code/merlin (master) $ ./configure --prefix ~/.opam/system && make && make install
then I have in my ~/.vimrc the following, to make sure that ocamlmerlin can be found in all cases (Cygwin vs non-Cygwin on Windows, but also other setups):
execute "silent !which cygpath > /dev/null 2>&1"
if v:shell_error == "0"
let g:opamshare = system('cygpath $(opam config var share) | tr -d ''[:space:]''')
else
let g:opamshare = substitute(system('opam config var share'),'\n$','','''')
endif
execute "set rtp+=" . g:opamshare . "/merlin/vim"
execute "set rtp+=" . g:opamshare . "/ocamlmerlin/vim"
opam depext foobar should now be able to install the right Cygwin packages for your toolchain
See the solution here: https://gist.github.com/k-takata/9b8d143f0f3fef5abdab#solution-2-disable-db-in-etcnsswitchconf