Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Automate building of CouchDB from source on Windows, including all dependent libraries and binaries for a clean build against a single VC++ runtime.
Shell

This branch is even with gh-pages

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
bin
bits
.gitignore
README.md
downloads.md
downloads.md5
erlang.md
glazier.komodoproject
index.html

README.md

Why Glazier?

I first got involved with CouchDB around 0.7, and liked what I saw. Only having a low-spec Windows PC to develop on, and no CouchDB Cloud provider being available, I tried to build CouchDB myself. It was hard going, and most of the frustration was trying to get the core Erlang environment set up and working without needing to buy Microsoft's expensive but excellent Visual Studio tools myself. Once Erlang was working I found many of the pre-requisite modules such as cURL, Zlib, OpenSSL, Mozilla's SpiderMonkey JavaScript engine, and IBM's ICU were not available at a consistent compiler and VC runtime release.

Glazier is a set of related scripts and toolchains to ease that pain. It's not fully automated but most of the effort is only required once. I hope it simplifies using Erlang and CouchDB for you by giving you a consistent repeatable build environment.

Download Glazier scripts, tools, and source

  • download glazier latest
  • unpack it into c:\relax - you should have c:\relax\bin for example
  • download source & tools using aria, and then check MD5 hashes:

    pushd c:\relax
    path=c:\relax\bin;%path%
    aria2c.exe --force-sequential=false --max-connection-per-server=5 \
        --check-certificate=false --auto-file-renaming=false \
        --input-file=downloads.md --max-concurrent-downloads=5 \
        --dir=bits --save-session=bits/a2session.txt
    cd bits && md5sum.exe --check ..\downloads.md5
    

Install Compilers

Due to size, these are not downloaded in the bundle apart from mozilla & cygwin setup.

  • Install one of either Windows SDK 7.0, or 7.1, in either 32 or 64bit as appropriate for your platform using:
  • Run Windows Update for latest patches
  • Reboot
  • Download Mozilla toolkit from mozbuild and install per defaults
  • Install cygwin components, at least:
    • devel: ALL (or just the GCC and GCC C++ compilers and GNU auto)
    • editors: vim or emacs
    • utils: file

Initial Setup of Environment

Now that the compilers are installed, we need to set a few things up first:

  • start an SDK shell via setenv.cmd /Release /x86
  • run c:\relax\bin\setup.cmd once to set up links and environment variables

You should end up with something resembling this structure:

    Directory of C:\relax
    06/09/2011  10:41 p.m.    <DIR>          .
    06/09/2011  10:41 p.m.    <DIR>          ..
    06/09/2011  10:41 p.m.    <SYMLINKD>     bin [z:\r\glazier\bin]
    06/09/2011  10:41 p.m.    <SYMLINKD>     bits [z:\r\glazier\bits]
    03/09/2011  11:00 a.m.    <DIR>          release
    06/09/2011  10:40 p.m.    <SYMLINKD>     SDK [C:\Program Files\Microsoft SDKs\Windows\v7.1]
    06/09/2011  12:19 a.m.    <SYMLINKD>     tmp [C:\Users\couch\AppData\Local\Temp]
    06/09/2011  10:40 p.m.    <SYMLINKD>     VC [c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\..]

Install downloaded tools

The Microsoft Visual C++ runtime redistributales are bundled with Erlang and CouchDB by default.

  • for Windows SDK 7.1, copy vcredist_sdk71 to %relax%/
  • for Windows SDK 7.0, copy [vcredist_sdk70] to %relax%/

The express solution is just to use 7zip to unpack glazier tools inside %relax%. Or do it manually for the same result:

  • Add 7zip from c:\mozilla-build\7zip to your path
  • Innosoft's isetup to c:\opt\inno5
  • Nullsoft NSIS Installer to c:\opt\nsis
  • Add 7zip, Inno5, and nsis to the user environment PATH
  • using 7zip, extract and rename nasm to c:\opt\nasm
  • using 7zip, extract and rename cmake to c:\opt\cmake
  • mkdir c:\opt\strawberry && cd c:\opt\strawberry then using 7zip, extract Strawberry Perl

wxWidgets

  • wxWidgets source should already be downloaded into %relax%/bits/
  • start an SDK shell via setenv.cmd /Release /x86
  • run c:\relax\bin\build_wx.cmd to extract and build wxWidgets
  • NB Erlang build requires softlinked wxWidgets in /opt/local/pgm/wxWidgets-2.8.12 so we set that up too
  • check for errors

OpenSSL

Erlang requires finding OpenSSL in c:\OpenSSL so that's where we build to, using mount point to keep things clean=ish under %relax%.

  • OpenSSL source has already been downloaded
  • start an SDK shell via setenv.cmd /Release /x86
  • run c:\relax\bin\build_openssl.cmd to extract and build OpenSSL
  • it requires nasm, 7zip, strawberry perl all in place
  • check for errors
  • ensure Erlang can locate SSL with mklink /d c:\OpenSSL %relax%\OpenSSL
  • the resulting DLLs in c:\relax\openssl\bin need to be distributed with Erlang/OTP and therefore CouchDB as well.

Environment

Our goal is to get the path set up in this order:

  1. erlang and couchdb build helper scripts
  2. Microsoft VC compiler, linker, etc from Windows SDK
  3. cygwin path for other build tools like make, autoconf, libtool
  4. the remaining windows system path

The express start is to:

  • start an SDK shell via setenv.cmd /Release /x86
  • launch a cygwin erl-ified shell via c:\relax\bin\shell.cmd
  • go to next section to compile Erlang/OTP

