<!--
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
-->
# Dependent library installation

## Windows

This section is used to compile and install the dependent libraries under
windows system from source codes. The following instructions ONLY work for Visual Studio 2015 as
previous VS does not support [C++11 features](https://msdn.microsoft.com/en-us/library/hh567368.aspx) well (including generic lambdas, auto, non-static
data member initializers). If you intend to generate a 32-bit/64-bit singa solution, please configure all the
VS projects for the dependent libraries as 32-bit/64-bit. This can be done by
"Configuration Manager" in VS 2015 or use corresponding generator in cmake. When compiling the following libraries, you
may get system-specific warnings/errors. Please fix them according to the
prompts by VS.

### Google Logging
The glog library is an optional library for singa project. But it is currently necessary for Window compilation.
Since the latest release version of glog will encounter error C2084 on sprintf function
under VS2015, we test the compilation and installation using the master branch from [github](https://github.com/google/glog).

Step 1: Download and decompress the source code. Or use `git clone
https://github.com/google/glog` to get the code.

Step 2: Open "glog.sln" file under project folder. You will get a conversion
dialog and please finish it by the prompts. Compile all the projects in the solution after
proper configuration, especially "libglog" and "libglog_static" projects.

Step 3: Copy all the header files and the entire directory named "glog" under
"src\windows\" folder into the installation include folder (or system folder).
Copy all the generated library files into the installation library folder (or
system folder).

Step 4: Done.


### Google protobuf

Tested on version 2.6.1:

Step 1: Download and decompress the source code.

Step 2: Open "protobuf.sln" file under "vsprojects" folder. You will get a conversion
dialog and please finish it by the prompts. Compile all the projects in the solution after proper
configuration. Especially "libprotobuf", "libprotobuf-lite", "libprotoc" and
"protoc" projects.

Step 3: Run "extract_includes.bat" script under "vsprojects" folder, you will
get a new "include" folder with all the headers.

Step 4: Copy the library files, such as "libprotobuf.lib",
"libprotobuf-lite.lib", "libprotoc.lib", etc., into your installation library folder (or
system folder). Copy the binary file "protoc" into your installation binary
folder (or system folder). Copy all the headers and folders in "include" folder into your
installation include folder (or system folder).

Step 5: Done.

### CBLAS

There are ready-to-use binary packages online
([link](https://sourceforge.net/projects/openblas/files/)). However, we still install
OpenBLAS with version 0.2.18 as test:

Step 1: Download and decompress the source code.

Step 2: Start a cmd window under the OpenBLAS folder then run the following
commands to generate the solution:

    $ md build $$ cd build
    $ cmake -G "Visual Studio 14" ..

Or run `cmake -G "Visual Studio 14 Win64"` as you wish.

Step 3: Install Perl into your system and put perl.exe on your path. Open "OpenBlas.sln" and build the solution, especially "libopenblas"
project.

Step 4: Copy the library files under "build\lib" folder and all header files
under OpenBLAS folder into installation library and include folders (or system
folders).

Step 5: Done.


## FAQ

1. Error C2375 'snprintf': redefinition; different linkage

    Add “HAVE_SNPRINTF” to “C/C++ - Preprocessor - Preprocessor definitions”

2. Error due to hash map

    Add "_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS" to Preprocessor Definitions.


