# Build instructions
## Table of content
- [Build using release artifacts](#build-using-release-artifacts)
- [Build from sources](#build-from-sources)
- [Build on Android](#build-on-android)
- [Build on Linux](#build-on-linux)
- [Build on Mac](#build-on-mac)
- [Build on Windows](#build-on-windows)
utymap is proven to work on the following platforms:
* **Windows**
* **Linux**
* **Mac**
* **Android**
There are two options for building utymap for Unity.
## Build using release artifacts
Download source code and platform specific archive with binaries from [the latest release](https://github.com/reinterpretcat/utymap/releases) and copy content of it to _unity/demo/Assets/Plugins_. Then just import Unity project from _unity/demo_ folder.
## Build from sources
Core library is written on C++11 and has some dependencies. The following versions are used in development environment:
* **CMake 3.1 or higher.** Some specific flags (CMAKE_CXX_STANDARD, POSITION_INDEPENDENT_CODE) are used.
* **Boost 1.55 or higher.** If you're not considering of running unit tests, then you don't need to build it as utymap uses boost's header only libraries (spirit, lexical_cast, property tree, etc.).
* ***[Optional]*** **Protobuf library and compiler 2.6.1 or other compatible.** Protobuf is used for parsing osm pbf files. Has to be compiled for target platform.
* ***[Optional]*** **zlib 1.2.8 or other compatible.** Used for osm pbf files decompression. Has to be compiled for target platform.
**Note:** Protobuf and zlib are required for importing map data from osm pbf format. If you don't need it, you can skip these dependencies by switching corresponding feature off in _core/CMakeLists.txt_
UtyMap.Unity is written on C# and has dependency on Unity3D specific dlls which can lead to some compiler errors if you have different Unity3D version. In this case, replace _UnityEditor.dll_ and _UnityEngine.dll_ in /unity/library/packages with appropriate versions of these dlls from your distribution.
Please follow OS specific instructions below.
### Build on Android
This page describes how to create an Android build for armeabi-v7a architecture using Android Studio with NDK support.
* Install boost. You don't need to compile boost for target architecture as utymap uses header-only libs (e.g. spirit, lexical_cast) If cmake cannot find boost, specify path explicitly in _android/app/CMakeLists.txt_:
```
set (BOOST_ROOT your_absolute_path_to_boost)
set (Boost_INCLUDE_DIR ${BOOST_ROOT})
```
* Import project from utymap's android folder using Android Studio
* Click Make Project button in IDE

* Once library is built, copy it from _android/app/build/intermediates/cmake/debug/obj/armeabi-v7a_ to _Assets/Plugins/Android/libs/armeabi-v7a_.
* Compile UtyMap.Unity if needed using mono or .net framework and copy output library to _Assets/Plugins_
* Import Unity3d project from demo _folder_ using Unity Editor.
* Replace TouchScript plugin with the version built for Android platform (you can use dll from the latest release)
**Note:** Reconfigure unity specific settings if needed (Player Settings -> Configuration; Write Access = SDCard, Device Filter = ARMv7)
**Note:** Do not forget to remove unused files in _StreamingAssets_ folder as they are embedded to apk.
**Note:** Import from OSM Pbf format is disabled by default as it requires compiling protobuf and zlib for armeabi-v7a. This overcomplicates setup for most users
**Note:** More details about android plugins for Unity can be found here: https://docs.unity3d.com/Manual/PluginsForAndroid.html
### Build on Linux
Library is tested with gcc-4.9 and clang-3.7 on Ubuntu 16.04/12.04. If you have some issues, you may check .travis.yml file for details.
* Install dependencies
``` bash
#update repositories: this is for ubuntu precise distributive
git clone https://github.com/reinterpretcat/utymap.git
sudo -E apt-add-repository -y "ppa:kalakris/cmake"
sudo -E apt-add-repository -y "ppa:george-edison55/precise-backports"
sudo -E apt-add-repository -y "ppa:ubuntu-toolchain-r/test"
sudo -E apt-add-repository -y "ppa:boost-latest/ppa"
sudo -E apt-get -yq update
#install
sudo -E apt-get -yq --no-install-suggests --no-install-recommends --force-yes
install cmake cmake-data zlib1g-dev libprotobuf-dev protobuf-compiler
libboost1.55-all-dev gcc-4.9 g++-4.9
```
* Build core library
``` bash
# ensure that correct compiler is selected
if [ "$CXX" = "g++" ]; then export CXX="g++-4.9" CC="gcc-4.9"; fi
cd core
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make
```
* Copy core library
``` bash
cp shared/libUtyMap.Shared.so ../../unity/Assets/Plugins/libUtyMap.Shared.so
```
* Build and copy unity library
``` bash
xbuild /p:Configuration=Release UtyMap.Unity.sln
cp UtyMap.Unity/bin/Release/UtyMap.Unity.dll ../../unity/Assets/Plugins/
```
* Import Unity3d project from demo folder using Unity Editor. If you linked dependencies (protobuf/zlib) dynamically ensure that they are accessible by Unity3D.
### Build on Mac
Tested on 10.11.6
# get the repository
git clone https://github.com/reinterpretcat/utymap.git
cd utymap
# install the required dependencies (get from http://brew.sh if you don't already have it)
brew install cmake boost protobuf
# set up a clean build directory
mkdir core/build
cd core/build
# in ./core/build use cmake to generate an .xcodeproj file
cmake -G Xcode ..
# in ./core/build use xcode's command line to build the dylib
xcodebuild -project UtyMap.xcodeproj -target ALL_BUILD -configuration Release
# change the libUtyMap.Shared.dylib to UtyMap.Shared.bundle and more to the project folder
cp shared/Release/libUtyMap.Shared.dylib ../../unity/demo/Assets/Plugins/UtyMap.Shared.bundle
# switch te the unity/library directory
cd ../../unity/library/
# build with mono's xbuild
xbuild /p:Configuration=Release UtyMap.Unity.sln
# copy all the Uty dll files
cp UtyMap.Unity/bin/Release/Uty*.dll ../../unity/demo/Assets/Plugins/
**NOTE** Instructions are provided by [RMKD](https://github.com/RMKD)
### Build on Windows
Visual Studio 2013 is proven for usage on development environment.
* Download and build/install dependencies.
See https://github.com/reinterpretcat/utymap/wiki#build-from-sources
* Make sure that Cmake can find dependencies.
You can register dependencies in your PATH variable or update main CMakeLists.txt, e.g.:
```
set(BOOST_ROOT c:/_libs/boost_1_59_0)
set(BOOST_LIBRARYDIR ${BOOST_ROOT}/stage/lib)
set(PROTOBUF_INCLUDE_DIR c:/_libs/protobuf-2.6.1/src)
set(PROTOBUF_LIBRARY c:/_libs/protobuf-2.6.1/vsprojects/x64/Debug/libprotobuf.lib)
set(PROTOBUF_PROTOC_EXECUTABLE c:/_libs/protobuf-2.6.1/vsprojects/x64/Debug/protoc.exe)
set(ZLIB_INCLUDE_DIR c:/_libs/zlib-1.2.8)
set(ZLIB_LIBRARY c:/_libs/zlib-1.2.8/build/Debug/zlibd.lib)
```
* Create Visual Studio project by make:
``` shell
cd core
mkdir build
cd build
\cmake.exe -G "Visual Studio 12 Win64" ..
```
* Open created solution and build all projects.
* Copy UtyMap.Shared.dll. This file is build artefact in build/shared directory and should be copied into unity/Assets/Plugins directory. Ensure that zlib.dll (or zlibd.dll) is also there or in your PATH variable.
* Build UtyMap.Unity solution and copy output dll to Plugins folder.
* Import Unity3d example project from demo folder.
Launch Unity Editor and open unity folder as existing project.