Alternatively, you can launch your own cmd prompt, and ensure that your system path is correct first in the win32 side before starting cygwin. Once in cygwin go to the root of where you installed erlang, and run the Erlang/OTP script:

    eval `./otp_build env_win32`
    echo $PATH | /bin/sed 's/:/\n/g'
    which cl link mc lc mt

Confirm that output of which returns only MS versions from VC++ or the SDK. This is critical and if not correct will cause confusing errors much later on. Overall, the desired order for your $PATH is:

  • Erlang build helper scripts
  • Windows SDK tools, .Net framework
  • Visual C++ if installed
  • Ancillary Erlang and CouchDB packaging tools
  • Usual cygwin unix tools such as make, gcc
  • Ancillary glazier/relax tools for building dependent libraries
  • Usual Windows folders %windir%;%windir%\system32 etc
  • Various settings form the otp_build script

More details are at erlang INSTALL-Win32.md on github

Erlang

  • start an SDK shell via setenv.cmd /Release /x86
  • launch a cygwin erl-ified shell via c:\relax\bin\shell.cmd
  • choose your erlang version - R14B04 is strongly advised
  • unpack erlang source by cd $RELAX && tar xzf bits/otp_src_R14B04.tar.gz
  • customise Erlang by excluding unneeded Java interface and old GS GUI:

    cd $ERL_TOP
    tar xvzf /relax/bits/tcltk85_win32_bin.tar.gz
    echo "skipping gs" > lib/gs/SKIP
    echo "skipping jinterface" > lib/jinterface/SKIP
    
  • after validating the path, I usually run these two scripts which can take several hours on slower machines:

    erl_config.sh
    erl_build.sh
    
  • the output is logged into $ERL_TOP/build_*.txt if required

  • at this point I usually duplicate the OTP source tree for later

    robocopy $ERL_TOP /relax/release/$OTP_REL -mir
    

ICU 4.6.1

  • Download ICU 4.6.1 windows source from icu461zip
  • either re-use the "shell.cmd" from before, or open a Windows SDK prompt via setenv /release /x86 again

    %relax%\bin\build_icu.cmd
    
  • confirm that the resulting ICU DLLs have the appropriate manifests

  • NB for MSVC9 is supported only via cygwin; use icu461tgz instead and

    cd $RELAX
    DEST=`pwd`/icu
    tar xzf bits/icu4c-4_6_1-src.tgz
    cd $DEST/source && ./runConfigureICU Cygwin/MSVC --prefix=$DEST
    make && make install
    cp $DEST/lib/*.dll $DEST/bin/
    
  • compiling under cygwin is likely also to work for MSVC10 if a unified build process is required.

libcurl

libcurl is only required for versions of CouchDB below 1.1.1 where it is embedded in couchjs.exe. Trunk and future releases will have this as an optional include.

  • download libcurl source from (http://curl.haxx.se/)
  • NB when using SDK7.0 I needed to copy %windir%\system32\notepad.exe c:\relax\bin\bscmake.exe
  • either re-use the "shell.cmd" from before, or open a Windows SDK prompt via setenv /release /x86 again

    %relax%\bin\build_curl.cmd
    

Javascript

The Javascript engine used by CouchDB is Mozilla Spidermonkey v1.8.5 js185.

  • to build and install SpiderMonkey we use the mozilla tools chain.
  • run c:\mozilla-build\start-msvc10.bat even if you are on a 64-bit platform.
  • do a sanity check to confirm the MS build compilers are present via which cl link mc lc mt
  • you may need to fudge the path if cl.exe can't be found using PATH=$PATH:/c/relax/VC/VC/bin/:/c/relax/SDK/bin:/c/relax/VC/Common7/IDE:/c/relax/VC/VC/bin/amd64/:/c/relax/VC/VC/bin/x86_ia64/

    cd /c/relax
    tar xzf bits/js185-1.0.0.tar.gz
    cd ./js-1.8.5/js/src
    autoconf-2.13
    ./configure --enable-static --enable-shared-js
    make
    

Building CouchDB

Finally we are going to build Apache CouchDB... whew! Recapping, we should have:

  • erlang in /relax/otp_src_R14B04/release/win32 with a copy stashed nearby
  • openssl in /relax/openssl/{bin,lib}/{lib,ssl}eay32.{bin,lib}
  • libcurl in /relax/curl/lib/libcurl.lib
  • js library in /relax/js-1.8.5/js/src/dist/{bin,lib}/mozjs185-1.0.*
  • icu in /relax/icu/bin/icu*.dll

For CouchDB 1.1.1 or newer, two small filthy hacks are required, which is needed until configure.ac avoids detection of cygwin's curl and avoids assuming that help2man will be useful on Windows.

  • start an SDK shell via setenv.cmd /Release /x86
  • launch a cygwin erl-ified shell via c:\relax\bin\shell.cmd
  • apply the work-arounds:

    mv /usr/bin/curl-config /usr/bin/curl-config.dist
    mv /usr/bin/help2man /usr/bin/help2man.dist
    

There are two relevant scripts for building CouchDB:

  • couchdb_config.sh for CouchDB 1.1.1 or newer, supporting js185 only
  • couchdb_build.sh which compiles, and packages, CouchDB

Let's pull the CouchDB source from git repo:

    git clone http://git-wip-us.apache.org/repos/asf/couchdb.git \
      /relax/couchdb
    pushd /relax/couchdb && git checkout -b 1.2.0
    git clean -fdx && git reset --hard
    ./bootstrap
    /relax/bin/couchdb_config.sh && /relax/bin/couchdb_build.sh

A few minutes later, the release binaries should be made available.

Something went wrong with that request. Please try again.