# 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)`.