Linux - Makefile

Table of Contents

As is well-known, makefile is a text file which specifies the behavior of make. According to the rules in makefile, a project can be automatically built in a fairly smart way.

Given a project, different from Windows platform, where the required makefile is implicitly generated by the IDE in use; in Unix/Linux, it is of the most importance to compose a makefile. Only in this way, we can control the building and linking of the given project to maximum extent.

C++

A typical makefile for a C++ project can be shown below, where

  • The compiler is GCC.
  • The resultant binary is prj.
  • 3rd-party library IT++ is used, which is installed at /opt/itpp.
  • Shared library is used for debug, while static library is adopted for release.
  • Openmp-based multithreading is utilized for release build.
  • Doxygen-based documentation, with the configuration file config.
CC := /usr/bin/g++
INC := $(foreach dirs, $(shell find $(shell pwd) -iname '*.h'), $(dirs))
SRC := $(foreach dirs, $(shell find $(shell pwd) -iname '*.cpp'), $(dirs))
OBJ := $(subst .cpp,.o, $(SRC))
BIN := prj

ifdef RELEASE
        CFLAGS := `/opt/itpp/bin/itpp-config --cflags`
        LFLAGS := `/opt/itpp/bin/itpp-config --static --libs`
        CFLAGS += -fopenmp
        LFLAGS += -lgomp
else
        CFLAGS := `/opt/itpp/bin/itpp-config --debug --cflags`
        LFLAGS := `/opt/itpp/bin/itpp-config --debug --libs`
endif
LFLAGS += -lm

%.o: %.cpp
        @echo "Building object file $@ ..."
        @$(CC) -c -o $@ $< $(CFLAGS)

$(BIN): $(OBJ)
        @echo "Linking object files and creating binary program ..."
        @$(CC) $^ -o $@ $(LFLAGS)

.phony: default clean clear doc
default: $(BIN)
clear:
        @echo "Removing all object files and the binary file ..."
        @-rm -f $(OBJ) $(BIN)
clean:
        @echo "Removing all object files ..."
        @-rm -f $(OBJ)
doc:
        @echo "Documenting ..."
        @doxygen -s config .

LaTeX

A counterpart for \(\LaTeX\) can be shown below.

# Generic make file for LaTeX: requires GNU make
#
# This makefile provides four targets: dvi, ps, pdf and clean.
# The default is "pdf".
# To make a dvi file, type "make dvi"
# To make a ps file, type "make ps".
# To make a pdf file, type "make pdf" or simply "make".
# To remove all files generated by make, type "make clean".

TEXFILE	= main.tex

.PHONY: dvi ps pdf clean

pdf:	$(TEXFILE:.tex=.pdf)
ps:	$(TEXFILE:.tex=.ps)
dvi:	$(TEXFILE:.tex=.dvi)

%.dvi: %.tex
        latex $<; \
        bibtex $(<:.tex=.aux);\
        latex $<;

%.ps: %.dvi
        dvips -q -t a4 $< -o $(<:.dvi=.ps)

%.pdf: %.ps
        ps2pdf -dPDFSETTINGS=/prepress $<

clean:
        @rm -f \
        $(TEXFILE:.tex=.aux) \
        $(TEXFILE:.tex=.log) \
        $(TEXFILE:.tex=.out) \
        $(TEXFILE:.tex=.dvi) \
        $(TEXFILE:.tex=.pdf) \
        $(TEXFILE:.tex=.ps)