Retourner aux forums || Retourner au forum Programmation.c
Programmation.c : Makefile : récursion variable
Posté par Étienne Bersac (Jabber id, page perso, ) le 15 avril 2005J'ai besoin d'un Makefile lançant une recursion pour chaque dossiers contenus dans une varibale.
Typiquement, j'aurai besoin de pouvoir faire un
@for d in $(DIR) ; do cd $d && make ; done
mais comment faire sans que $d soir remplacé par '' ?
Merci
E Ultreïa !
make ou $(MAKE)
bon, évidement, j'ai oublié de mettre $(MAKE) à la place de make.
Pardonnez-moi cette écart de jeunesse.
E Ultreïa !
-
[^]Re: make ou $(MAKE)
Posté par doublehp (page perso, ) le 15/04/2005 à 19:56. (lien). Évalué à 2.ta solution est tres sale.
regarde plutot ca:
dans le dossier parent de mon projet:
LIBS= lib
APPS= app1 app2
OTHER= database doc
TARGETS= $(LIBS) $(APPS) $(OTHER)
#TARGETS = `find . -type d -maxdepth 1 | awk -F/ '/\// {print $2}' | sort`
all:
install:
clean:
distclean:
uninstall:
%:
@for t in $(TARGETS); do \
$(MAKE) -C $$t $@ || exit; \
done
@if [ $@ = "install" ];\
then \
echo -e "\r\nDont forget to run 'ldconfig' after successfull install, and to add /usr/local/lib in /etc/ld.so.conf\r\n";\
fi
tu notera la tentative de recherche automatique des sous dossiers, mais j ai remarque que ce n etait pas tres portable; donc actuellement, je reste sur un truc 'manuel'
Dans le dossier lib, je dois ensuite continuer la recursion sur toutes les libs; la ca va tres vite: toutes les targets sont envoyees d un seul coup.
ALL_LIBS := $(wildcard lib*)
#ALL_LIBS = `find . -type d -maxdepth 1 | awk -F/ '/\// {print $2}'| grep -v '^\.'`
%:
@for t in $(ALL_LIBS); do \
$(MAKE) -C $$t $@ || exit; \
done
ca marche car tous les sous dossiers contiennent le mot 'lib', et comme ca il n y a pas de tentative de recursion sur le Makefile lui meme ou le README local.
Voici une petite variante dans le dossier doc:
ALL_DIRS = en fr pres
%:
@for t in $(ALL_DIRS); do \
$(MAKE) -C $$t $@ || exit; \
done
j avais tente un ALL_DIRS := `find . -type d -maxdepth 1 | awk -F/ '/\// {print $2 }' ` mais je n etais pas satisfait.
Pour nettoyer le projet, tu met donc a l aracine, et tu 'make clean' ... et ca clean tout.
$(MAKE) -C sert a faire du make recucsif automatiquement. le || exit; permet d arreter tout le process si une regle echoue. Sans ca, je vois un build echouer dans un dossier, et le for continue dans le dossier suivant, ce qui ammenais a des arbres partiellement complets ... et comme le dernier message etait un succes, je ne voyais pas le fail qui se cachait au milieu.
DSL pour l indentation cassee, mais ce *** de site reparse tout a sa maniere ... ca me desole.
Le but est assez judicieux: le dossier parent contient toutes les targets, mais aucune definition. Les dossiers intermediaires recursent le travail, sans rien reflechire. ce ne seront que les dossiers finaux qui contiendront les defs des regles. c est pour ca que le dossier 'doc' ne sais pas si la regle en cours est un clean, ou un all. Il s en tape, il fait juste passer l enveloppe a ses enfants sans regarder ce qu il y a dedans.-
[^]Re: récursion, arborescence, etc.
Posté par Étienne Bersac (Jabber id, page perso, ) le 15/04/2005 à 23:14. (lien). Évalué à 0.Merci beaucoup,
Pour mon cas :
Un dossier src contient le programme de base. Chaque module a sont dossier dedans. serait-ce plus judicieux - selon toi - de les placer dans un dossier src/lib ? ( c'est courant des les gros projet je crois).
Un make dans src sous-traite-tout (all, clean). Comme tu as dit, j'ai sévèrement besoin de mieux gérer les erreurs, et de passer ça de manière plus transparente. Le programme a ses dépendances écrites dans le Makfile. j'arrive bien à faire les -l% etc. J'ai vu un peu info make, et je voie bien que mon cd $$d ; make est vraiment mauvais.
Pour chaque module, il y un makefile qui se débrouille pour générer le lib.a dans lib, à coté de src, à la racine. Est-ce une bonne idée de rassembler tous les .a ?
Toute suggestion sur une arborescences plus propre et plus facile pour make est bienvenue.
Tout est ici : admin.crazydwarves.org/cgi-bin/viewcvs.cgi/ineptie/src , si tu es curieux :) (seul le module listes est interressant à voir pour le makefile). désolé pour les magouilles entre utf-8 et iso-8859-1 ...
Merci encore.
(HS : il y a-t-il un moyen pour dire à emacs d'utilise tel encodage dans dans un dossier ?)--
E Ultreïa !-
[^]Re: récursion, arborescence, etc.
Posté par doublehp (page perso, ) le 16/04/2005 à 00:43. (lien). Évalué à 0.heu ... ce osir je suis en etat de coller du code, pas d en ecrire.
moi mon dossier lib contient des DLL ... que je cre moi meme.
pour toi, je verrais bien:
src/lib/*
src/bin (ou src/bin/* si tu a plusieur apps)
doc
perso, je fais un dossier par executable, parce que mon makefile est le meme pratout:
# Hello
# Here is my stupid Makefile :=)
#
# It is designed for lama C programmers who dont want
# to bother with Makefiles; rules :
# - it draw a list of all .c files
# - it checks if ALL corresponding .h files exist
# - it produces all corresponding .o files
# - it compiles all that stuff and build the binary file called $PROG_NAME
#
# WARNING : It produces only one single binary file what ever the
# number of source files is.
#
# then you shold be able to copy that Makefile in any of your projects
# and if your source files are well organized, the binary file
# will be built very easily, WITHOUT HAVING TO LIST, NOR SORT
# THE REAL LIST OF FILES
#
# that is why I like it : if you ever add any .c file to your
# project, hop, no need to change any rule
# ONLY re run make ;)
#
# You might also enjoy yourself using:
# 'make clean ; make && sudo make install'
#
# enjoy, and see you ;)
#
CP = /bin/cp
SHELL = /bin/sh
CFLAGS = -g -Wall -I../lib/libmalloc-n -I../lib/libocr-dhp-base # -O is for use of iopl in rs232.c
LFLAGS= -L../lib/libmalloc-n -L../lib/libocr-dhp-base
EXTRA = -locr-dhp-base -lmalloc-n
STRIP = strip
C_FILES := $(wildcard *.c)
H_FILES = $(C_FILES:%.c=%.h)
O_FILES = $(C_FILES:%.c=%.o)
PROG_NAME := ocr_dhp_extract_sub_pics
INSTALL_PATH := /usr/local/bin
all: $(PROG_NAME)
$(PROG_NAME): $(O_FILES)
$(CC) $(LFLAGS) $(EXTRA) -o $@ $(O_FILES)
%.o: %.c
$(CC) $(CFLAGS) -o $@ -c $<
strip: $(PROG_NAME)
$(STRIP) $(PROG_NAME)
clean:
$(RM) $(O_FILES) $(PROG_NAME)
install: $(PROG_NAME)
$(CP) $(PROG_NAME) $(INSTALL_PATH)
uninstall:
$(RM) $(INSTALL_PATH)/$(PROG_NAME)
et c est le meme pour tous mes projets.
La question est: pourquoi genere tu des .a ? les libs statiques c est gravement depasse. La mode est aux DLL:
# Makefile to build some DLL for Linux systems.
# this Makefile has not been proof tested.
# if may not work on large projects. Especially install
# and uninstall targets ...
PROJECT_NAME= libmalloc-n
PROJECT_MAJ= 0
PROJECT_MIN= 0
PROJECT_LIB=$(PROJECT_NAME).so
PROJECT_LIB_MAJ=$(PROJECT_LIB).$(PROJECT_MAJ)
PROJECT_LIB_MIN=$(PROJECT_LIB_MAJ).$(PROJECT_MIN)
PROJECT_SONAME= $(PROJECT_LIB_MAJ)
# Note:
# `gcc -print-libgcc-file-name`
LIBS_TO_BUILD= $(PROJECT_LIB_MIN)
LIBS= $(PROJECT_LIB)
#CFLAGS=
#LFLAGS= -lnetpbm -lm -lncurses
LIBCFLAGS= -fPIC
LIBLFLAGS= -shared -Wl,-soname,
LIB_INSTALL_PATH=/usr/local/lib
INCLUDE_INSTALL_PATH=/usr/local/include
LDCONFIG= /sbin/ldconfig
LN=/bin/ln
CP=/bin/cp
C_FILES := $(wildcard *.c)
H_FILES := $(wildcard *.h)
O_FILES = $(C_FILES:%.c=%.o)
all: $(LIBS_TO_BUILD)
install: $(LIBS_TO_BUILD)
$(CP) -d --preserve=links \
--target-directory=$(LIB_INSTALL_PATH) \
$(PROJECT_LIB) $(PROJECT_LIB_MAJ) $(PROJECT_LIB_MIN)
# $(LDCONFIG)
$(CP) --target-directory=$(INCLUDE_INSTALL_PATH) $(H_FILES)
$(PROJECT_LIB_MIN): $(O_FILES)
$(CC) $(LIBLFLAGS)$(PROJECT_SONAME) -o $@ $<
$(RM) $(PROJECT_LIB_MAJ)
$(LN) -s $(PROJECT_LIB_MIN) $(PROJECT_LIB_MAJ)
$(RM) $(PROJECT_LIB)
$(LN) -s $(PROJECT_LIB_MAJ) $(PROJECT_LIB)
%.o: %.c
$(CC) $(LIBCFLAGS) -c $<
clean:
$(RM) *.o
$(RM) *.so*
uninstall:
@for t in $(PROJECT_LIB) $(PROJECT_LIB_MAJ) $(PROJECT_LIB_MIN); do \
$(RM) $(LIB_INSTALL_PATH)/$$t; \
done
$(RM) $(INCLUDE_INSTALL_PATH)/$(H_FILES)
# $(LDCONFIG)
la partie interessante etant
LIBCFLAGS= -fPIC
LIBLFLAGS= -shared -Wl,-soname,myname
pour ton encoding, AMHA c est une var d env a exporter ... quel que soit ton editeur ... ou peut etre pas :D-
[^]Re: récursion, arborescence, etc.
Posté par Étienne Bersac (Jabber id, page perso, ) le 16/04/2005 à 13:05. (lien). Évalué à 0.je voulais juste grouper mes .o afin de simplifier mes makefiles, un module génère un .a que les autres modules peuvent inclures au besoin sans faire appel à pleins de .o C'est tou ce dont j'ai besoin et les lib statiques le font très bien. Comme tu le dis, c'est une question de mode.
Quand à l'arborescence, tout es bien comme cela. je préfère centraliser les lib afin d'avoir un seul $(LIBDIR) pour tous mes Makefile.
Pour emacs, qq ligne dans mon .emacs ont résolu tout cela :
bersace@celebrad:~/Projects/ineptie/src/listes$ tail ~/.emacs
(if (string< "/home/bersace/Projects/ineptie" (getenv "PWD"))
(progn
(setq-default buffer-file-coding-system 'iso-8859-1)
(set-language-environment "French"))
(progn
(setq-default buffer-file-coding-system 'utf-8)
(set-language-environment "UTF-8")))
Merci. C'est suffisant pour le moment, je peux compiler mon projet, avec ses deps et tout.--
E Ultreïa !-
[^]Re: récursion, arborescence, etc.
Posté par doublehp (page perso, ) le 16/04/2005 à 17:47. (lien). Évalué à 0.moi ce que j en dit ... c est pour moi ...
mon taf EST d ecrire une DLL ... et evidement le ELF de demo qui montre que ca marche bien :) si tes besons sont tres differents ... tes sols peuvent aussi differer.
-
-
-
-
[^]Re: make ou $(MAKE)
Posté par gc (page perso, ) le 16/04/2005 à 19:54. (lien). Évalué à 2.DSL pour l indentation cassee, mais ce *** de site reparse tout a sa maniere ... ca me desole.
Tu peux regarder le source du site et essayer de faire mieux.
En attendant tu peux passer ton code à la moulinette qui suit pour garder quelque chose de visuellement correct (c'est pas exactement optimal mais ça fonctionne) :
perl -pi -e 'while (s/^(\s*) (\S)/$1 $2/ || s/^(\s*)\t(\S)/$1  $2/) {}' fichier_source
-
Oops
oops, il suffit de mettre $$m
info make ...
Désolé.
E Ultreïa !
Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.c



Cette discussion est archivée, il n'est plus possible de laisser des commentaires.
Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.