# Building PolyGun
## `CMakeLists.txt` documentation
`CMakeLists.txt` has following variables which can be customized to your needs
(however if your configuration is pretty standard then everything should be detected automatically and nothing has to be set):
- `BUILD_FLAG_SUPPRESS_WARNING_MODE`, if true compiling with highest warning mode will be omitted.
- `BUILD_CLIENT`, if true client will be added to resulting executable.
	Please note that this will require all libraries which client depends on to be installed.
- `BUILD_SERVER`, if true server will be added to resulting executable.
	If building multi-configuration executable (i.e. client and server) then server can be
	started from command line using `server` argument, example: `./polygun server`.
	If `BUILD_SERVER` is only configuration enabled then executable name will be changed to `polygun_server`.
- `RENDERER_GL`, if true rendering with OpenGL support. This option is only valid if `BUILD_CLIENT` is enabled.
	By default enabled on every platform except Apple operating systems (i.e. macOS and iOS).
- `WINDOW_WIN32`, if true window creation using Win32 API will be enabled. It's Windows only and enabled there by default.
- `HAVE_STRSIGNAL`, if true `strsignal` from C library will be used, otherwise PolyGun will provide it's own
	implementation. Note that you shouldn't have to set this manually because it's automatically detected.
- `XCB_INCLUDE_DIRS`, only valid if `WINDOW_XCB` was set to `TRUE`, it's path to XCB headers.
- `XCB_LIBRARIES`, only valid if `WINDOW_XCB` was set to `TRUE`, it's path to XCB libraries separated by `;`
- `WAYLAND_INCLUDE_DIR`, only valid if `WINDOW_WAYLAND` was set to `TRUE`, it's path to Wayland headers.
- `WAYLAND_LIBRARIES`, only valid if `WINDOW_WAYLAND` was set to `TRUE`, it's path to Wayland libraries separated by `;`
- `OPENGL_INCLUDE_DIR`, path to OpenGL headers. It should point to folder which contains `GL` directory. You shouldn't have to set this because
	usually OpenGL is provided with C++ compiler.
- `OPENGL_LIBRARIES`, path to OpenGL libraries separated by `;`. Similar to OpenGL headers you shouldn't have to set this manually.
- `GLM_LIBRARIES`, path to GLM headers. This should point to folder with `glm` directory.
- `OPENAL_INCLUDE_DIR`, path to OpenAL headers. This should point to `AL` folder.
- `OPENAL_LIBRARY`, path to OpenAL library, either static or shared.
- `OGG_INCLUDE_DIR`, path to libogg headers. This should point to folder with `ogg` directory.
- `OGG_LIBRARY`, path to libogg library, either static or shared.
- `VORBIS_INCLUDE_DIR`, path to libvorbis headers. This should point to folder with `vorbis` directory.
- `VORBIS_LIBRARY`, path to libvorbis library, either static or shared.
- `PNG_INCLUDE_DIRS`, path to libpng headers. This should point to folder with `png.h` file.
- `PNG_LIBRARIES`, path to libpng library, either static or shared.
- `ZLIB_INCLUDE_DIRS`, path to zlib headers. This should point to folder with `deflate.h` file.
- `ZLIB_LIBRARIES`, path to zlib library, either static or shared.

