J'essaye de compiler un (gros) projet en profitant d'une machine multi-
core et donc de l'option -j de make (pour lancer plusieurs commandes
en parall=E8le), mais j'ai un probl=E8me de d=E9pendances que je n'arrive
pas =E0 r=E9soudre.
Mon projet se comporte de plusieurs r=E9pertoires avec chacun des sous-
r=E9pertoires. En gros, quand je fais 'make' =E0 la racine, il descend
dans tous les r=E9pertoires et y refait 'make', chacun refaisant la m=EAme
chose dans ses sous-r=E9pertoires. En pratique, dans chaque r=E9pertoire,
j'ai un Makefile.inc qui contient une ligne du style 'SUBDIRS =3D dir1
dir2 dir3'. Ce fichier est inclus par le Makefile du r=E9pertoire et il
inclut aussi un fichier de d=E9finitions g=E9n=E9riques qui d=E9finit une
cible pour make comme :
all:
for dir in ${SUBDIRS}; do\
(cd $$dir; ${MAKE});\
done;
Du coup, pour la plupart des r=E9pertoires, le Makefile est un truc
quasi-vide qui inclut le Makefile.inc et le fichier g=E9n=E9rique (qui
contient le bloc ci-dessus), et quand je modifie la structure je n'ai
qu'=E0 changer SUBDIRS dans le Makefile.inc. Je ne sais pas si c'est la
meilleure mani=E8re de faire, mais au moins c'est facile :-)
Mon probl=E8me vient du fait que, dans certains cas, certains
r=E9pertoires doivent =EAtre compil=E9s avant d'autres (par exemple, dir1
avant dir2). Avec un make "normal" (i.e. sans -j), il n'y a qu'une
seule commande ex=E9cut=E9e =E0 la fois, il me suffit donc de mettre les
r=E9pertoires dans le bon ordre dans SUBDIRS.
Par contre, d=E8s que j'utilise -j, make lance plusieurs commandes =E0 la
fois et en particulier, il va commencer dir2 avant que dir1 soit fini.
Ce qui ne marche pas.
Donc, comment je peux faire pour sp=E9cifier un ordre de d=E9pendance ? Si
dir1 et dir2 =E9taient des cibles de make, alors je pourrais dire que
dir2 d=E9pend de dir1, mais en l'occurrence, ce ne sont qu'une variable
qui contient les deux... Je ne vois pas de mani=E8re facile de faire =E7a.
Bon, =E7a n'est pas un syst=E8me que j'ai cr=E9=E9, et il y a peut-=EAtre u=
ne
meilleure mani=E8re de faire =E7a, mais je n'ai qu'un contr=F4le tr=E8s lim=
it=E9
sur ces Makefile, donc je suis oblig=E9 de rester dans ce cadre-l=E0.
J'utilise GNU Make 3.80, d=E8s fois que =E7a ait une importance.
À (at) 19 Dec 2009 08:22:44 GMT, Nicolas George <nicolas$ écrivait (wrote):
Paul Gaborit wrote in message :
Et alors ? Le principe est que l'appel à un makefile secondaire est une cible forcée.
C'est quand même très contradictoire avec le principe de make. Autant utiliser un script, dans ce cas.
Ce n'est pas du tout contradictoire. Cela permet de contrôler finement les choses qu'on peut recompiler en parallèle et celles qu'il faut sériées tout en restant au niveau d'un meta-makefile (sans connaître la structure des makefiles sous-jacents).
-- Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
À (at) 19 Dec 2009 08:22:44 GMT,
Nicolas George <nicolas$george@salle-s.org> écrivait (wrote):
Paul Gaborit wrote in message <wt94onnpfg4.fsf@marceau.enstimac.fr>:
Et alors ? Le principe est que l'appel à un makefile secondaire est
une cible forcée.
C'est quand même très contradictoire avec le principe de make. Autant
utiliser un script, dans ce cas.
Ce n'est pas du tout contradictoire. Cela permet de contrôler finement
les choses qu'on peut recompiler en parallèle et celles qu'il faut
sériées tout en restant au niveau d'un meta-makefile (sans connaître
la structure des makefiles sous-jacents).
--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
À (at) 19 Dec 2009 08:22:44 GMT, Nicolas George <nicolas$ écrivait (wrote):
Paul Gaborit wrote in message :
Et alors ? Le principe est que l'appel à un makefile secondaire est une cible forcée.
C'est quand même très contradictoire avec le principe de make. Autant utiliser un script, dans ce cas.
Ce n'est pas du tout contradictoire. Cela permet de contrôler finement les choses qu'on peut recompiler en parallèle et celles qu'il faut sériées tout en restant au niveau d'un meta-makefile (sans connaître la structure des makefiles sous-jacents).
-- Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Cyrille Lefevre
Jean-Marc Bourguet a écrit :
Cette méthode a l'inconvénient d'introduire une dépendance de foo sur baz, donc l'impossibilité de faire foo sans faire baz. Gnu make a les ORDER-ONLY-PREREQUISITES qui règle ce problème (bsd make le règle avec .ORDER d'après ce que tu écris plus bas)
Bonjour,
c'est l'idée d'après ce qu'il décrit... on ne fait les bin (foo) qu'après les lib (baz) par ex. mais il est toutefois possible de compiler bar et baz en //
Regards, Cordialement,
Cyrille Lefevre. -- mailto:Cyrille.Lefevre-news% supprimer "%nospam% et ".invalid" pour me repondre.
Jean-Marc Bourguet a écrit :
Cette méthode a l'inconvénient d'introduire une dépendance de foo sur baz,
donc l'impossibilité de faire foo sans faire baz. Gnu make a les
ORDER-ONLY-PREREQUISITES qui règle ce problème (bsd make le règle avec
.ORDER d'après ce que tu écris plus bas)
Bonjour,
c'est l'idée d'après ce qu'il décrit...
on ne fait les bin (foo) qu'après les lib (baz) par ex.
mais il est toutefois possible de compiler bar et baz en //
Regards, Cordialement,
Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%nospam@laposte.net.invalid
supprimer "%nospam% et ".invalid" pour me repondre.
Cette méthode a l'inconvénient d'introduire une dépendance de foo sur baz, donc l'impossibilité de faire foo sans faire baz. Gnu make a les ORDER-ONLY-PREREQUISITES qui règle ce problème (bsd make le règle avec .ORDER d'après ce que tu écris plus bas)
Bonjour,
c'est l'idée d'après ce qu'il décrit... on ne fait les bin (foo) qu'après les lib (baz) par ex. mais il est toutefois possible de compiler bar et baz en //
Regards, Cordialement,
Cyrille Lefevre. -- mailto:Cyrille.Lefevre-news% supprimer "%nospam% et ".invalid" pour me repondre.
Rémi Moyen
Jean-Marc Bourguet a écrit :
Je crains que tu ne décrives mal ton problème.
Argh. Je croyais avoir réduit correctement mes Makefile au minimum nécessaire pour expliquer ce qui se passe, mais j'ai dû me planter quelque part... Soit j'ai mal analysé les Makefile, soit j'ai oublié un détail important...
Bon, merci quand même pour ton analyse, je vais re-regarder ça de plus près et essayer de comprendre un peu mieux. -- Rémi Moyen
Jean-Marc Bourguet a écrit :
Je crains que tu ne décrives mal ton problème.
Argh. Je croyais avoir réduit correctement mes Makefile au minimum
nécessaire pour expliquer ce qui se passe, mais j'ai dû me planter
quelque part... Soit j'ai mal analysé les Makefile, soit j'ai oublié un
détail important...
Bon, merci quand même pour ton analyse, je vais re-regarder ça de plus
près et essayer de comprendre un peu mieux.
--
Rémi Moyen
Argh. Je croyais avoir réduit correctement mes Makefile au minimum nécessaire pour expliquer ce qui se passe, mais j'ai dû me planter quelque part... Soit j'ai mal analysé les Makefile, soit j'ai oublié un détail important...
Bon, merci quand même pour ton analyse, je vais re-regarder ça de plus près et essayer de comprendre un peu mieux. -- Rémi Moyen
Rémi Moyen
Cyrille Lefevre a écrit :
Rémi Moyen a écrit :
Bonjour,
J'essaye de compiler un (gros) projet en profitant d'une machine multi- core et donc de l'option -j de make (pour lancer plusieurs commandes en parallèle), mais j'ai un problème de dépendances que je n'arrive pas à résoudre.
Bonjour,
ma boule de cristal ne fonctionne pas actuellement... quel os ? quel make (sysv, bsd, gnu) ? quelle version ?
GNU Make 3.80, c'était marqué dans le message initial (tout en bas, c'est vrai). Sur un Linux RedHat 4.quelque-chose (4.3, je crois -- je ne suis pas sur la machine actuellement).
Merci pour les différentes pistes (et merci à Jean-Marc pour le ORDER-ONLY-PREREQUISITES), mais comme Jean-Marc m'a fait remarquer que mon explication n'a pas l'air de tenir la route, je vais d'abord retourner comprendre les fichiers existants avant de modifier... -- Rémi Moyen
Cyrille Lefevre a écrit :
Rémi Moyen a écrit :
Bonjour,
J'essaye de compiler un (gros) projet en profitant d'une machine multi-
core et donc de l'option -j de make (pour lancer plusieurs commandes
en parallèle), mais j'ai un problème de dépendances que je n'arrive
pas à résoudre.
Bonjour,
ma boule de cristal ne fonctionne pas actuellement...
quel os ? quel make (sysv, bsd, gnu) ? quelle version ?
GNU Make 3.80, c'était marqué dans le message initial (tout en bas,
c'est vrai). Sur un Linux RedHat 4.quelque-chose (4.3, je crois -- je ne
suis pas sur la machine actuellement).
Merci pour les différentes pistes (et merci à Jean-Marc pour le
ORDER-ONLY-PREREQUISITES), mais comme Jean-Marc m'a fait remarquer que
mon explication n'a pas l'air de tenir la route, je vais d'abord
retourner comprendre les fichiers existants avant de modifier...
--
Rémi Moyen
J'essaye de compiler un (gros) projet en profitant d'une machine multi- core et donc de l'option -j de make (pour lancer plusieurs commandes en parallèle), mais j'ai un problème de dépendances que je n'arrive pas à résoudre.
Bonjour,
ma boule de cristal ne fonctionne pas actuellement... quel os ? quel make (sysv, bsd, gnu) ? quelle version ?
GNU Make 3.80, c'était marqué dans le message initial (tout en bas, c'est vrai). Sur un Linux RedHat 4.quelque-chose (4.3, je crois -- je ne suis pas sur la machine actuellement).
Merci pour les différentes pistes (et merci à Jean-Marc pour le ORDER-ONLY-PREREQUISITES), mais comme Jean-Marc m'a fait remarquer que mon explication n'a pas l'air de tenir la route, je vais d'abord retourner comprendre les fichiers existants avant de modifier... -- Rémi Moyen
Rémi Moyen
Paul Gaborit a écrit :
Bon, déjà, vu que je n'ai pas le contrôle complet sur le projet, je doute que je puisse modifier tous les Makefile
Bon, ben t'es mort.
Je m'en doutais un peu, à vrai dire... Bon, disons que c'est aussi une bonne occasion pour essayer de comprendre un peu mieux comment marchent les choses.
Pas complètement... On peut utiliser des fichiers "timestamp" dans le makefile principal pour contraindre l'ordre d'appel des makefiles secondaires.
Ce que tu dis (ici et dans le reste de ta discussion avec Nicolas) m'intéresse, mais j'avoue que je ne comprends pas ce que tu veux dire.
J'imagine que tes fichiers timestamps sont des fichiers vides dont seuls la date de dernier accès compte, mais je ne vois pas comment utiliser ça pour structurer des Makefile.
Est-ce que tu pourrais détailler un peu ?
Merci ! -- Rémi Moyen
Paul Gaborit a écrit :
Bon, déjà, vu que je n'ai pas le contrôle complet sur le projet, je
doute que je puisse modifier tous les Makefile
Bon, ben t'es mort.
Je m'en doutais un peu, à vrai dire... Bon, disons que c'est aussi une
bonne occasion pour essayer de comprendre un peu mieux comment marchent
les choses.
Pas complètement... On peut utiliser des fichiers "timestamp" dans le
makefile principal pour contraindre l'ordre d'appel des makefiles
secondaires.
Ce que tu dis (ici et dans le reste de ta discussion avec Nicolas)
m'intéresse, mais j'avoue que je ne comprends pas ce que tu veux dire.
J'imagine que tes fichiers timestamps sont des fichiers vides dont seuls
la date de dernier accès compte, mais je ne vois pas comment utiliser ça
pour structurer des Makefile.
Bon, déjà, vu que je n'ai pas le contrôle complet sur le projet, je doute que je puisse modifier tous les Makefile
Bon, ben t'es mort.
Je m'en doutais un peu, à vrai dire... Bon, disons que c'est aussi une bonne occasion pour essayer de comprendre un peu mieux comment marchent les choses.
Pas complètement... On peut utiliser des fichiers "timestamp" dans le makefile principal pour contraindre l'ordre d'appel des makefiles secondaires.
Ce que tu dis (ici et dans le reste de ta discussion avec Nicolas) m'intéresse, mais j'avoue que je ne comprends pas ce que tu veux dire.
J'imagine que tes fichiers timestamps sont des fichiers vides dont seuls la date de dernier accès compte, mais je ne vois pas comment utiliser ça pour structurer des Makefile.
Est-ce que tu pourrais détailler un peu ?
Merci ! -- Rémi Moyen
Paul Gaborit
À (at) Sat, 02 Jan 2010 19:09:02 +0000, Rémi Moyen <r.moyen+ écrivait (wrote):
J'imagine que tes fichiers timestamps sont des fichiers vides dont seuls la date de dernier accès compte, mais je ne vois pas comment utiliser ça pour structurer des Makefile.
Est-ce que tu pourrais détailler un peu ?
L'appel à un makefile secondaire est suivi systématiquement par un 'touch' sur un fichier vide (mais sa date change donc). C'est ce fichier (appelé fichier 'timestamp') qui permet de savoir quand a eu lieu le dernier appel à ce makefile secondaire.
Ensuite, une règle d'appel à un makefile secondaire peut être contrainte par un fichier timestamp d'un autre makefile secondaire et ainsi l'ordre d'appel est contraint (et donc non parallélisable) entre ces deux makefiles secondaires sans qu'on touche à leur contenu.
Au niveau le plus haut, on commence genéralement par une règle qui fait un 'touch' sur un fichier timestamp qui déclenche toutes les autres règles.
-- Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
À (at) Sat, 02 Jan 2010 19:09:02 +0000,
Rémi Moyen <r.moyen+news@ukonline.co.uk.invalid> écrivait (wrote):
J'imagine que tes fichiers timestamps sont des fichiers vides dont seuls
la date de dernier accès compte, mais je ne vois pas comment utiliser ça
pour structurer des Makefile.
Est-ce que tu pourrais détailler un peu ?
L'appel à un makefile secondaire est suivi systématiquement par un
'touch' sur un fichier vide (mais sa date change donc). C'est ce
fichier (appelé fichier 'timestamp') qui permet de savoir quand a eu
lieu le dernier appel à ce makefile secondaire.
Ensuite, une règle d'appel à un makefile secondaire peut être
contrainte par un fichier timestamp d'un autre makefile secondaire et
ainsi l'ordre d'appel est contraint (et donc non parallélisable) entre
ces deux makefiles secondaires sans qu'on touche à leur contenu.
Au niveau le plus haut, on commence genéralement par une règle qui
fait un 'touch' sur un fichier timestamp qui déclenche toutes les
autres règles.
--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
À (at) Sat, 02 Jan 2010 19:09:02 +0000, Rémi Moyen <r.moyen+ écrivait (wrote):
J'imagine que tes fichiers timestamps sont des fichiers vides dont seuls la date de dernier accès compte, mais je ne vois pas comment utiliser ça pour structurer des Makefile.
Est-ce que tu pourrais détailler un peu ?
L'appel à un makefile secondaire est suivi systématiquement par un 'touch' sur un fichier vide (mais sa date change donc). C'est ce fichier (appelé fichier 'timestamp') qui permet de savoir quand a eu lieu le dernier appel à ce makefile secondaire.
Ensuite, une règle d'appel à un makefile secondaire peut être contrainte par un fichier timestamp d'un autre makefile secondaire et ainsi l'ordre d'appel est contraint (et donc non parallélisable) entre ces deux makefiles secondaires sans qu'on touche à leur contenu.
Au niveau le plus haut, on commence genéralement par une règle qui fait un 'touch' sur un fichier timestamp qui déclenche toutes les autres règles.
-- Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>