| <!--toc-->
 | 
	
	
		| ## Introduction
 | 
	
	
		| 
 | 
	
	
		| In general build on Windows using Microsoft Visual Studio is quite complex due to several factors:
 | 
	
	
		| 
 | 
	
	
		| 1. Lack of easily accessible already build libraries in both debug and release variants for your MSVC version
 | 
	
	
		| 2. Need of strict debug/release separation
 | 
	
	
		| 
 | 
	
	
		| 
 | 
	
	
		| So in order to make your life while building CppCMS simpler I suggest following rules:
 | 
	
	
		| 
 | 
	
	
		| 1. Keep strict separation of debug and release installations and 32/64 bit architectures, for example
 | 
	
	
		| 
 | 
	
	
		|         c:\cppcms_deps\x64\Debug
 | 
	
	
		|         c:\cppcms_deps\x64\Release
 | 
	
	
		|         c:\cppcms_deps\x86\Debug
 | 
	
	
		|         c:\cppcms_deps\x86\Release
 | 
	
	
		| 
 | 
	
	
		|     Note: pcre, icu and zlib support debug/release mangling of the libraries/dlls for debug/release flavor, but OpenSSL does not. So I strongly recommend to use separate trees to ensure safety.
 | 
	
	
		| 
 | 
	
	
		| 2. When building with CMake always use "NMake Makefiles" generator to prevent collisions of debug/release methods
 | 
	
	
		| 3. Start from basic dependencies zlib and pcre that can be built using CMake than go with more complex ones like OpenSSL and ICU if needed.
 | 
	
	
		| 
 | 
	
	
		| 
 | 
	
	
		| ## Before We Begin
 | 
	
	
		| 
 | 
	
	
		| ## Building Dependencies 
 | 
	
	
		| 
 | 
	
	
		| 1. Install Visual Studio or Visual Studio build tools
 | 
	
	
		| 2. Install CMake, make sure it is in global path
 | 
	
	
		| 3. Install Python 2.x version, make sure it is in global path
 | 
	
	
		| 4. Optionally install git if you want to build upstream branches.
 | 
	
	
		| 
 | 
	
	
		| Checks: open cmd and try to run cmake, python and optionally git - see if it works.
 | 
	
	
		| 
 | 
	
	
		| And finally make sure the directories you are building in are not scanned by anti-virus - otherwise you may get some build failures - due to files being locked by AV.
 | 
	
	
		| 
 | 
	
	
		| Note: in all builds we will use Visual Studio console - open one for correct architecture.
 | 
	
	
		| 
 | 
	
	
		| For example: 
 | 
	
	
		| 
 | 
	
	
		| - MSVC 2017 64 bit builds open: `x64 Native Tools Command Prompt for VS 2017`
 | 
	
	
		| - MSVC 2017 32 bit builds open: `x86 Native Tools Command Prompt for VS 2017`
 | 
	
	
		| 
 | 
	
	
		| I assume during this tutorial that you work in one of such a consoles.
 | 
	
	
		| 
 | 
	
	
		| ## Mandatory Dependencies
 | 
	
	
		| 
 | 
	
	
		| ### PCRE
 | 
	
	
		| 
 | 
	
	
		| PCRE comes with CMake build system, however building it correctly may be somewhat tricky.
 | 
	
	
		| 
 | 
	
	
		| Download the latest version of PCRE  8.x. Do not use PCRE2, it isn't supported.
 | 
	
	
		| 
 | 
	
	
		| Important options to note:
 | 
	
	
		| 
 | 
	
	
		| 1. Use "NMake Makefiles" generator, default generator is multi flavor one and much harder to use properly.
 | 
	
	
		| 2. Make sure you **explicitly** specify Release/Debug flavor `-DCMAKE_BUILD_TYPE=Release`
 | 
	
	
		| 3. Build Shared version of PCRE (i.e. dll) `-DBUILD_SHARED_LIBS=ON`
 | 
	
	
		| 4. Make sure you put `-DPCRE_SUPPORT_UNICODE_PROPERTIES=ON` option on to enable utf-8 support - otherwise regex tests will fail
 | 
	
	
		| 
 | 
	
	
		| Step by step in the console:
 | 
	
	
		| 
 | 
	
	
		| Release:
 | 
	
	
		| 
 | 
	
	
		|     cd \path\to\pcre\soures
 | 
	
	
		|     mkdir msvc-release-x64
 | 
	
	
		|     cd msvc-release-x64
 | 
	
	
		|     cmake -DBUILD_SHARED_LIBS=ON  -DPCRE_SUPPORT_UNICODE_PROPERTIES=ON  -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=c:\cppcms_deps\x64\Release  ..
 | 
	
	
		|     nmake
 | 
	
	
		|     nmake install
 | 
	
	
		|     cd ..
 | 
	
	
		| 
 | 
	
	
		| Debug:
 | 
	
	
		| 
 | 
	
	
		|     cd \path\to\pcre\soures
 | 
	
	
		|     mkdir msvc-debug-x64
 | 
	
	
		|     cd msvc-debug-x64
 | 
	
	
		|     cmake -DBUILD_SHARED_LIBS=ON  -DPCRE_SUPPORT_UNICODE_PROPERTIES=ON  -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=c:\cppcms_deps\x64\Debug  ..
 | 
	
	
		|     nmake
 | 
	
	
		|     nmake install
 | 
	
	
		|     cd ..
 | 
	
	
		|   
 | 
	
	
		| 
 | 
	
	
		| ### zlib
 | 
	
	
		| 
 | 
	
	
		| Fortunately latest zlib versions come with CMake support making it much easier to build with Visual Studio.
 | 
	
	
		| 
 | 
	
	
		| 1. Use "NMake Makefiles" generator, default generator is multi version and much trickier to use.
 | 
	
	
		| 2. Make sure you **explicitly** specify Release/Debug flavor `-DCMAKE_BUILD_TYPE=Release`
 | 
	
	
		| 2. Build Shared version of zlib (i.e. dll) `-DBUILD_SHARED_LIBS=ON`
 | 
	
	
		| 
 | 
	
	
		| 
 | 
	
	
		| Step by step:
 | 
	
	
		| 
 | 
	
	
		| Open Visual studio command prompt, for example `x64 Native Tools Command Prompt for VS 2017` or `x86 Native Tools Command Prompt for VS 2017` and change directory to location of zlib sources. Create build directory and run the commands:
 | 
	
	
		| 
 | 
	
	
		| For example for x64 build
 | 
	
	
		| 
 | 
	
	
		| Release
 | 
	
	
		| 
 | 
	
	
		|     mkdir msvc-release-x64
 | 
	
	
		|     cd msvc-release-x64
 | 
	
	
		|     cmake -DBUILD_SHARED_LIBS=ON  -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=c:\cppcms_deps\x64\Release  ..
 | 
	
	
		|     nmake
 | 
	
	
		|     nmake install
 | 
	
	
		|     cd ..
 | 
	
	
		| 
 | 
	
	
		| Debug
 | 
	
	
		| 
 | 
	
	
		|     mkdir msvc-debug-x64
 | 
	
	
		|     cd msvc-debug-x64
 | 
	
	
		|     cmake -DBUILD_SHARED_LIBS=ON -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=c:\cppcms_deps\x64\Debug  ..
 | 
	
	
		|     nmake
 | 
	
	
		|     nmake install
 | 
	
	
		|     cd ..
 | 
	
	
		|   
 | 
	
	
		| 
 | 
	
	
		| ### Checking the build results.
 | 
	
	
		| 
 | 
	
	
		| After installation of PCRE and zlib you need to get structure like this:
 | 
	
	
		| 
 | 
	
	
		|     c:\cppcms_deps\x64\Release
 | 
	
	
		|     c:\cppcms_deps\x64\Release\include
 | 
	
	
		|     c:\cppcms_deps\x64\Release\include\zlib.h
 | 
	
	
		|     c:\cppcms_deps\x64\Release\include\pcre.h
 | 
	
	
		|     ...
 | 
	
	
		|     c:\cppcms_deps\x64\Release\lib
 | 
	
	
		|     c:\cppcms_deps\x64\Release\lib\zlib.lib
 | 
	
	
		|     c:\cppcms_deps\x64\Release\lib\pcre.lib
 | 
	
	
		|     ...
 | 
	
	
		|     c:\cppcms_deps\x64\Release\bin
 | 
	
	
		|     c:\cppcms_deps\x64\Release\bin\zlib1.dll
 | 
	
	
		|     c:\cppcms_deps\x64\Release\bin\pcre.dll
 | 
	
	
		|     ...
 | 
	
	
		| 
 | 
	
	
		|     c:\cppcms_deps\x64\Debug
 | 
	
	
		|     c:\cppcms_deps\x64\Debug\include
 | 
	
	
		|     c:\cppcms_deps\x64\Debug\include\zlib.h
 | 
	
	
		|     c:\cppcms_deps\x64\Debug\include\pcre.h
 | 
	
	
		|     ...
 | 
	
	
		|     c:\cppcms_deps\x64\Debug\lib
 | 
	
	
		|     c:\cppcms_deps\x64\Debug\lib\zlibd.lib
 | 
	
	
		|     c:\cppcms_deps\x64\Debug\lib\pcred.lib
 | 
	
	
		|     ...
 | 
	
	
		|     c:\cppcms_deps\x64\Debug\bin
 | 
	
	
		|     c:\cppcms_deps\x64\Debug\bin\zlibd1.dll
 | 
	
	
		|     c:\cppcms_deps\x64\Debug\bin\pcred.dll
 | 
	
	
		| 
 | 
	
	
		| Note - the DLLs and libs with "d" suffix are placed in debug location.
 | 
	
	
		| 
 | 
	
	
		| 
 | 
	
	
		| ## Optional Dependencies 
 | 
	
	
		| 
 | 
	
	
		| ### OpenSSL
 | 
	
	
		| 
 | 
	
	
		| *Warning:* OpenSSL does not mangle its Debug and Release flavors - so make sure you have a separate install prefix for two OpenSSL flavors and never mix them!
 | 
	
	
		| 
 | 
	
	
		| First of all you need to install perl as it is basic building and configuration tool. ActivePerl is recommended. Make sure it is in system path. Note: msys2 perl or cygwin perl does not work.
 | 
	
	
		| 
 | 
	
	
		| Note: Make sure you open correct MSVC console for x64 and x86 builds. 
 | 
	
	
		| 
 | 
	
	
		| For 64 bit release build run the command:
 | 
	
	
		| 
 | 
	
	
		|     perl Configure VC-WIN64A no-asm --prefix=c:\cppcms_deps\x64\Release --openssldir=c:\cppcms_deps\x64\Release
 | 
	
	
		| 
 | 
	
	
		| For 64 bit debug build run the command
 | 
	
	
		| 
 | 
	
	
		|     perl Configure debug-VC-WIN64A no-asm --prefix=c:\cppcms_deps\x64\Release --openssldir=c:\cppcms_deps\x64\Release
 | 
	
	
		| 
 | 
	
	
		| For 32 bit release build run the command:
 | 
	
	
		| 
 | 
	
	
		|     perl Configure VC-WIN32 no-asm --prefix=c:\cppcms_deps\x86\Release --openssldir=c:\cppcms_deps\x86\Release
 | 
	
	
		| 
 | 
	
	
		| For 32 bit debug build run the command
 | 
	
	
		| 
 | 
	
	
		|     perl Configure debug-VC-WIN32 no-asm --prefix=c:\cppcms_deps\x86\Debug --openssldir=c:\cppcms_deps\x86\Debug
 | 
	
	
		| 
 | 
	
	
		| Afterwards run:
 | 
	
	
		| 
 | 
	
	
		|     nmake
 | 
	
	
		|     nmake install
 | 
	
	
		| 
 | 
	
	
		| And between flavors make sure you run
 | 
	
	
		| 
 | 
	
	
		|     nmake distclean
 | 
	
	
		| 
 | 
	
	
		| 
 | 
	
	
		| Notes:
 | 
	
	
		| 
 | 
	
	
		| - `VC-WIN64A` and `debug-VC-WIN64A` are 64 bit build flavors for release and debug
 | 
	
	
		| - `VC-WIN32` and `debug-VC-WIN32` are32 bit build flavors for release and debug
 | 
	
	
		| - no-asm - disable NASM dependency - not really needed
 | 
	
	
		| - `--prefix` and `--openssldir` are location of build results
 | 
	
	
		| 
 | 
	
	
		| 
 | 
	
	
		| ### ICU
 | 
	
	
		| 
 | 
	
	
		| Several notes before building ICU on Windows.
 | 
	
	
		| 
 | 
	
	
		| 1. Don't use official builds from ICU website - it does not contain debug version and are build for only 1 specific MSVC versions.
 | 
	
	
		| 2. You can try get ready libraries there: <https://www.npcglib.org/~stathis/blog/precompiled-icu/> however the site by not be updated or have variants for your version of MSVC.
 | 
	
	
		| 3. If you build ICU use cygwin/MSVC combination, do not use provided MSVC solution.
 | 
	
	
		| 
 | 
	
	
		| #### Using Downloadable binaries
 | 
	
	
		| 
 | 
	
	
		| You can get them there: https://www.npcglib.org/~stathis/blog/precompiled-icu
 | 
	
	
		| You can get them there: <https://www.npcglib.org/~stathis/blog/precompiled-icu>
 | 
	
	
		| 
 | 
	
	
		| You need to put the include/bin/lib files to your tree according to correct paths debug/release and 32/64 bit. For example copy following:
 | 
	
	
		| 
 | 
	
	
		| Headers:
 | 
	
	
		| 
 | 
	
	
		|     icu-59.1-vs2017/include/unicode -> 
 | 
	
	
		|        c:\cppcms_deps\x64\Release\include\unicode
 | 
	
	
		|        c:\cppcms_deps\x64\Debug\include\unicode
 | 
	
	
		|        c:\cppcms_deps\x86\Release\include\unicode
 | 
	
	
		|        c:\cppcms_deps\x86\Debug\include\unicode
 | 
	
	
		|         
 | 
	
	
		| Import Libraries:
 | 
	
	
		| 
 | 
	
	
		|     icu-59.1-vs2017/include/lib/*d.lib -> 
 | 
	
	
		|        c:\cppcms_deps\x86\Debug\lib
 | 
	
	
		|     icu-59.1-vs2017/include/lib/*.lib ->  # without d
 | 
	
	
		|        c:\cppcms_deps\x86\Release\lib
 | 
	
	
		|     icu-59.1-vs2017/include/lib64/*d.lib -> 
 | 
	
	
		|        c:\cppcms_deps\x64\Debug\lib
 | 
	
	
		|     icu-59.1-vs2017/include/lib64/*.lib ->  # without d
 | 
	
	
		|         c:\cppcms_deps\x64\Release\lib
 | 
	
	
		| 
 | 
	
	
		| DLLs:
 | 
	
	
		| 
 | 
	
	
		|         icu-59.1-vs2017/include/bin/*d59.dll -> 
 | 
	
	
		|            c:\cppcms_deps\x86\Debug\bin
 | 
	
	
		|         icu-59.1-vs2017/include/bin/*59.dll ->  # without d
 | 
	
	
		|            c:\cppcms_deps\x86\Release\bin
 | 
	
	
		|         icu-59.1-vs2017/include/bin64/*d59.dll -> 
 | 
	
	
		|            c:\cppcms_deps\x64\Debug\bin
 | 
	
	
		|         icu-59.1-vs2017/include/bin64/*59.dll ->  # without d
 | 
	
	
		|            c:\cppcms_deps\x64\Release\bin
 | 
	
	
		| 
 | 
	
	
		| 
 | 
	
	
		| This may save you the hassle of building ICU.
 | 
	
	
		| 
 | 
	
	
		| #### Building ICU
 | 
	
	
		| 
 | 
	
	
		| Note instructions are based on instructions from there: <https://wiki.qt.io/Compiling-ICU-with-MSVC>
 | 
	
	
		| 
 | 
	
	
		| Steps to build:
 | 
	
	
		| 
 | 
	
	
		| 1. Download icu-xx-src.zip. Note **zip**, not _tgz_. The tgz does not contain all files for Windows build
 | 
	
	
		| 2. Install cygwin - only basic packages are needed: `make`, `dos2unix` and `binutils`.
 | 
	
	
		| 3. Open Visual Studio console and configure path to location of cygwin\bin directory, so bash and other tools will be accessible:
 | 
	
	
		|     
 | 
	
	
		|         set PATH=%PATH%;c:\cygwin\bin
 | 
	
	
		| 
 | 
	
	
		|     This way you can run cygwin commands from MSVC command line
 | 
	
	
		| 
 | 
	
	
		| 3. Go to source directory of the icu package and fix line encodings, otherwise bash will not work:
 | 
	
	
		| 
 | 
	
	
		|         dos2unix *
 | 
	
	
		|         dos2unix -f configure
 | 
	
	
		| 
 | 
	
	
		| 4. For release build run:
 | 
	
	
		| 
 | 
	
	
		|         bash runConfigureICU Cygwin/MSVC --prefix=/cygdrive/c/cppcms_deps/x64/Release
 | 
	
	
		|         make
 | 
	
	
		|         make install
 | 
	
	
		|         make distclean
 | 
	
	
		| 
 | 
	
	
		|     Distclean will allow to run debug configuration smoothly. Node cygwin style path to installation location: `/cygdrive/c/cppcms_deps/x64/Release`
 | 
	
	
		| 
 | 
	
	
		| 5. For debug build run
 | 
	
	
		| 
 | 
	
	
		|         bash runConfigureICU --enable-debug  --disable-release Cygwin/MSVC --prefix=/cygdrive/c/cppcms_deps/x64/Debug
 | 
	
	
		|         make
 | 
	
	
		|         make install
 | 
	
	
		|         make distclean
 | 
	
	
		| 
 | 
	
	
		|     Note `--enable-debug  --disable-release` must go **before** `Cygwin/MSVC` - otherwise you'll get release binaries
 | 
	
	
		| 6. Note, the installation script installs dlls to the same location as lib, so you need to move them from `c:\cppcms_deps\x64\(Release|Debug)\lib` to `c:\cppcms_deps\x64\(Release|Debug)\bin`
 | 
	
	
		| 
 | 
	
	
		| Now you have working ICU.
 | 
	
	
		| 
 | 
	
	
		| 
 | 
	
	
		| ## Building CppCMS
 | 
	
	
		| 
 | 
	
	
		| Several notes when building using MSVC:
 | 
	
	
		| 
 | 
	
	
		| 1. Only "NMake Makefiles" generator is supported
 | 
	
	
		| 2. You need to specify `-DCMAKE_BUILD_TYPE=Debug` or `-DCMAKE_BUILD_TYPE=RelWithDebInfo` explicitly since default is Debug for MSVC. 
 | 
	
	
		| 2. You also recommend to add `-DDISABLE_STATIC=ON` since on Windows only dll version allows to build dynamically loadable views and use plugins.
 | 
	
	
		| 
 | 
	
	
		| So open the VS console, go to cppcms source directory and run configuration and build:
 | 
	
	
		| 
 | 
	
	
		| ### Release
 | 
	
	
		| 
 | 
	
	
		| Release build
 | 
	
	
		| 
 | 
	
	
		|     mkdir msvc-x64-rel
 | 
	
	
		|     cd msvc-x64-rel
 | 
	
	
		|     cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=RelWithDebInfo -DDISABLE_STATIC=ON -DCMAKE_INCLUDE_PATH=c:\cppcms_deps\x64\Release\include -DCMAKE_LIBRARY_PATH=c:\cppcms_deps\x64\Release\lib 
 | 
	
	
		| -DCMAKE_INSTALL_PREFIX=c:\cppcms_deps\x64\Release ..
 | 
	
	
		|     cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=RelWithDebInfo -DDISABLE_STATIC=ON -DCMAKE_INCLUDE_PATH=c:\cppcms_deps\x64\Release\include -DCMAKE_LIBRARY_PATH=c:\cppcms_deps\x64\Release\lib -DCMAKE_INSTALL_PREFIX=c:\cppcms_deps\x64\Release ..
 | 
	
	
		|     nmake 
 | 
	
	
		| 
 | 
	
	
		| Testing:
 | 
	
	
		|   
 | 
	
	
		|   set PATH=%PATH%;c:\cppcms_deps\x64\Release\bin;.\booster\
 | 
	
	
		|     set PATH=%PATH%;c:\cppcms_deps\x64\Release\bin;.\booster\
 | 
	
	
		|     nmake test 
 | 
	
	
		| 
 | 
	
	
		| Installation:
 | 
	
	
		| 
 | 
	
	
		|     nmake install
 | 
	
	
		| 
 | 
	
	
		| ### Debug
 | 
	
	
		| 
 | 
	
	
		| Debug build
 | 
	
	
		| 
 | 
	
	
		|     mkdir msvc-x64-rel
 | 
	
	
		|     cd msvc-x64-deb
 | 
	
	
		|     cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug -DDISABLE_STATIC=ON -DCMAKE_INCLUDE_PATH=c:\cppcms_deps\x64\Debug\include -DCMAKE_LIBRARY_PATH=c:\cppcms_deps\x64\Debug\lib 
 | 
	
	
		| -DCMAKE_INSTALL_PREFIX=c:\cppcms_deps\x64\Debug ..
 | 
	
	
		|     cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug -DDISABLE_STATIC=ON -DCMAKE_INCLUDE_PATH=c:\cppcms_deps\x64\Debug\include -DCMAKE_LIBRARY_PATH=c:\cppcms_deps\x64\Debug\lib -DCMAKE_INSTALL_PREFIX=c:\cppcms_deps\x64\Debug ..
 | 
	
	
		|     nmake 
 | 
	
	
		| 
 | 
	
	
		| Testing:
 | 
	
	
		|   
 | 
	
	
		|   set PATH=%PATH%;c:\cppcms_deps\x64\Debug\bin;.\booster\
 | 
	
	
		|     set PATH=%PATH%;c:\cppcms_deps\x64\Debug\bin;.\booster\
 | 
	
	
		|     nmake test 
 | 
	
	
		| 
 | 
	
	
		| Installation:
 | 
	
	
		| 
 | 
	
	
		|     nmake install
 | 
	
	
		| 
 | 
	
	
		| 
 | 
	
	
		| And now start development using CppCMS
 | 
	
	
		| 
 | 
	
	
		| ## References
 | 
	
	
		| 
 | 
	
	
		| 1. <http://developer.covenanteyes.com/building-openssl-for-visual-studio/>
 | 
	
	
		| 2. <https://wiki.qt.io/Compiling-ICU-with-MSVC>
 | 
	
	
		| 3. <https://www.npcglib.org/~stathis/blog/precompiled-icu/>
 | 
	
	
		| 
 | 
	
	
		| 
 | 
	
	
		| 
 | 
	
	
		|  |