# exple-cmake-build

This project is a stub illustrating how the building of nse-projects
with CMake is (should be) organized. This one represents *nse-XXX-XXX* 
(e.g. [nse-sphere3d-geo](http://tesla.parallel.ru/vonopr/nse-sphere3d-geo)) 
head projects

Throughout the example projects prefix *nse* is substituted with *exple*.

## Dependencies

The project depends on 
[explelibx-common](http://tesla.parallel.ru/vonopr/explelibx-common) 
and
[explelibx-mgrid](http://tesla.parallel.ru/vonopr/explelibx-mgrid) projects.

You must have git, cmake (>= 3.14) and C++ compiler on your system path.

## Download

Download the current project with

```bash
mkdir exple-cmake-build
cd exple-cmake-build
git clone http://tesla.parallel.ru/vonopr/exple-cmake-build.git
cd ..
```

## Build

### Simple build

After downloading the project build it with

```bash
mkdir exple-cmake-build/build
cd exple-cmake-build/build
cmake -B . -S ../exple-cmake-build
cmake --build .
```

CMake should download the dependencies automatically during first invocation and generate
executable files *exple-add-numbers* or *exple-add-numbers.exe* during build stage.
Run it with `./exple-add-numbers` on UNIX or with `.\exple-add-numbers.exe` on Windows.
The output should be
```Multiplication of sum of 2 and 3 by 4 is... 20```


### Build with depndencies local dependencies

If you are a developer you might need a possibility to edit the sources provided by *nselibx-\** projects
(*explelibx-\** here). This can be done by passing `-DDOWNLOAD_DEPS=OFF` to the CMake configuration command.

Then dependencies should be located in `../..` relative to the local repository of *exple-cmake-build*.
Thus the directory structure should be

```tree
.
├── exple-cmake-build
│   └── exple-cmake-build
│       └── exple-cmake-build
├── explelibx-common
│   └── explelibx-common
└── explelibx-mgrid
    └── explelibx-mgrid
```


You can first [download the current project](#download) and then
download dependencies and configure cmake with `-DDOWNLOAD_DEPS=OFF` 

```bash
git clone http://tesla.parallel.ru/vonopr/explelibx-common.git
git clone http://tesla.parallel.ru/vonopr/explelibx-mgrid.git
mkdir build
cd build
cmake -B . -S ../exple-cmake-build/exple-cmake-build -DDOWNLOAD_DEPS=OFF
cmake --build .
```

During cmake configuration simillar messages should appear

```
-- Path to 'explelibx-common' project
    COMMON_DIR: D:/nse/example-structures/explelibx-common
-- Path to 'explelibx-mgrid' project
    GRID_DIR: D:/nse/example-structures/explelibx-mgrid
```

### Custom paths to dependencies

Otherwise, you can change the default paths with cmake's *COMMON_DIR* and
*GRID_DIR* variables. Works only if download is disables, i.e. *DOWNLOAD_DEPS=OFF*

E.g. if you want to build the sources' directory structure as follows

```tree
.
├── exple-cmake-build
│   └── exple-cmake-build
├── explelibx-common
│   └── explelibx-common
└── explelibx-mgrid
    └── explelibx-mgrid
```

do

```bash
git clone http://tesla.parallel.ru/vonopr/exple-cmake-build.git
git clone http://tesla.parallel.ru/vonopr/explelibx-common.git
git clone http://tesla.parallel.ru/vonopr/explelibx-mgrid.git
mkdir build
cd build
cmake -B . -S ../exple-cmake-build -DDOWNLOAD_DEPS=OFF -DCOMMON_DIR=../explelibx-common -DGRID_DIR=../explelibx-mgrid 
```

(This time [the initial download step](#download) should be skipped)

### Notes on building on Windows

C++ compiler and cmake's default building generator may be incompatible. If so you should provide the appropriate
generator with `-G` option. Visual Studio C++ Compiler should be used with `Visual Studio 17 2022`-like generators,
Intel C++ Compiler should be used with `NMake Makefiles`, MinGW C++ should be used `MinGW Makefiles`:

```
cmake -B . -S ../exple-cmake-build -G"Visual Studio 17 2022"
```