Chapter 18. Managing More Code with Make The GNU Make utility, commonly abbreviated as Make , is a tool for controlling the generation of executables from source files. Make automatically determines which parts of a complex program have changed and need to be recompiled. Make uses configuration files called Makefiles to control the way programs are built. 18.1. GNU make and Makefile Overview To create a usable form (usually executable files) from the source files of a particular project, perform several necessary steps. Record the actions and their sequence to be able to repeat them later. Red Hat Enterprise Linux contains GNU make , a build system designed for this purpose. Prerequisites Understanding the concepts of compiling and linking GNU make GNU make reads Makefiles which contain the instructions describing the build process. A Makefile contains multiple rules that describe a way to satisfy a certain condition ( target ) with a specific action ( recipe ). Rules can hierarchically depend on another rule. Running make without any options makes it look for a Makefile in the current directory and attempt to reach the default target. The actual Makefile file name can be one of Makefile , makefile , and GNUmakefile . The default target is determined from the Makefile contents. Makefile Details Makefiles use a relatively simple syntax for defining variables and rules , which consists of a target and a recipe . The target specifies the output if a rule is executed. The lines with recipes must start with the tab character. Typically, a Makefile contains rules for compiling source files, a rule for linking the resulting object files, and a target that serves as the entry point at the top of the hierarchy. Consider the following Makefile for building a C program which consists of a single file, hello.c . all: hello hello: hello.o gcc hello.o -o hello hello.o: hello.c gcc -c hello.c -o hello.o This specifies that to reach the target all , the file hello is required. To get hello , one needs hello.o (linked by gcc ), which in turn is created from hello.c (compiled by gcc ). The target all is the default target because it is the first target that does not start with a period. Running make without any arguments is then identical to running make all , if the current directory contains this Makefile . Typical Makefile A more typical Makefile uses variables for generalization of the steps and adds a target "clean" which removes everything but the source files. CC=gcc CFLAGS=-c -Wall SOURCE=hello.c OBJ=USD(SOURCE:.c=.o) EXE=hello all: USD(SOURCE) USD(EXE) USD(EXE): USD(OBJ) USD(CC) USD(OBJ) -o USD@ %.o: %.c USD(CC) USD(CFLAGS) USD< -o USD@ clean: rm -rf USD(OBJ) USD(EXE) Adding more source files to such a Makefile requires adding them to the line where the SOURCE variable is defined. Additional resources GNU make: Introduction - 2 An Introduction to Makefiles Chapter 15, Building Code with GCC 18.2. Example: Building a C Program Using a Makefile Build a sample C program using a Makefile by following the steps in the example below. Prerequisites Understanding of Makefiles and make Procedure Create a directory hellomake and change to this directory: Create a file hello.c with the following contents: #include <stdio.h> int main(int argc, char *argv[]) { printf("Hello, World!\n"); return 0; } Create a file Makefile with the following contents: CC=gcc CFLAGS=-c -Wall SOURCE=hello.c OBJ=USD(SOURCE:.c=.o) EXE=hello all: USD(SOURCE) USD(EXE) USD(EXE): USD(OBJ) USD(CC) USD(OBJ) -o USD@ %.o: %.c USD(CC) USD(CFLAGS) USD< -o USD@ clean: rm -rf USD(OBJ) USD(EXE) Caution The Makefile recipe lines must start with the tab character. When copying the text above from the browser, you may paste spaces instead. Correct this change manually. Run make : This creates an executable file hello . Run the executable file hello : Run the Makefile target clean to remove the created files: Additional Resources Section 15.8, "Example: Building a C Program with GCC" Section 15.9, "Example: Building a C++ Program with GCC" 18.3. Documentation Resources for make For more information about make , see the resources listed below. Installed Documentation Use the man and info tools to view manual pages and information pages installed on your system: Online Documentation The GNU Make Manual hosted by the Free Software Foundation The Red Hat Developer Toolset User Guide - GNU make

Commands:
all: hello hello: hello.o gcc hello.o -o hello hello.o: hello.c gcc -c hello.c -o hello.o
CC=gcc CFLAGS=-c -Wall SOURCE=hello.c OBJ=USD(SOURCE:.c=.o) EXE=hello all: USD(SOURCE) USD(EXE) USD(EXE): USD(OBJ) USD(CC) USD(OBJ) -o USD@ %.o: %.c USD(CC) USD(CFLAGS) USD< -o USD@ clean: rm -rf USD(OBJ) USD(EXE)
mkdir hellomake cd hellomake
#include <stdio.h> int main(int argc, char *argv[]) { printf("Hello, World!\n"); return 0; }
CC=gcc CFLAGS=-c -Wall SOURCE=hello.c OBJ=USD(SOURCE:.c=.o) EXE=hello all: USD(SOURCE) USD(EXE) USD(EXE): USD(OBJ) USD(CC) USD(OBJ) -o USD@ %.o: %.c USD(CC) USD(CFLAGS) USD< -o USD@ clean: rm -rf USD(OBJ) USD(EXE)
make gcc -c -Wall hello.c -o hello.o gcc hello.o -o hello
./hello Hello, World!
make clean rm -rf hello.o hello
man make info make