## Required libraries
For `BUILD_CLIENT`:
- OpenGL, rendering via OpenGL api. [Required if `RENDERER_GL` is set to `TRUE`]
- [XCB](https://xcb.freedesktop.org), window creation using X11. [Required if `WINDOW_XCB` is set to `TRUE`]
- [GLM](https://glm.g-truc.net/0.9.9/index.html), vector and matrix maths. [Required]
- [OpenAL](https://www.openal.org) or [OpenAL Soft](https://openal-soft.org), playing sounds [Required].
- [libogg](https://www.xiph.org/ogg), loading Ogg files. [Required]
- [libvorbis](https://www.xiph.org/vorbis), decoding Vorbis encoded audio. libvorbisenc and libvorbisfile aren't needed. [Required]
- [libpng](http://www.libpng.org/pub/png/libpng.html), loading PNG images. [Required]
- [zlib](https://www.zlib.net), libpng dependency. [Required]
- Threads compatible with STL (for example pthreads or Windows threads). [Required]

For `BUILD_SERVER`:
- Threads compatible with STL (for example pthreads or Windows threads). [Required]
- [AngelScript](https://www.angelcode.com/angelscript/), server side scripting [Required]

If we forgot to mention some library then please create issue.

## Building
### GNU/Linux, Alpine Linux
1. Install required tools if you don't have them (you can use Clang instead of g++ or Ninja instead of GNU Make if you like):
   - for Debian based distributions use: `sudo apt install g++ make cmake git` or `sudo apt install clang ninja-build cmake git`.
   - for Fedora use: `sudo dnf install gcc-c++ make cmake git` or `sudo dnf install clang ninja-build cmake git`.
   - for openSUSE use: `sudo zypper install --no-recommends g++ make cmake git` or `sudo zypper install --no-recommends clang ninja cmake git`.
   - for Alpine Linux use: `sudo apk add g++ make cmake git` or `sudo apk add clang ninja-build cmake git`.
2. Clone repository with following command: `git clone http://git.cubesoftware.xyz:20524/kacperks/PolyGun.git`. You can add `--depth=1` argument
to reduce used disk space via not downloading entire git history.
3. Enter directory with downloaded PolyGun repository using `cd PolyGun`.
4. Install required libraries. Libraries may vary depending on what build configuration you will use. This tutorial assumes full build.
   - for Debian based distributions use: `sudo apt install libxcb-dev libglm-dev libopenal-dev libvorbis-dev libpng-dev`. `libogg-dev` and `libzlib-dev` will be
   installed automatically because they are dependencies of `libvorbis-dev` and `libpng-dev` respectively.
   - for Fedora use: `sudo dnf install libxcb-devel glm-devel openal-soft-devel libogg-devel libvorbis-devel libpng-devel`. `libz-devel` will be installed automatically
   because it's dependency of `libpng-devel`.
   - for openSUSE use: `sudo zypper install libx11-xcb-dev glm-devel libopenal-dev libogg libvorbis libpng`. `zlib` will be installed automatically because it's
   dependency of `libpng`
   - for Alpine Linux use: `sudo apk add libxcb-dev glm-dev openal-soft-dev libvorbis-dev libpng-dev`. `libogg-dev` and `zlib-dev` will be installed automatically
   because they are dependencies of `libvorbis-dev` and `libpng-dev` respectively.
   - (distribution agnositic) download and extract latest AngelScript source package to `external/angelscript` inside of repository root.
5. Make build directory using `mkdir build`.
6. Enter build directory using `cd build`.
7. Generate build files using `cmake ..` or `cmake .. -G Ninja` if you are using Ninja build system. You may want to add additional arguments to CMake, see *`CMakeLists.txt` documentation* section.
8. Build project using `make -j$(nproc)` or `ninja` depending on your selected build system.

### Windows with MSYS2
1. Install all the required libs through pacman. (see MSYS2 dependencies below)
2. Download and extract latest AngelScript source package to `external/angelscript` inside of repository root.
3. Clone master na go into the root dir.
4. Open MSYS2 MinGW64 terminal.
5. cmake . -G"MSYS Makefiles" -DBUILD_CLIENT=ON -DBUILD_SERVER=ON -DRENDERER_GL=ON 
6. make -j[how many processors]
7. Make sure to add `C:\msys64\mingw64\bin` (or wherever your MSYS2 is installed) to PATH if you're getting missing dll errors.

### MSYS2 dependencies install commands
```
pacman -S mingw-w64-x86_64-glm
pacman -S mingw-w64-x86_64-openal
pacman -S mingw-w64-x86_64-libogg
pacman -S mingw-w64-x86_64-libvorbis
pacman -S mingw-w64-x86_64-libpng
pacman -S mingw-w64-x86_64-zlib
```
If we forgot to mention some library then please create issue.

### Windows with Cygwin
1. Download Cygwin installer from [here](https://www.cygwin.com) and run it.
2. Follow installation util package selection screen
3. Select following programs (these are for 64-bit Windows, however you use any other architecture):
`cmake`, `make`, `git`, `mingw64-x86_64-gcc-core`, `mingw64-x86_64-gcc-g++`
4. Select following libraries (same as above, these are for 64-bit Windows):
`mingw64-x86_64-glm`, `mingw64-x86_64-libogg`, `mingw64-x86_64-libvorbis`, `mingw64-x86_64-libpng`,
`mingw64-x86_64-openal`
5. Open Cygwin terminal and change into desired directory
6. Clone repository with following command: `git clone http://git.cubesoftware.xyz:20524/PolyGun/PolyGun.git`. You can add `--depth=1` argument
to reduce used disk space via not downloading entire git history.
7. Download and extract latest AngelScript source package to `external/angelscript` inside of repository root.
8. Enter directory with downloaded PolyGun repository using `cd PolyGun`.
9. Make build directory using `mkdir build`.
10. Enter build directory using `cd build`.
11. Generate build files using `cmake ..`. You may want to add additional arguments to CMake, see *`CMakeLists.txt` documentation* section.
12. Build project using `make -j$(nproc)`.