Compiling LÖVR
===

Compiling the LÖVR code yourself lets you create a custom LÖVR build so you can add your own
features or run it on other operating systems.  Below is a guide for setting up all the dependencies
and compiling the code on various types of systems.

Dependencies
---

LÖVR depends on the following libraries.  They are included as submodules in the `deps` directory of
the repository, so make sure you clone with the `--recursive` flag or run `git submodule update
--init` in an existing repository.

- Lua (5.1+) or LuaJIT (2.0+)
- GLFW (3.2+)
- OpenGL (3.3, ES3, or WebGL 2)
- OpenVR (1.0.9, for `lovr.headset`)
- Oculus SDK (optional, 1.26+)
- PhysicsFS (3+)
- OpenAL (1.17+ recommended for HRTF support)
- msdfgen
- ODE (for `lovr.physics`)
- Emscripten (optional, for compiling for web)

Windows
---

From the lovr folder, run these commands to create a build folder and compile the project using
CMake:

```
$ mkdir build
$ cd build
$ cmake ..
$ cmake --build .
```

The executable will then exist at `/path/to/lovr/build/Debug/lovr.exe`.  A LÖVR project (a folder
containing a `main.lua` script) can then be dropped onto `lovr.exe` to run it, or it can be run
via the command line as `lovr.exe path/to/project`.

macOS
---

Install the dependencies using your package manager of choice:

```
$ brew install glfw3 luajit physfs openal-soft ode libccd
```

Next, build using CMake, as above:

```
$ mkdir build
$ cd build
$ cmake ..
$ cmake --build .
```

The lovr executable should exist in `lovr/build` now.  It's recommended to set up an alias or
symlink so that this executable can be found in your PATH environment variable.  Once that's done,
you can run a project like this:

```
$ lovr /path/to/myGame
```

> You may need to set the `PKG_CONFIG_PATH` environment variable for OpenAL to be located properly.
> If you run into this, see [Troubleshooting](#troubleshooting) below for more info.

Linux
---

First, install the dependencies using your package manager of choice.

#### Arch Linux

```
$ pacman -S glfw-x11 luajit physfs openal ode
```

#### Debian/Ubuntu

```
$ sudo apt-get install build-essential cmake libglfw3-dev libluajit-5.1-dev libphysfs-dev libopenal-dev libode-dev
```

Then, build with CMake:

```
$ mkdir build
$ cd build
$ cmake ..
$ cmake --build .
```

On Linux, LÖVR needs to run within the Steam Runtime.  To do this, first [install
Steam](https://wiki.archlinux.org/index.php/Steam#Installation).  Next, [install the Steam udev
rules](https://github.com/ValveSoftware/SteamVR-for-Linux#usb-device-requirements).  Then, run LÖVR
within the Steam runtime:

```
$ ~/.steam/steam/ubuntu12_32/steam-runtime/run.sh lovr
```

If you receive errors related to `libstdc++`, set the `LD_PRELOAD` environment variable when running
the command:

```
$ LD_PRELOAD='/usr/$LIB/libstdc++.so.6 /usr/$LIB/libgcc_s.so.1' ~/.steam/steam/ubuntu12_32/steam-runtime/run.sh lovr
```

WebVR
---

First, install the Emscripten SDK.

Unix:

```
$ mkdir build
$ cd build
$ emcmake cmake ..
$ emmake make -j2
```

Windows (from a Visual Studio Command Prompt, make sure the Emscripten SDK is on PATH):

```
$ mkdir build
$ cd build
$ emcmake cmake -G "NMake Makefiles" ..
$ emmake nmake
```

The above commands will output `lovr.js`, `lovr.wasm`, and `lovr.html`.  The easiest way to run LÖVR
from here is to use `emrun`:

```
$ emrun --browser firefox lovr.html
```

To package a game, run:

```
$ python "$EMSCRIPTEN/tools/file_packager.py" game.data --no-heap-copy --preload /path/to/game@/ --js-output=game.js
```

Which will output `game.js` and `game.data`.  You can then include the `game.js` script on the HTML
page (before the lovr.js script tag) to run the project.

For an improved WebVR workflow with live-reloading, check out [`lovr-webvr-server`](https://github.com/bjornbytes/lovr-webvr-server/blob/master/views/index.ejs).

Android
---

See [`lovr-oculus-mobile`](https://github.com/mcclure/lovr-oculus-mobile) for instructions on
building LÖVR on Android.

Troubleshooting
---

- If you get "CMake no CMAKE_CXX_COMPILER found" on Windows, then install Visual Studio and create a
  blank C++ project, which will prompt you to install the compilers and tools necessary to compile
  LÖVR.
- On macOS, if you run into an error message about not being able to find OpenAL, make sure you've
  added the proper OpenAL directory (usually something like
  `/usr/local/opt/openal-soft/lib/pkgconfig`) to your `PKG_CONFIG_PATH` environment variable.
  Installing openal-soft with brew will print out a message telling you how to do this.
