# Build and run EMQ X on Windows

NOTE: The instructions and examples are based on Windows 10.

## Build Environment

### Visual studio for C/C++ compile and link

EMQ X includes Erlang NIF (Native Implmented Function) components, implemented
in C/C++. To compile and link C/C++ libraries, the easiest way is perhaps to
install Visual Studio.

Visual Studio 2019 is used in our tests.
If you are like me (@zmstone), do not know where to start,
please follow this OTP guide:
https://github.com/erlang/otp/blob/master/HOWTO/INSTALL-WIN32.md

NOTE: To avoid surprises, you may need to add below two paths to `Path` environment variable
and order them before other paths.

```
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29910\bin\Hostx64\x64
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build
```

Depending on your visual studio version and OS, the paths may differ.
The first path is for rebar3 port compiler to find `cl.exe` and `link.exe`
The second path is for Powershell or CMD to setup environment variables.

### Erlang/OTP

Install Erlang/OTP 23.2 from https://www.erlang.org/downloads
You may need to edit the `Path` environment variable to allow running
Erlang commands such as `erl` from powershell.

To validate Erlang installation in CMD or powershell:

* Start (or restart) CMD or powershell

* Execute `erl` command to enter Erlang shell

* Evaluate Erlang expression `halt().` to exit Erlang shell.

e.g.

```
PS C:\Users\zmsto> erl
Eshell V11.1.4  (abort with ^G)
1> halt().
```

### bash

All EMQ X build/run scripts are either in `bash` or `escript`.
`escript` is installed as a part of Erlang. To install a `bash`
environment in Windows, there are quite a few options.

Cygwin is what we tested with.

* Add `cygwin\bin` dir to `Path` environment variable
  To do so, search for Edit environment variable in control pannel and
  add `C:\tools\cygwin\bin` (depending on the location where it was installed)
  to `Path` list.

* Validate installation.
  Start (restart) CMD or powershell console and execute `which bash`, it should
  print out `/usr/bin/bash`

### Other tools

Some of the unix world tools are required to build EMQ X.  Including:

* git
* curl
* make
* jq
* zip / unzip

We recommend using [scoop](https://scoop.sh/), or [Chocolatey](https://chocolatey.org/install) to install the tools.

When using scoop:

```
scoop install git curl make jq zip unzip
```

## Build EMQ X source code

* Clone the repo: `git clone https://github.com/emqx/emqx.git`

* Start CMD or Powershell

* Execute `vcvarsall.bat x86_amd64` to load environment variables

* Change to emqx directory and execute `make`

### Possible errors

* `'cl.exe' is not recognized as an internal or external command`
  This error is likely due to Visual Studio executables are not set in `Path` environment variable.
  To fix it, either add path like `C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29910\bin\Hostx64\x64`
  to `Paht`. Or make sure `vcvarsall.bat x86_amd64` is executed prior to the `make` command

* `fatal error C1083: Cannot open include file: 'assert.h': No such file or directory`
  If Visual Studio is installed correctly, this is likely `LIB` and `LIB_PATH` environment
  variables are not set. Make sure `vcvarsall.bat x86_amd64` is executed prior to the `make` command

* `link: extra operand 'some.obj'`
  This is likely due ot the usage of GNU `lnik.exe` but not the one from Visual Studio.
  Exeucte `link.exe --version` to inspect which one is in use. The one installed from
  Visual Studio should print out `Microsoft (R) Incremental Linker`.
  To fix it, Visual Studio's bin paths should be ordered prior to Cygwin's (or similar installation's)
  bin paths in `Path` environment variable.

## Run EMQ X

To start EMQ X broker.

Execute `_build\emqx\rel\emqx>.\bin\emqx console` or `_build\emqx\rel\emqx>.\bin\emqx start` to start EMQ X.

Then execute `_build\emqx\rel\emqx>.\bin\emqx_ctl status` to check status.
If everything works fine, it should print out

```
Node 'emqx@127.0.0.1' 4.3-beta.1 is started
Application emqx 4.3.0 is running
```