====== Makefiles ====== Makefiles are very useful to automate compilation of multi-file projects in c/c++ with Linux. ===== Syntax ===== * variables: = # init $() # get content * targets: : * template targets: %.o:%.cpp * automatic variables ([[http://www.gnu.org/software/make/manual/make.html#Automatic-Variables|complete list]]):: * ''$@'' : target * ''$^'' : list of requirements * ''$<'' : first requirement * ''$(MAKECMDGOALS)'' : make argument * functions ([[http://www.gnu.org/software/make/manual/make.html#Functions|complete list]]): * ''$(subst from,to,text)'' * ''$(filter-out , )'' * **Mini Example** COMPILO=g++ SRCSCPP = $(wildcard src/*.cpp) OBJS = $(patsubst %.cpp,build/%.o,$(notdir $(SRCSCPP))) prog: $(OBJS) $(COMPILO) -o build/$@ $(OBJS) build/%.o:%.cpp $(COMPILO) -c -o $@ $^ ===== Example ===== INCLUDE= \ -I/usr/include \ -I/usr/local/include \ -I. \ `pkg-config --cflags libglade-2.0` BIN_PATH=./ LIBS= \ `pkg-config --libs libglade-2.0` \ `pkg-config --libs gtk+-2.0` \ -export-dynamic LIBS_PATH= \ -L/lib \ -L/usr/lib \ -L/usr/local/lib \ -L. COMPILO=g++ FLAGS= -c -g -Wall -ansi -pedantic #FLAGS= -c -ansi -pedantic OBJ= \ file1.o \ file2.o # cibles : monprog: $(OBJ) $(COMPILO) -o $(BIN_PATH)monprog $(OBJ) $(LIBS_PATH) $(LIBS) clean : rm -f *.o clear : rm -f *.o monprog # compilation des sources : file1.o : file1.cpp file1.h $(COMPILO) $(FLAGS) $(INCLUDE) -o file1.o file1.cpp file2.o : file2.cpp file2.h $(COMPILO) $(FLAGS) $(INCLUDE) -o file2.o file2.cpp ===== pkg-config ===== When using libraries, pkg-config is very useful : pkg-config --cflags libxml++-2.6 pkg-config --libs libxml++-2.6 ===== auto-tools =====