G++

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++


Valid XHTML 1.0 Transitional