Linux - Makefile

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)
Table of Contents