makefile et compilation seulement-une-fois

Le
TSalm
Bonjour,

J'ai fait un makefile simple.
Mais à chaque fois que je lance une compilation, il me recompile
absolument tout alors que les .objs n'ont pas toujours à être recompilé
(source moins récente que l'.objs).
N'y a t-il pas options "GNU Makefilienne" (c'est à dire portable Linux et
MinGw) qui permette de faire ça ?

D'avance merci pour vos lumières,
-TSalm
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Richard Delorme
Le #20697181
Le 04/12/2009 23:41, TSalm a écrit :
Bonjour,

J'ai fait un makefile simple.
Mais à chaque fois que je lance une compilation, il me recompile
absolument tout alors que les .objs n'ont pas toujours à être recompilé
(source moins récente que l'.objs).
N'y a t-il pas options "GNU Makefilienne" (c'est à dire portable Linux
et MinGw) qui permette de faire ça ?



Normalement, ça marche toujours comme ça. A quoi ressemble votre Makefile ?

--
Richard
TSalm
Le #20697171
Le Sat, 05 Dec 2009 00:09:23 +0100, Richard Delorme écrit:

Le 04/12/2009 23:41, TSalm a écrit :
Bonjour,

J'ai fait un makefile simple.
Mais à chaque fois que je lance une compilation, il me recompile
absolument tout alors que les .objs n'ont pas toujours à être recompilé
(source moins récente que l'.objs).
N'y a t-il pas options "GNU Makefilienne" (c'est à dire portable Linux
et MinGw) qui permette de faire ça ?



Normalement, ça marche toujours comme ça. A quoi ressemble votre
Makefile ?




Voilà :

/* ------------- DEBUT ---------------- */
CXX=g++
CXXFLAGS=-W -I./src -g
LDFLAGS
OBJDIR=objs/obj
EXEDIR=objs/bin

.SUFFIXES: .cpp .o

.cpp.o:
@echo " =====> Compile $@ <====="
mkdir -p `dirname $(OBJDIR)/$@`
$(CXX) $(CXXFLAGS) -c $*.cpp -o $(OBJDIR)/$@
@echo

#
# EXECUTABLE
#
all: tests/fx/test4
tests/gzip/gzip_in_memory


tests/fx/test4: src/base/date_tools.o
src/base/file_tools.o
@echo " =====> Link $@ <====="
mkdir -p `dirname $(EXEDIR)/$@`
$(CXX) $(CXXFLAGS) $(LDFLAGS) $@.cpp $(patsubst %,$(OBJDIR)/%,$^)
-o $(EXEDIR)/$@
@echo


tests/gzip/gzip_in_memory:
@echo " =====> Link $@ <====="
mkdir -p `dirname $(EXEDIR)/$@`
$(CXX) $(CXXFLAGS) $(LDFLAGS) -g -lz $@.cpp $(patsubst
%,$(OBJDIR)/%,$^) -o $(EXEDIR)/$@
@echo



# CCC L EEE A NN N
# C L EE A=A N NN
# CCC LLL EEE A A N N
clean:
rm -rf $(OBJDIR)/*

/* ------------------------------------ */
Richard Delorme
Le #20697811
Le 05/12/2009 00:18, TSalm a écrit :
Le Sat, 05 Dec 2009 00:09:23 +0100, Richard Delorme écrit:

Le 04/12/2009 23:41, TSalm a écrit :
Bonjour,

J'ai fait un makefile simple.
Mais à chaque fois que je lance une compilation, il me recompile
absolument tout alors que les .objs n'ont pas toujours à être recompilé
(source moins récente que l'.objs).
N'y a t-il pas options "GNU Makefilienne" (c'est à dire portable Linux
et MinGw) qui permette de faire ça ?



Normalement, ça marche toujours comme ça. A quoi ressemble votre
Makefile ?




Voilà :

/* ------------- DEBUT ---------------- */
CXX=g++
CXXFLAGS=-W -I./src -g
LDFLAGS >
OBJDIR=objs/obj
EXEDIR=objs/bin

.SUFFIXES: .cpp .o

.cpp.o:
@echo " =====> Compile $@ <====="
mkdir -p `dirname $(OBJDIR)/$@`
$(CXX) $(CXXFLAGS) -c $*.cpp -o $(OBJDIR)/$@



plus simplement :
$(CXX) $(CXX_FLAGS) -c $< -o $(OBJDIR)/$@

@echo

#
# EXECUTABLE
#
all: tests/fx/test4
tests/gzip/gzip_in_memory


