Faire un don ! | | style | statistiques | contactez-nous | plan | lettre d'information

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 2005
Bonjour,

J'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 !
> Lire le message (8 commentaires, moyenne: 1,4).  

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.

make ou $(MAKE)

Posté par Étienne Bersac (Jabber id, page perso, ) le 15/04/2005 à 18:05. (lien). Évalué à 0.

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.

    --
    www.doublehp.org
    le site qui sera toujours en construction ...
    • [^]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

        --
        www.doublehp.org
        le site qui sera toujours en construction ...
        • [^]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.

            --
            www.doublehp.org
            le site qui sera toujours en construction ...
    • [^]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&nbsp;$2/ || s/^(\s*)\t(\S)/$1&nbsp&nbsp;&nbsp;&nbsp;$2/) {}' fichier_source

Oops

Posté par Étienne Bersac (Jabber id, page perso, ) le 15/04/2005 à 22:54. (lien). Évalué à 0.

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