1 votes

Comment puis-je faire en sorte que debhelper honore parallel=n ?

J'essaie de faire un paquet Debian pour un projet cmake qui, en mode single-threaded, prend 3 heures à compiler. J'essaie d'obtenir une construction parallèle, mais j'échoue.

J'ai essayé de régler parallel=4 dans mon control comme suit :

#!/usr/bin/make -f
export DEB_BUILD_OPTIONS="parallel=4"

%:
    dh $@ --parallel

Sur la base de la réponse acceptée sur cette question précédente mais je reçois l'avertissement suivant :

dh: warning: invalid flag in DEB_BUILD_OPTIONS: "parallel=4"

Et debhelper invoque toujours make -j1 .

J'ai essayé des variations sur le thème en me basant sur d'autres suggestions/commentaires que j'ai trouvés en ligne, DEB_BUILD_OPTIONS="-j=4" , DEB_BUILD_OPTIONS="-j4" etc., sans effet. J'ai essayé de régler debian/compat a 10 . Le résultat est toujours invalid flag . Comment puis-je faire en sorte que debhelper respecte ce paramètre ?

J'effectue la construction dans un conteneur docker Ubuntu Focal x86_64, et ma version de debhelper es 12.10ubuntu1 .

1voto

user.dz Points 45060

Note : OP a résolu le problème, il est documenté dans sa propre réponse . J'ai laissé cette réponse qui donne un indice pour ceux qui utilisent des étapes de construction personnalisées ( override_dh_* ). Comme ils doivent cartographier la variable.

Documentation que vous avez référencée debian/rules et DEB_BUILD_OPTIONS Il est mentionné qu'il devrait être cartographié/mis en œuvre au niveau inférieur également.

L'extrait de fichier makefile suivant est un exemple de la façon dont on peut implémenter les options de compilation ; vous devrez probablement modifier cet exemple afin de le faire fonctionner pour votre paquet.

...
ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
    NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
    MAKEFLAGS += -j$(NUMJOBS)
endif
...

Alors que le doc donne une make Dans ce cas, un équivalent doit être utilisé pour les éléments suivants cmake . Il ne sera pas difficile de trouver un modèle dans les sources d'un autre paquet ou dans le launchpad directement.

Voici un exemple de cmake lui-même, en mettant en correspondance l'indicateur dans debian/rules directement (donc toujours la syntaxe Makefile) :

ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
    NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
    BOOTSTRAP_FLAGS += --parallel=$(NUMJOBS)
endif

override_dh_auto_configure: $(BUILD_FLAGS_FILE)
        rm -rf Build && mkdir -p Build
        cd Build && ../bootstrap $(BOOTSTRAP_FLAGS)

Source : Toute archive source native cmake*.tar.xz de Construction quotidienne de cmake en amont - Projet Launchpad

1voto

Dan Points 323

Il s'avère que j'avais la mauvaise syntaxe du Makefile.

Le message d'erreur que je voyais provenait de une expression régulière dans dpkg lui-même extrait ici :

         unless (/^([a-z][a-z0-9_-]*)(?:=(\S*))?$/) {
             warning(g_('invalid flag in %s: %s'), $source, $_);
             next;
         }

J'ai relu cette expression régulière un million de fois avant de me rendre compte que la deuxième %s dans l'avertissement n'est pas entouré de guillemets, ce qui signifie que dans le message d'erreur :

dh: warning: invalid flag in DEB_BUILD_OPTIONS: "parallel=4"

Les guillemets autour de "parallel=4" viennent à partir de la variable d'environnement elle-même pas à partir de la chaîne de format.

La solution, c'est de changer

export DEB_BUILD_OPTIONS="parallel=4"

a

export DEB_BUILD_OPTIONS = parallel=4

car lors de la définition de la variable d'environnement, make conserve les guillemets de la première version. Quand make fait l'interpolation de la chaîne de caractères, cela ne fait aucune différence pratique parce que les guillemets sont mangés par le Shell, mais quand un sous-processus lit la valeur depuis un environnement, le " sont préservés.

#!/usr/bin/make -f
export WITH_QUOTES="parallel=3"
export WITHOUT_QUOTES = parallel=3

all:
    bash -c 'printf "WITH_QUOTES=%q\n" "$$WITH_QUOTES"'
    bash -c 'printf "WITHOUT_QUOTES=%q\n" "$$WITHOUT_QUOTES"'

bash -c 'printf "WITH_QUOTES=%q\n" "$WITH_QUOTES"'
WITH_QUOTES=\"parallel=3\"
bash -c 'printf "WITHOUT_QUOTES=%q\n" "$WITHOUT_QUOTES"'
WITHOUT_QUOTES=parallel=3

Le fait que la valeur réelle de la variable d'environnement soit "parallel=4" no parallel=4 ont tous deux déclenché l'alerte, et ont brisé cette expression régulière qui dh pour l'analyser (note de tête ^) :

        if ($opt =~ /^parallel=(-?\d+)$/ && $wanted eq 'parallel') {
            return $1;
        }

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X