Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

make -j [problème de makefile]

2 réponses
Avatar
JKB
Bonjour à tous,

Je viens de googliser pendant pas mal de temps pour essayer de
trouver une solution à un problème qui pourtant est assez trivial,
mais je dois m'y prendre comme un manche.

Considérons un projet (avec des vrais morceaux de automake
dedans). Le Makefile.am commence par :

SUBDIRS = tools lapack/blas lapack/lapack rpliconv src rpltags scripts man doc

La compilation se passe admirablement bien lorsqu'elle est lancée
par un make tout court. Avec un make -j2, je n'ai jamais relevé de
problème. Par contre, j'ai un utilisateur ce matin qui a eu l'idée
de lancer la compilation avec un make -j8 et là, catastrophe. Je
m'explique : le répertoire src requière des bibliothèques compilées
dans tools, lapack et un utilitaire de rpliconv.

Je cherche donc à bloquer la compilation de src jusqu'à ce que
toutes les cibles précédentes soient achevées. J'ai bien trouvé une
cible .NOPARALLEL, mais ça me semble une usine-à-gaz à utiliser pour
l'utilisation que je vais en faire. La doc de make ne m'avance pas
beaucoup, pourtant, ça doit être un problème connu. Je ne dois juste
pas chercher au bon endroit.

Une idée ?

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.

2 réponses

Avatar
JKB
Le 11-02-2010, ? propos de
make -j [problème de makefile],
JKB ?crivait dans fr.comp.os.unix :
Bonjour à tous,

Je viens de googliser pendant pas mal de temps pour essayer de
trouver une solution à un problème qui pourtant est assez trivial,
mais je dois m'y prendre comme un manche.

Considérons un projet (avec des vrais morceaux de automake
dedans). Le Makefile.am commence par :

SUBDIRS = tools lapack/blas lapack/lapack rpliconv src rpltags scripts man doc

La compilation se passe admirablement bien lorsqu'elle est lancée
par un make tout court. Avec un make -j2, je n'ai jamais relevé de
problème. Par contre, j'ai un utilisateur ce matin qui a eu l'idée
de lancer la compilation avec un make -j8 et là, catastrophe. Je
m'explique : le répertoire src requière des bibliothèques compilées
dans tools, lapack et un utilitaire de rpliconv.

Je cherche donc à bloquer la compilation de src jusqu'à ce que
toutes les cibles précédentes soient achevées. J'ai bien trouvé une
cible .NOPARALLEL, mais ça me semble une usine-à-gaz à utiliser pour
l'utilisation que je vais en faire. La doc de make ne m'avance pas
beaucoup, pourtant, ça doit être un problème connu. Je ne dois juste
pas chercher au bon endroit.



Bon, je me réponds à moi-même parce que je crois avoir trouvé
quelque chose d'assez élégant et qui pourra intéresser :

ST_SUBDIRS = vim examples lapack rpliconv tools
SUBDIRS = src scripts man doc rpltags
EXTRA_DIST = LIMITATIONS Licence_CeCILL_V2-fr.txt
Licence_CeCILL_V2-en.txt

include_HEADERS = rplconfig.h

licences:
cp -f $(top_builddir)/COPYING $(srcdir)
make -C src $@

toolsclean:
for i in @NCURSES@ @READLINE@ @UNITS@ @GSL@ @GPP@ @GNUPLOT_COMPILATION@
@FILE@ @ICONV@;
do
rm -rf $(srcdir)/tools/$$i;
done;

tools:

.PHONY: tools

$(top_builddir)/tools/@NCURSES@/lib/libncurses.a: tools
(cd $(top_builddir)/tools/@NCURSES@ && $(MAKE) $(AM_MAKEFLAGS))

$(top_builddir)/tools/@READLINE@/libreadline.a
$(top_builddir)/tools/@READLINE@/libhistory.a: tools
(cd $(top_builddir)/tools/@READLINE@ && $(MAKE) $(AM_MAKEFLAGS))

$(top_builddir)/tools/@GSL@/.libs/libgsl.a: tools
(cd $(top_builddir)/tools/@GSL@ && $(MAKE) $(AM_MAKEFLAGS))

$(top_builddir)/tools/@ICONV@/lib/.libs/libiconv.a: tools
(cd $(top_builddir)/tools/@ICONV@ && $(MAKE) $(AM_MAKEFLAGS))

$(top_builddir)/tools/@ICONV@/lib/.libs/libiconv.a: tools
# La dépendance est faite par rpliconv

$(top_builddir)/lapack/lapack/liblapack.a: tools
(cd $(top_builddir)/lapack/lapack && $(MAKE) $(AM_MAKEFLAGS))

$(top_builddir)/lapack/blas/libblas.a: tools
(cd $(top_builddir)/lapack/blas && $(MAKE) $(AM_MAKEFLAGS))

$(top_builddir)/rpliconv/rpliconv: tools
(cd $(top_builddir)/rpliconv && $(MAKE) $(AM_MAKEFLAGS))

$(top_builddir)/tools/@FILE@/src/rplfile
$(top_builddir)/tools/@FILE@/magic/magic.mgc: tools
$(top_builddir)/tools/@ICONV@/lib/.libs/libiconv.a
(cd $(top_builddir)/tools/@FILE@ && $(MAKE) $(AM_MAKEFLAGS))

all: $(top_builddir)/tools/@NCURSES@/lib/libncurses.a
$(top_builddir)/tools/@READLINE@/libreadline.a
$(top_builddir)/tools/@READLINE@/libhistory.a
$(top_builddir)/tools/@GSL@/.libs/libgsl.a
$(top_builddir)/tools/@ICONV@/lib/.libs/libiconv.a
$(top_builddir)/lapack/lapack/liblapack.a
$(top_builddir)/lapack/blas/libblas.a
$(top_builddir)/rpliconv/rpliconv
$(top_builddir)/tools/@FILE@/src/rplfile
$(top_builddir)/tools/@FILE@/magic/magic.mgc
$(MAKE) $(AM_MAKEFLAGS) -C src all

J'ai donc remonté les dépendances à la racine pour ne compiler le
contenu du répertoire src que lorsque tout les outils sont déjà
disponibles.

Ne restent que deux ou trois choses à mettre au point...

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Avatar
Emmanuel Florac
Le Thu, 11 Feb 2010 11:43:43 +0000, JKB a écrit:

J'ai donc remonté les dépendances à la racine pour ne compiler le
contenu du répertoire src que lorsque tout les outils sont déjà
disponibles.




Ça paraît une méthode correcte :)

--
Si non confectus non reficiat.