Introduction to Make and Cmake

Intro to Make and Cmake

Let's start simply by compiling the below cpp programm

#include <iostream>

int main()
{
	std::cout << "Hello World";
}
g++ ./hello.cpp 

This would give us an a.out file which we can run as a binary file. Now this was a simple step, just run one command to generate the binary file . What if I ask you that I don't need just this one file but I need multiple others as well such as .hex file or maybe a .uf2 file along with it . You would probably then run multiple commands to generate those other kinds of files.

GNU make and automation

This is where make comes in, make basically lets you automate a lot of things just by including a makefile in your project and adding kind of verbs in that .

Allow me to demonstrate

Now in the previous directory add a file called Makefile with these contents

compile:
	g++ ./hello.cpp

now run install make by using your package manager for example by apt

apt install make

now try running make compile in the same directory where the makefile is placed. At the end you are going see the same a.out file which instead was generated by g++ earlier.

Now edit your makefile to generate an object file as well

compile:
	g++ ./hello.cpp
all:
	g++ -c ./hello.cpp

Now if you run make all you will see that a hello.o ie an object file has also been generated. If you want to get knee deep into Makefiles head here

Now that we have a grasp on makefiles let's move to Cmake

Cmake

Now lets add another file to our directory called CMakeLists.txt

 cmake_minimum_required(VERSION 2.8.9)
project (hello)
add_executable(hello hello.cpp)

Now remove the ./a.out file and create a folder called build head to the build folder and run

cmake ..

You are going to see some output and then a bunch of files generated in the folder. One of these is a Makefile ! Now if you open this Makefille , you will find a beautifully generated Makefile with explicit instructions on how to compile it. Now run

make all

This will generate a binary called hello in the same directory and if you run this binary

./hello

You are going to see the hello world printed which was supposed to be there .

Explaination of various directives in the CMakeLists.txt file

  • The first line sets the minimum required cmake version for this project
cmake_minimum_required(VERSION 2.8.9)
  • The second line specifies the name of the project
project (hello)
  • And the third and the most important third line adds an executable named hello and generates it from the hello.cpp file.
add_executable(hello helloworld.cpp)

Note : Here is more information about cmake