#1 Le 10/06/2008, à 16:02
- nizam
[Résolu] Commande non exécutée dans un makefile
Je me suis lancé dans la création d'un makefile sous linux pour compiler mes programmes (simples) en C++. Je suis parti d'un makefile q'un pote à trouvé sur le net mais étant complisqué, je veux le simplifier mais j'ai un souci. A la fin du makefile, je veux supprimer les fichiers objets ".o" qui ont été générés mais la commande ne s'exécute pas.
Voici mon makefile en entier:
# Makefile by nizam
EXECUTABLE := Programme
CPP := g++
OPT_COMPIL := -c
OPT_BUILD := -o
CXXFLAGS :=
LIBS :=
SUFFIXE_HEADER := h
SUFFIXE_FILE := cpp
SUFFIXE_OBJECT := o
HEADERS := $(wildcard *.$(SUFFIXE_HEADER))
FILES := $(wildcard *.$(SUFFIXE_FILE))
OBJECTS := $(patsubst %.$(SUFFIXE_FILE),%.$(SUFFIXE_OBJECT),$(wildcard *.$(SUFFIXE_FILE)))
#.SILENT:
# Cible par defaut
all: $(EXECUTABLE)
# Compilation des objets
.$(SUFFIXE_FILE).$(SUFFIXE_OBJECT):$?
@printf ' CPP %-24s => %s\n' $< $@
@$(CPP) $(OPT_COMPIL) $(CXXFLAGS) $<
# Construction de l'executable
$(EXECUTABLE): $(OBJECTS)
@$(CPP) $(CXXFLAGS) $(OPT_BUILD) $(EXECUTABLE) $(OBJECTS) $(LIBS)
@echo " $(EXECUTABLE) correctement compiler"
# Suppression des fichiers objets
.PHONY: clean mrproper
clean:
@echo " Suppression des fichiers objets"
-rm -f *.o
mrproper: clean
rm -rf $(EXECUTABLE)
Rien ne s'exécute à partir de la ligne .PHONY: clean mrproper.
D'où ma question: pourquoi? et comment résoudre ce problème.
PS à quoi sert la ligne .SILENT que j'ai mis en commentaire et qui n'a rien changer?
Dernière modification par nizam (Le 11/06/2008, à 10:46)
Hors ligne
#2 Le 10/06/2008, à 16:40
- yohann
Re : [Résolu] Commande non exécutée dans un makefile
salut
pourquoi c'est des := au lieu des =?
la regle mrproper ne semble pas exister
fait attention au espaces qui trainent, les makefile aime pas trop en général
astuce emacs: ctrl+s puis esapace
sinon ton makefile fait un peu penser a
alias make='g++ *.cpp' qd meme mais bon
j.vachez, le génie du net | Soirées jeux sur Lyon | 441
++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.
Hors ligne
#3 Le 10/06/2008, à 17:08
- nizam
Re : [Résolu] Commande non exécutée dans un makefile
pourquoi c'est des := au lieu des =?
C'est ce qu'il y avait dans le fichier que l'ont m'a donné.
la regle mrproper ne semble pas exister
Comment ça? tu ne l'a jamais rencontrée ou je l'ai mal écrite?
fait attention au espaces qui trainent, les makefile aime pas trop en général
j'ai vérifié, après la ligne [@echo " $(EXECUTABLE) correctement compiler"], j'ai supprimé tous les espaces et ça ne fonctionne toujours pas.
Hors ligne
#4 Le 10/06/2008, à 17:31
- yohann
Re : [Résolu] Commande non exécutée dans un makefile
c'est surtout que je l'avais pas vu
sinon clean depend de mrproper donc je pense que c'est inutilie de specifier que .PHONY depend de clean
puisque make va evaluer .PHONY => evaluer mrproper =>evaluer clean => executer clean => executer mrproper => executer .PONY
je sais pas si le pb vient de la, mais en tout cas c'est inutile de le mettre
sinon ca a l'air correct, bonne chance
PS:
http://www2.lifl.fr/~ryl/ens/doc/make.html
Dernière modification par yohann (Le 10/06/2008, à 17:33)
j.vachez, le génie du net | Soirées jeux sur Lyon | 441
++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.
Hors ligne
#5 Le 11/06/2008, à 10:45
- nizam
Re : [Résolu] Commande non exécutée dans un makefile
C'est bon un pote a réussi à résoudre mon problème. Je ne sais pas d'où ça venais mais le principal est que ça fonctionne maintenant.
je vous met quand même le makefile final au cas où d'autres auraient le même soucis.
#Makefile by nizam"
EXECUTABLE := Programme
CPP := g++
OPT_COMPIL := -c
OPT_BUILD := -o
CXXFLAGS :=
LIBS :=
SUFFIXE_HEADER := h
SUFFIXE_FILE := cpp
SUFFIXE_OBJECT := o
HEADERS := $(wildcard *.$(SUFFIXE_HEADER))
FILES := $(wildcard *.$(SUFFIXE_FILE))
OBJECTS := $(patsubst %.$(SUFFIXE_FILE),%.$(SUFFIXE_OBJECT),$(wildcard *.$(SUFFIXE_FILE)))
#.SILENT:
# Cible par defaut
all: $(EXECUTABLE)
# Compilation des objets
.$(SUFFIXE_FILE).$(SUFFIXE_OBJECT):$?
@printf ' CPP %-24s => %s\n' $< $@
@$(CPP) $(OPT_COMPIL) $(CXXFLAGS) $<
# Construction de l'executable
$(EXECUTABLE): $(OBJECTS)
@$(CPP) $(CXXFLAGS) $(OPT_BUILD) $(EXECUTABLE) $(OBJECTS) $(LIBS)
@echo " $(EXECUTABLE) correctement compiler"
# Suppression des fichiers objets
@rm -f *.o
@echo " Suppression des fichiers objets"
Hors ligne