# Compiling

## Getting the dependencies

To compile SHOT you need to have the following component libraries available on your system.

* **A solver for mixed-integer linear programming (MILP) problems.** SHOT supports the open-source solver Cbc (2.10 or newer), and the commercial solvers CPLEX (12.8 or newer) and Gurobi (8.0 or newer). If you are an academic user, you can download free versions of both CPLEX and Gurobi.
* **A solver for nonlinear programming (NLP) problems.** SHOT currently supports only Ipopt (3.12 or newer). If you call SHOT from GAMS or by reading a GAMS-model file in SHOT, you can also use any licensed NLP solver available in GAMS.

### Compiling Cbc

Instructions for compiling Cbc available at <https://github.com/coin-or/Cbc/>.

### Compiling Ipopt

Instructions for compiling Ipopt available at <https://github.com/coin-or/Ipopt>.

## Downloading the source code

Clone SHOT with git

```
git clone https://www.github.com/coin-or/SHOT --recursive
```

&#x20;or manually downloading the source code from [Github](https://www.github.com/coin-or/SHOT).&#x20;

{% hint style="info" %}
Note that there are dependencies in SHOT that utilize git submodule functionality; this is the reason for the `--recursive` flag, which will automatically clone these dependencies as well.
{% endhint %}

## Configuring and compiling SHOT

SHOT utilizes CMake to generate the build system. The settings for CMake are specified in the file `CMakeLists.txt` that is available in the root SHOT folder you downloaded in step 2.&#x20;

Normally you would not need to edit the `CMakeLists.txt` file; instead settings can be provided as arguments when calling CMake.&#x20;

### You can use the following arguments to configure SHOT:

| Argument                              | Description                                                               |                                 |                        |                                                                                 |
| ------------------------------------- | ------------------------------------------------------------------------- | ------------------------------- | ---------------------- | ------------------------------------------------------------------------------- |
| <p><code>-DCMAKE\_BUILD\_TYPE=\<Debug | Release                                                                   | </code><br><code>RelWithDebInfo | MinSizeRel></code></p> | If `Debug` or `RelWithDebInfo`is used, additional debug information is created. |
| `-DHAS_AMPL=<on\|off>`                | Compiles SHOT with AMPL interface (ASL), e.g. for use with Pyomo or JuMP. |                                 |                        |                                                                                 |
| `-DHAS_CBC=<on\|off>`                 | Compiles SHOT with support for Cbc as MIP solver.                         |                                 |                        |                                                                                 |
| `-DCBC_DIR=<directory>`               | Defines where the Cbc libraries and headers are located.                  |                                 |                        |                                                                                 |
| `-DHAS_CPLEX=<on\|off>`               | Compiles SHOT with support for CPLEX as MIP solver.                       |                                 |                        |                                                                                 |
| `-DCPLEX_DIR=<directory>`             | Defines where the CPLEX libraries and headers are located.                |                                 |                        |                                                                                 |
| `-DHAS_GAMS=<on\|off>`                | Compiles SHOT with GAMS interface.                                        |                                 |                        |                                                                                 |
| `-DGAMS_DIR=<directory>`              | Defines where GAMS is installed                                           |                                 |                        |                                                                                 |
| `-DHAS_GUROBI=<on\|off>`              | Compiles SHOT with support for Gurobi as MIP solver.                      |                                 |                        |                                                                                 |
| `-DGUROBI_DIR=<directory>`            | Defines where the Gurobi libraries and headers are located.               |                                 |                        |                                                                                 |
| `-DHAS_IPOPT=<on\|off>`               | Compiles SHOT with support for Ipopt as NLP solver.                       |                                 |                        |                                                                                 |
| `-DIPOPT_DIR=<directory>`             | Defines where the Ipopt libraries and headers are located.                |                                 |                        |                                                                                 |
| `-DGENERATE_EXE=<on\|off>`            | Whether the SHOT executable (or just the libraries) should be generated.  |                                 |                        |                                                                                 |

**So to compile a completely free version of SHOT you can issue the following commands:**

```
git clone https://www.github.com/coin-or/SHOT
cd SHOT
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release \
  -DHAS_CBC=on -DCBC_DIR=/opt/cbc \
  -DHAS_IPOPT=on -DIPOPT_DIR=/opt/ipopt ..
```

## Compiling on Windows

Note that compiling SHOT (and its dependencies) on Windows might be challenging. **Recommended options on Windows is to either use Windows Subsystem for Linux or MSYS2, for which similar steps as above can be used.**

If you want to use MSYS2, instructions are available at <https://github.com/coin-or/SHOT/issues/11#issuecomment-569580328>.

## Installing using CMake

After compiling SHOT, you can use `make install` to install SHOT (including the binary, library and header files) to your system. By default the install is made into `/usr/local` on a Linux-system. If you want to change this, you can substitute the call to CMake above with:

```
cmake \
  -DCMAKE_INSTALL_PREFIX=/path/to/install/dir \
  -DCMAKE_BUILD_TYPE=Release \
  -DHAS_CBC=on -DCBC_DIR=/opt/cbc \
  -DHAS_IPOPT=on -DIPOPT_DIR=/opt/ipopt ..
```

and after this run `make install`. Note that you will need to add `/path/to/install/dir/bin` to your path and `/path/to/install/dir/lib` to your library search path (`LD_LIBRARY_PATH` on Linux.

## Creating an installation package using CPack

You can also (only tested on Linux) create installation packages (ZIP or a self-extracting installation program) using CPack (which is a part of CMake).&#x20;

To create installation files directly in the build directory, just execute the command `make package` or `cpack`after the steps above have completed.&#x20;

## Integrate SHOT with GAMS

Build the SHOT library as in discussed above, but make sure to pass the GAMS system directory to the cmake call via `-DGAMS_DIR=`.

Then add the following entry to `gmscmpun.txt` (`gmscmpnx.txt` on Windows) in the GAMS system directory:

```
SHOT 1101 5 0001020304 1 0 2 MINLP MIQCP 
gmsgenus.run 
gmsgenux.out 
/path/to/libSHOTSolver.so sht 1 1 
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://www.shotsolver.dev/shot/about-shot/compiling.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