tests/fx/test4: src/base/date_tools.o
src/base/file_tools.o



src/base ou objs/obj ?

@echo " =====> Link $@ <====="
mkdir -p `dirname $(EXEDIR)/$@`
$(CXX) $(CXXFLAGS) $(LDFLAGS) $@.cpp $(patsubst %,$(OBJDIR)/%,$^) -o
$(EXEDIR)/$@
@echo


tests/gzip/gzip_in_memory:
@echo " =====> Link $@ <====="
mkdir -p `dirname $(EXEDIR)/$@`
$(CXX) $(CXXFLAGS) $(LDFLAGS) -g -lz $@.cpp $(patsubst %,$(OBJDIR)/%,$^)
-o $(EXEDIR)/$@
@echo



# CCC L EEE A NN N
# C L EE A=A N NN
# CCC LLL EEE A A N N
clean:
rm -rf $(OBJDIR)/*

/* ------------------------------------ */



Il manque les dépendences entre les .o et les .cpp.

--
Richard
espie
Le #20699041
In article
Le Sat, 05 Dec 2009 00:09:23 +0100, Richard Delorme écrit:

Le 04/12/2009 23:41, TSalm a écrit :
Bonjour,

J'ai fait un makefile simple.
Mais à chaque fois que je lance une compilation, il me recompile
absolument tout alors que les .objs n'ont pas toujours à être recompilé
(source moins récente que l'.objs).
N'y a t-il pas options "GNU Makefilienne" (c'est à dire portable Linux
et MinGw) qui permette de faire ça ?



Normalement, ça marche toujours comme ça. A quoi ressemble votre
Makefile ?




Voilà :

/* ------------- DEBUT ---------------- */
CXX=g++
CXXFLAGS=-W -I./src -g
LDFLAGS >
OBJDIR=objs/obj
EXEDIR=objs/bin

.SUFFIXES: .cpp .o

.cpp.o:
@echo " =====> Compile $@ <====="
mkdir -p `dirname $(OBJDIR)/$@`
$(CXX) $(CXXFLAGS) -c $*.cpp -o $(OBJDIR)/$@
@echo



C'est des problemes de repertoire: make n'a aucune raison de trouver
tout seul la correspondance entre tes sources et tes objets.

Il faut:
- soit que tu lui dises explicitement comment ca marche
- soit que tu mettes tes objets au meme endroit que tes sources
- ou alors tu peux utiliser l'extension extremement commune VPATH
pour lui dire de regarder aussi dans OBJDIR.

Deja, ton mkdir -p `dirname $(OBJDIR)/$@` me fait ticker.
Normalement, $@ doit etre le bon nom de cible, et il faudrait un
bete mkdir -p ${@D}
TSalm
Le #20703511
>>>> J'ai fait un makefile simple.
Mais à chaque fois que je lance une compilation, il me recompile
absolument tout alors que les .objs n'ont pas toujours à être
recompilé
(source moins récente que l'.objs).
N'y a t-il pas options "GNU Makefilienne" (c'est à dire portable Linux
et MinGw) qui permette de faire ça ?



Normalement, ça marche toujours comme ça. A quoi ressemble votre
Makefile ?




Voilà :

/* ------------- DEBUT ---------------- */
CXX=g++
CXXFLAGS=-W -I./src -g
LDFLAGS >>
OBJDIR=objs/obj
EXEDIR=objs/bin

.SUFFIXES: .cpp .o

.cpp.o:
@echo " =====> Compile $@ <====="
mkdir -p `dirname $(OBJDIR)/$@`
$(CXX) $(CXXFLAGS) -c $*.cpp -o $(OBJDIR)/$@
@echo



C'est des problemes de repertoire: make n'a aucune raison de trouver
tout seul la correspondance entre tes sources et tes objets.

Il faut:
- soit que tu lui dises explicitement comment ca marche
- soit que tu mettes tes objets au meme endroit que tes sources
- ou alors tu peux utiliser l'extension extremement commune VPATH
pour lui dire de regarder aussi dans OBJDIR.



Effectivement, j'ai ajouté :
vpath %.o $(OBJDIR)
j'ai ensuite du retirer mes $(OBJDIR) de mes lignes de compilation, et
maintenant, ça fonctionne super bien.

Deja, ton mkdir -p `dirname $(OBJDIR)/$@` me fait ticker.
Normalement, $@ doit etre le bon nom de cible, et il faudrait un
bete mkdir -p ${@D}


Effectivement, ça ne doit pas être portable non plus.

Merci.
Publicité
Poster une réponse
Anonyme