writing practical makefiles linux examples illustrations



 | 

Article background

In this article I will explain how to write practical makefiles for your projects. You can copy the makefiles used in this article right away to your project and modify as per your requirements. Subscribe to earn a certificate from our online courses listed . Your low cost subscription will enable complete access to all , , to clear all online course requirements.

Article contents


What is a Makefile?

Make is Unix utility that is designed to start execution of a makefile. A makefile is a special file, containing shell commands, that you create and name makefile (or Makefile depending upon the system). While in the directory containing this makefile, you will type make and the commands in the makefile will be executed. If you create more than one makefile, be certain you are in the correct directory before typing make.

Make keeps track of the last time files (normally object files) were updated and only updates those files which are required (ones containing changes) to keep the sourcefile up-to-date. If you have a large program with many source and/or header files, when you change a file on which others depend, you must recompile all the dependent files. Without a makefile, this is an extremely time-consuming task.

As a makefile is a list of shell commands, it must be written for the shell which will process the makefile. A makefile that works well in one shell may not execute properly in another shell.

The makefile contains a list of rules. These rules tell the system what commands you want to be executed.

After the makefile has been created, a program can be (re)compiled by typing make in the correct directory. Make then reads the makefile and creates a dependency tree and takes whatever action is necessary. It will not necessarily do all the rules in the makefile as all dependencies may not need updated. It will rebuild target files if they are missing or older than the dependency files.

Unless directed otherwise, make will stop when it encounters an error during the construction process.

Writing a simple Makefile
The makefile for executing basic.c program

#########################################################################################################
# This is an example Makefile for illustration of handling multiple .c .h programs from a single directory. This
# program uses the basic.c,basic.h,basic1.c programs.
# Typing 'make' or 'make basic' will create the executable file.
# Then execute the executable using ./basic
# define some Makefile variables for the compiler and compiler flags
# to use Makefile variables later in the Makefile: $()
# the compiler: gcc for C program, define as g++ for C++
#########################################################################################################
CC = gcc

# compiler flags:
#  -g    adds debugging information to the executable file
#  -Wall turns on most, but not all, compiler warnings
CFLAGS  = -g -Wall

# typing 'make' will invoke the first target entry in the file 
# (in this case the default target entry)
# you can name this target entry anything, but "default" or "all"
# are the most commonly used names by convention
#
# the build target executable:
TARGET = basic

all: $(TARGET)

# To create the executable file basic we need the object files
# basic.o basic1.o :
#
$(TARGET): basic.o basic1.o 
  $(CC) $(CFLAGS) -o $(TARGET) basic.o basic1.o 

basic.o: basic.c basic.h 
  $(CC) $(CFLAGS) -c basic.c  

basic1.o: basic1.c basic.h
  $(CC) $(CFLAGS) -c basic1.c

clean:
  $(RM) basic *.o *~
The basic.c file to be used in Makefile

#include <stdio.h>
#include "basic.h"
int total,tot = 0;
int main ()
{
  printf("This is a simple C Program\n");
  total = sum(1,2);
  printf("Sum of two numbers is %d\n", total );
  return 0;
}
The basic1.c file to be used along with basic.c program

#include "basic.h" 
int sum (int a, int b)
{
  return a + b;
}
The basic.h file to be used along with basic.c program

int sum (int, int);
    Let's execute the basic.c program now. The output of basic.c program is shown below. First we wrote basic.c, basic1.c, basic.h files in one directory. Then we executed make command to create target binary basic. Then we executed the basic binary using ./basic. Finally we could clean up the project using make clean command.
$ ls
basic1.c  basic.c  basic.h  Makefile
$ make
gcc -g -Wall -c basic.c
gcc -g -Wall -o basic basic.o basic1.o
$ ls
basic  basic1.c  basic1.o  basic.c  basic.h  basic.o  Makefile
$ ./basic
This is a simple C Program
Sum of two numbers is 3
$
$ make clean
rm -f basic *.o *~
$ ls
basic1.c  basic.c  basic.h  Makefile
$

Writing Makefile for most of your projects.

To Read Full Article

You need to subscribe & logged in

Subscribe

 | 
Share

Articles


C Programming

More Articles Categories

Technical articles

Prepare for software jobs


Test your skills