Manoj Rao bio photo

Manoj Rao

Your Average Common Man

Email Twitter Github

In this post, we will walk through a dummy cmake setup for a C++ application. For the experienced folks this is not going to be very informative, however, can serve as a reference to start building complex projects with.

A Simple Application

I want to create a project called my_app with the following directory structure.

├── CMakeLists.txt
├── src
│   └──
├── test
│   ├── CMakeLists.txt
│   └──
└── third-party
    └── googletest -> /home/manoj/software/googletest


cmake is not really a replacement for make instead it is a generator of Makefile or other alternatives such as Ninja files.

Basic Config

cmake makes frequent releases, so this will require you to set a minimum required version.

cmake_minimum_required(VERSION 3.16)

Set the compiler version and the language standard version.

# Compiler and Standard
set(CMAKE_C_COMPILER clang-8)
set(CMAKE_CXX_COMPILER clang++-8)

I prefer to set the global project name in a variable and use that all over the rest of the file so that file is readable.

# set the project name
set(this_project my_app)

It’s nice to use variables for other project directories too.

# third party software
set(thirdparty third-party)

Here you are telling which languages are used in the project.

# RUST, Erlang, what else
project(${this_project} C CXX)

Here you are telling that you want to enable testing for this dir and it’s subdirs


This is used to add googletest as your testing software.

# add google test

Specify the source files and headers

# header files

# src files

Finally, build the executable for this project

# add the executable
add_executable(${this_project} ${sources} ${headers})

I have not tested these, but they are useful if you are building library

target_include_directories(${this_project} PUBLIC include)
target_include_directories(${this_project} PRIVATE src)

The directory consisting tests and it’s own CMakeLists.txt


Nice options, especially useful if you are using them with Emacs rtags


Bring Your Own Cause

If you think any info here has remotely helped you consider dropping a penny for this cause, just click me . You can visit Unfortunately, there are plenty of sad things happening all over the world, if you have a different cause or charity you'd rather support please do. And if you did make a donation, please drop a note to me (annotated) or leave a comment here (anonymous is OK!) and I will use that as motivation to write more useful content here.

If you like topics such as this then please consider subscribing to my podcast. I talk to some of the stalwarts in tech and ask them what their favorite productivity hacks are:

Available on iTunes Podcast

Visit Void Star Podcast’s page on iTunes Podcast Portal. Please Click ‘Subscribe’, leave a comment.

Get it iTunes