Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

makefile et compilation seulement-une-fois

0 views
Skip to first unread message

TSalm

unread,
Dec 4, 2009, 5:41:57 PM12/4/09
to
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

Richard Delorme

unread,
Dec 4, 2009, 6:09:23 PM12/4/09
to
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

unread,
Dec 4, 2009, 6:18:36 PM12/4/09
to
Le Sat, 05 Dec 2009 00:09:23 +0100, Richard Delorme <abu...@nospam.fr> a
ᅵcrit:

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

unread,
Dec 5, 2009, 1:19:21 AM12/5/09
to
Le 05/12/2009 00:18, TSalm a ᅵcrit :

> Le Sat, 05 Dec 2009 00:09:23 +0100, Richard Delorme <abu...@nospam.fr> a
> ᅵ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

Marc Espie

unread,
Dec 5, 2009, 5:50:42 AM12/5/09
to
In article <op.u4fsdasnk9rspk@papillon>, TSalm <ts...@free.fr> wrote:
>Le Sat, 05 Dec 2009 00:09:23 +0100, Richard Delorme <abu...@nospam.fr> a
>�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

unread,
Dec 5, 2009, 3:27:17 PM12/5/09
to
>>>> 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.

0 new messages