mirror of
1
0
Fork 0
modern-cmake/chapters/intro/running.md

73 lines
3.4 KiB
Markdown
Raw Normal View History

2017-10-17 21:41:41 +02:00
# Running CMake
Before writing CMake, let's make sure you know how to run it to make things. This is true for almost all CMake projects, which is almost everything.
## Building a project
Unless otherwise noted, you should always make a build directory and build from there. You can technically do an in-source build, but you'll have to be careful not to overwrite files or add them to git, so just don't.
Here's the CMake Build Procedure (TM):
2018-03-28 20:50:38 +02:00
{% term %}
2017-10-18 14:48:28 +02:00
~/package $ mkdir build
~/package $ cd build
~/package/build $ cmake ..
~/package/build $ make
2018-03-28 20:50:38 +02:00
{% endterm %}
2017-10-17 21:41:41 +02:00
You can replace the make line with `cmake --build .` if you'd like, and it will call `make` or whatever build tool you are using. You can follow it by `make install` or `cmake --build . --target install` if you want to install it.
## Picking a compiler
Selecting a compiler must be done on the first run in an empty directory. It's not CMake syntax per-say, but you might not be familiar with it. To pick Clang:
2018-03-28 20:50:38 +02:00
{% term %}
2017-10-18 14:48:28 +02:00
~/package/build $ CC=clang CXX=clang++ cmake ..
2018-03-28 20:50:38 +02:00
{% endterm %}
2017-10-17 21:41:41 +02:00
That sets the environment variables in bash for CC and CXX, and CMake will respect those variables. This sets it just for that one line, but that's the only time you'll need those; afterwards CMake continues to use the paths it deduces from those values.
## Picking a generator
You can build with a variety of tools; `make` is usually the default. To see all the tools CMake knows about on your system, run
2017-10-18 14:48:28 +02:00
2018-03-28 20:50:38 +02:00
{% term %}
2017-10-18 14:48:28 +02:00
~/package/build $ cmake --help
2018-03-28 20:50:38 +02:00
{% endterm %}
2017-10-17 21:41:41 +02:00
And you can pick a tool with `-G"My Tool"` (quotes only needed if spaces are in the tool name). You should pick a tool on your first CMake call in a directory, just like the compiler. Feel free to have several build directories, like `build/` and `buildXcode`.
## Setting options
2018-03-30 14:26:33 +02:00
You set options in CMake with `-D`. You can see a list of options with `-L`, or a list with human-readable help with `-LH`. If you don't list the source/build directory, the listing will not rerun CMake (`cmake -L` instead of `cmake -L .`).
2017-10-17 21:41:41 +02:00
## Verbose and partial builds
Again, not really CMake, but if you are using a command line build tool like `make`, you can get verbose builds:
2018-03-28 20:50:38 +02:00
{% term %}
2017-10-18 14:48:28 +02:00
~/package/build $ VERBOSE=1 make
2018-03-28 20:50:38 +02:00
{% endterm %}
2017-10-17 21:41:41 +02:00
You can actually write `make VERBOSE=1`, and make will also do the right thing, though that's a feature of `make` and not the command line in general.
You can also build just a part of a build by specifying a target, such as the name of a library or executable you've defined in CMake, and make will just build that target.
## Standard options
These are common CMake options to most packages:
* `-DCMAKE_BUILD_TYPE=` Pick from Release, RelWithDebInfo, Debug, or sometimes more.
2017-10-18 16:20:39 +02:00
* `-DCMAKE_INSTALL_PREFIX=` The location to install to. System install on UNIX would often be `/usr/local` (the default), user directories are often `~/.local`, or you can pick a folder.
2018-03-28 20:50:38 +02:00
* `-D BUILD_SHARED_LIBS=` You can set this `ON` or `OFF` to control the default for shared libraries (the author can pick one vs. the other explicitly instead of using the default, though)
2018-04-05 08:07:40 +02:00
## Special commands for CMake
We've already mentioned several special commands, like `-G` for generator, but here is a listing of some other useful flags:
| Flag | Description |
|-----:|:------------|
| `-G"Generator"` | Select a generator |
| `--trace` | Print every line of CMake that is run. Very verbose. |
| `--trace-source="filename"` | Print out every line of a CMake file when it runs. Very useful. |