IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

{makefile} Problème de passage de paramètre et exécution de règles


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2010
    Messages : 59
    Par défaut {makefile} Problème de passage de paramètre et exécution de règles
    voulant optimiser un makefile exécutant un ensemble de commandes (Docker), passe par paramètre au fichier makefile
    j'ai tenté de créer une règle générique pour un groupe de commandes
    cependant, je me suis rendu compte que :
    la règle n'est jamais appelée du fait que le paramètre a le même nom que la fonction
    Nom : Screenshot from 2025-06-14 11-28-33.png
Affichages : 107
Taille : 34,5 Ko

    j'ai donc modifié le code pour encaisser le paramètre avec une commande addprefix mais cela donne le même résultat
    Dans d'autres tests, le paramètre récupéré n'existe plus dans la règle appelée (problème de thread)

    J'ai tenté de faire une double substitution de chaîne de constantes mais la commande subst rend un résultat foireux.
    Nom : Screenshot from 2025-06-14 12-11-17.png
Affichages : 98
Taille : 37,9 Ko

    existet-il un moyen de regle se probleme ou de le contourner <

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Bonjour,

    Citation Envoyé par moons17 Voir le message
    la règle n'est jamais appelée du fait que le paramètre a le même nom que la fonction
    Ce n'est pas pour cela qu'elle n'est jamais appelée mais parce que ces règles sont en fait des « cibles » (target). Chaque cible correspond en fait au nom d'un fichier qui doit en être produit à son issue. En conséquence, si la cible existe déjà, c'est-à-dire s'il existe un fichier portant le nom de la cible dans le répertoire depuis lequel on exécute le Makefile, alors elle ne sera pas honorée puisque c'est inutile.

    Les noms de cibles après le deux-points « : » correspondent à des dépendances : ces cibles seront traitées récursivement avant celle qui est invoquée et produites si elles n'existent pas encore, parce que le fichier ciblé est censé en avoir besoin. Si la cible existe et ses dépendances aussi mais que celles-ci sont plus récentes, alors la cible sera re-générée quand même car elle aura besoin d'être mise à jour compte tenu des dernières versions des dépendances. Par « plus récentes », on parle ici de la date de génération du fichier tel qu'indiqué par le FS.

    Il est également possible de préciser plusieurs noms de fichiers dans une même cible lorsqu'ils sont produits par la même opération, ce qui fait que ton Makefile reste syntaxiquement correct mais en pratique, cela n'est que très rarement utilisé.

    On ne peut pas non plus définir deux cibles pour un même fichier, car celui-ci est censé être produit à l'issue de la première. Cela n'a donc pas de sens. Si le Makefile en contient, un avertissement est émis et seule la dernière cible est traitée.

    Il est enfin possible d'écrire des règles génériques pour des classes de fichiers tels que « %.c » qui, ici, permet de s'appliquer à tous les fichiers se terminant par « .c ». Tous, sauf s'ils font justement l'objet d'une cible explicite. La règle générique n'est donc utilisée qu'en dernier recours, si aucune autre règle ne correspond.

    Il est cependant possible d'indiquer à make qu'une cible est virtuelle avec .PHONY : toute règle spécifiée après ce mot-clé sera systématiquement traitée si elle est invoquée (directement ou par les dépendances) même si un fichier portant son nom existe déjà. On se sert de cela principalement pour créer des règles qui doivent servir de commandes, telles que clean, all, install, uninstall ou autres.

    Donc, si ici ta règle générique ne sert qu'à afficher « service $@ », tu peux déclarer une règle virtuelle et la coller en dépendance à test1 à test2 :

    Code Makefile : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    .PHONY: show_service
     
    show_service:
            echo "service $@"
     
    test1: show_service
     
    test2: show_service
            echo "passe $(CMD)"

    Par contre, dans le cas présent, $@ renverra systématiquement « show_service »…

  3. #3
    Membre averti
    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2010
    Messages : 59
    Par défaut
    dans mon cas d'utilisation je ne gere pas des fichier a traiter mais l'execution de commande (exemple de deux commandes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ....
    $(CMDS):
    	echo "$(YELLOW)➼ docker service $@$(COLRESET)" \
    	echo $(ROOT_DIR)$(SRC_DIR)$(DOCKER_FILE_Comp) \
    	$(DOCKER_COMPOSE) $@ $(FLG_CMD)  2>&1 </dev/null && \
    		(echo $(CLEARLINE)"$(GREEN)[OK]$(COLRESET)	: "$@ ; (exit 0);) || \
    		(echo $(CLEARLINE)"$(RED)[KO]$(COLRESET)	: "$@ ; (exit 1)) \
     
     
    up : $(CMDS)
     
    down: $(CMDS)
    j'ai une regle similiaire qui fonctionne pour la creation et un autre pour la suppresion de fichier qui fonctionnent alors que celle des commandes non , la seul difference reside dans le fait que je n'utilise pas de parametre , mais d'une liste de constante. d'ou ma question

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo