|
Makefile soubory pro větší projekty.
|
|
23.02.2006
Větší projekt se většínou skládá z více logicky seřazených podadresářů. Jako příklad použiju vlastní engine, který je na sourceforge CVS
http://cvs.sourceforge.net/viewcvs.py/kengine/K3dEngine_1_0/
Vytvoříme v každém adresáři soubor makefile. Po zadání příkazu
make CONFIG=debug
nebo
make CONFIG=release
který provedeme v adresáři src se nám projdou všechny makefile soubory všech adresářů, zkompilují se zdrojové soubory v debug, nebo release módu. Vytvořené objekty *.a se překopírují do adresáře lib.
V tomto adresáři se ze všech objektů projektu vytvoří dynamická knihovna libK3dEngine.so. Tuto knihovnu pak přilinkujeme k projektu K3dApp.
|
V každém adresáři projektu, kde jsou zdrojové soubory cpp mám tento makefile
|
|
# K3dControl makefile
# author: Jan Koci honza.koci@email.cz
# Our program name
PROGRAMS = K3dControl
# C++ compiler
CC = g++
#Object directory
OBJDIR = debug
#Library directory
LIBDIR = ../../../lib/
# Set debug or release mode
CONFIGS = debug release
ifeq (,$(findstring $(CONFIG),$(CONFIGS)))
CONFIG = debug
endif
ifeq (,$(findstring debug,$(CONFIG)))
CFLAGS = -O2 -DNDEBUG
OBJDIR = release
else
CFLAGS = -g -D_DEBUG
OBJDIR = debug
endif
#Set output directory for object (debug or release)
OUTDIR = $(LIBDIR)$(OBJDIR)
#insert local include paths
CFLAGS += -i. \
-i../ \
-i../System \
-i../System/GameData \
-i../System/Manager \
-i../GLRenderer \
-i../MathCore \
-i../Control \
-i../Graphics \
-i../Test \
-i../Script
# Warning flags for C programs
WARNCFLAGS = -Wall -Wshadow -Wpointer-arith \
-Wcast-qual -Wcast-align \
-Woverloaded-virtual
# All the .cpp files
SOURCES = $(wildcard *.cpp)
# And the corresponding .o files
OBJECTS = $(SOURCES:%.cpp=$(OUTDIR)/%.o)
# The first target in the makefile is the default target. it's usually called
# "all".
all: $(PROGRAMS)
# We assume we have one program (`ourprogram') to build, from all the object
# files derived from .cpp files in the current directory.
$(PROGRAMS): $(OBJECTS)
# include known dependecies from -MMD
-include $(OBJECTS:.o=.d)
# How to make *.o files
$(OUTDIR)/%.o: %.cpp
@echo "Create object directory" $(OUTDIR)
@mkdir -p $(OUTDIR)
@echo "OK"
@echo "Object compiling" $(OBJECTS)
$(CC) -MMD $(WARNCFLAGS) -c $(CFLAGS) $< -o $@
@echo "OK"
# "clean" removes files from object directory
clean:
@echo "Cleaning object" $(OBJECTS)
rm -f $(OBJECTS) *~ tags gmon.out
@echo "OK"
Soubor makefile se volá příkazem
make
Jako parametr příkazu můžeme zadat
CONFIG=debug
CONFIG=release
clean CONFIG=debug
clean CONFIG=release
například
make CONFIG=release
nám zkompiluje projekt v release (optimalizovaném) módu. Vytvoří v adresáři
../../../lib/
adresář
release
a v něm vytvoří objekty
*.o
a závislosti objektů
*.d
make clean CONFIG=release
nám vymaže vytvořené objekty
|
Podrobný popis
|
|
PROGRAMS = K3dControl
Jméno programu
CC = g++
Nastavení g++ jako c++ kompilátor
OBJDIR = debug
Základní adresář, který se automaticky vytvoří, pokud se makefile volá příkazem
make
bez parametrů
LIBDIR = ../../../lib/
Nastaví cestu k adresáři
lib
ve kterém bude vytvářet zkompilované objekty
*.o
CONFIGS = debug release
ifeq (,$(findstring $(CONFIG),$(CONFIGS)))
CONFIG = debug
endif
ifeq (,$(findstring debug,$(CONFIG)))
CFLAGS = -O2 -DNDEBUG
OBJDIR = release
else
CFLAGS = -g -D_DEBUG
OBJDIR = debug
endif
Nastaví debug
CFLAGS = -O2 -DNDEBUG
nebo relase
CFLAGS = -g -D_DEBUG
mód
OUTDIR = $(LIBDIR)$(OBJDIR)
Nastaví cestu, buď
../../../lib/debug
nebo
../../../lib/release
Podle zadaných parametrů
CFLAGS += -I. \
-I../ \
-I../System \
-I../System/GameData \
-I../System/Manager \
-I../GLRenderer \
-I../MathCore \
-I../Control \
-I../Graphics \
-I../Test \
-I../Script
Nastaví cesty k inlude souborům
*.h
WARNCFLAGS = -Wall -Wshadow -Wpointer-arith \
-Wcast-qual -Wcast-align \
-Woverloaded-virtual
Nastaví případné varovné hlášky při kompilaci
SOURCES = $(wildcard *.cpp)
Najde všechny soubory
*.cpp
v tomto adresáři
OBJECTS = $(SOURCES:%.cpp=$(OUTDIR)/%.o))
Ze všech souborů
*.cpp
vytvoří objekty
*.o
se stejným názvem
all: $(PROGRAMS)
Zde se začnou provádět makefile příkazy pokud se zadá
make all
nebo
make
$(PROGRAMS): $(OBJECTS)
Vytvoří objekty
-include $(OBJECTS:.o=.d)
Nastaví závislosti objektů
$(OUTDIR)/%.o: %.cpp
@echo "Create object directory" $(OUTDIR)
@mkdir -p $(OUTDIR)
@echo "OK"
@echo "Object compiling" $(OBJECTS)
$(CC) -MMD $(WARNCFLAGS) -c $(CFLAGS) $< -o $@
@echo "OK"
Vytvoří adresář debug, nebo release v adresáři lib (podle parametrů). Zkompiluje zdrojové soubory *.cpp a vytvoří ve vytvořeném andresáři debug, nebo release objekty *.o a závislosti *.d
clean:
@echo "Cleaning object" $(OBJECTS)
rm -f $(OBJECTS) *~ tags gmon.out
@echo "OK"
Zde se začnou provádět makefile příkazy pokud se zadá
make clean
Vymažou se všechny objekty *.o a všechny záložní soubory
|
V adresáři lib mám tento makefile
|
|
# lib makefile
# author: Jan Koci honza.koci@email.cz
# Our program name
PROGRAMS = libK3dEngine.so
# C++ compiler
CC = g++
#Object directory
OBJDIR = debug
# Set debug or release mode
CONFIGS = debug release
ifeq (,$(findstring $(CONFIG),$(CONFIGS)))
CONFIG = debug
endif
ifeq (,$(findstring debug,$(CONFIG)))
CFLAGS = -O2 -DNDEBUG
oBJDIR = release
else
CFLAGS = -g -D_DEBUG
OBJDIR = debug
endif
#Insert local include paths
CFLAGS = -I../K3dEngine/System \
-I../K3dEngine/System/GameData \
-I../K3dEngine/System/Manager \
-I../K3dEngine/GLRenderer \
-I../K3dEngine/MathCore \
-I../K3dEngine/Control \
-I../K3dEngine/Graphics \
-I../K3dEngine/Test \
-I../K3dEngine/Script
# Warning for linker
WARNLD = -Wbad-function-cast -Wstrict-prototypes -Wmissing-declarations
# All the .o files
OBJECTS = $(wildcard $(OBJDIR)/*.o)
# The first target in the makefile is the default target. It's usually called
# "all".
all: $(PROGRAMS)
# We assume we have one program (`ourprogram') to build, from all the object
# files derived from .cpp files in the current directory.
$(PROGRAMS): $(OBJECTS)
$(CC) $(WARNCFLAGS) $(WARNLD) $(CFLAGS) $(LDFLAGS) -shared -fPIC -o $(PROGRAMS) $(OBJECTS) $(LOADLIBES)
# "clean" removes files not needed after a build.
clean:
rm -f $(OBJECTS) $(OBJDIR)/*.d $(PROGRAMS) tags gmon.out
Makefile vezme všechny objekty *.o z tohoto adresáře lib a vytvoří dynamickou knihovnu
libK3dEngine.so
|
Podrobný popis
|
|
PROGRAMS = libK3dEngine.so
Jméno dynamické knihovny
WARNLD = -Wbad-function-cast -Wstrict-prototypes -Wmissing-declarations
Nastaví případné varovné hlášky při linkování
OBJECTS = $(wildcard $(OBJDIR)/*.o)
Najde všechny soubory *.o
$(PROGRAMS): $(OBJECTS)
$(CC) $(WARNCFLAGS) $(WARNLD) $(CFLAGS) $(LDFLAGS) -shared -fPIC -o $(PROGRAMS) $(OBJECTS) $(LOADLIBES)
Vytvoří dynamickou knihovnu
libK3dEngine.so
clean:
rm -f $(OBJECTS) $(OBJDIR)/*.d $(PROGRAMS) tags gmon.out
Vymaže dynamickou knihovnu všechny soubory závislostí *.d
Ostatní nastavení je stejné jako v předchozím souboru makefile
|
V nadřazeném adresáři adresářů zdrojových souborů mám tento makefile
|
|
# K3dEngine makefile
# author: Jan Koci honza.koci@email.cz
#default mode
all:
$(MAKE) -C Control
$(MAKE) -C GLRenderer
$(MAKE) -C Graphics
$(MAKE) -C MathCore
$(MAKE) -C Script
$(MAKE) -C System
$(MAKE) -C System/GameData
$(MAKE) -C System/Manager
$(MAKE) -C Test
$(MAKE) -C ../../lib
# remove files
clean:
$(MAKE) -C Control clean
$(MAKE) -C GLRenderer clean
$(MAKE) -C Graphics clean
$(MAKE) -C MathCore clean
$(MAKE) -C Script clean
$(MAKE) -C System clean
$(MAKE) -C System/GameData clean
$(MAKE) -C System/Manager clean
$(MAKE) -C Test clean
$(MAKE) -C ../../lib/ clean
rm -f *~
Provádí
make
nebo
make clean
ve všech podadresářích
|
V projektu K3dApp který používá vytvořenou dynamickou knihovnu libK3dEngine.so mám tento makefile
|
|
# K3dApp makefile
# author: Jan Koci honza.koci@email.cz
# Our program name
PROGRAMS = K3dApp
# C++ compiler
CC = g++
#Object directory
OBJDIR = debug
CONFIGS = debug release
ifeq (,$(findstring $(CONFIG),$(CONFIGS)))
CONFIG = debug
endif
ifeq (,$(findstring debug,$(CONFIG)))
CFLAGS = -O2 -DNDEBUG
OBJDIR = release
else
CFLAGS = -g -D_DEBUG
OBJDIR = debug
endif
# Set SDL library
CFLAGS += `sdl-config --libs`
#Insert local include paths
CFLAGS += -I. \
-I../../lib \
-I. \
-I../ \
-I../K3dEngine \
-I../K3dEngine/System \
-I../K3dEngine/System/GameData \
-I../K3dEngine/System/Manager \
-I../K3dEngine/GLRenderer \
-I../K3dEngine/MathCore \
-I../K3dEngine/Control \
-I../K3dEngine/Graphics \
-I../K3dEngine/Test \
-I../K3dEngine/Script
# The linker flags
LDFLAGS = -L
# Added library
LOADLIBES = -lGL -lGLU `sdl-config --libs` -lSDL_image
# Warning flags for C programs
WARNCFLAGS = -Wall -Wshadow -Wpointer-arith \
-Wcast-qual -Wcast-align \
-Woverloaded-virtual # -W
# Warning for linker
WARNLD = -Wbad-function-cast -Wstrict-prototypes -Wmissing-declarations
# All the .cpp files
SOURCES = $(wildcard *.cpp)
# And the corresponding .o files
OBJECTS = $(SOURCES:.cpp=.o)
# The first target in the makefile is the default target. It's usually called
# "all".
all: $(PROGRAMS)
LD_LIBRARY_PATH = ../../lib/
# We assume we have one program (`ourprogram') to build, from all the object
# files derived from .cpp files in the current directory.
$(PROGRAMS): $(OBJECTS)
$(CC) $(WARNCFLAGS) $(WARNLD) $(CFLAGS) -fPIC -o $(PROGRAMS) $(OBJECTS) $(LD_LIBRARY_PATH)libK3dEngine.so $(LDFLAGS) $(LOADLIBES)
# Include known dependecies from -MMD
-include $(OBJECTS:.o=.d)
# How to make *.o files
%.o: %.cpp
$(CC) -MMD $(WARNCFLAGS) $(CFLAGS) -c $<
# "clean" removes files not needed after a build.
clean:
rm -f $(OBJECTS) *.d *~ tags gmon.out
Zkompiluje všechny zdrojové soubory *.cpp v tomto adresáři a připojí dynamickou knihovnu libK3dEngine.so
|
Podrobný popis
|
|
LDFLAGS = -L
Nastaví linkovací flag
LOADLIBES = -lGL -lGLU `sdl-config --libs` -lSDL_image
Připojí knihovny OpenGL a SDL
LD_LIBRARY_PATH = ../../lib/
Nastaví cestu k lib adresáři
$(PROGRAMS): $(OBJECTS)
$(CC) $(WARNCFLAGS) $(WARNLD) $(CFLAGS) -fPIC -o $(PROGRAMS) $(OBJECTS) $(LD_LIBRARY_PATH)libK3dEngine.so $(LDFLAGS) $(LOADLIBES)
Zkompiluje zdrojové soubory cpp, připojí dynamickou knihovnu libK3dEngine.so a vytvoří spustitelný soubor K3dApp
Ostatní nastavení je popsáno již v předchozích souborech makefile
|
V nadřazeném adresáři zdrojových souborů a projektu mám tento makefile
|
|
# K3dEngine makefile
# author: Jan Koci honza.koci@email.cz
#default mode
all:
$(MAKE) -C K3dEngine
$(MAKE) -C K3dApp
# remove files
clean:
$(MAKE) -C K3dEngine clean
$(MAKE) -C K3dApp clean
rm -f *~
Provádí
make
nebo
make clean
ve všech podadresářích
home
/
g++