2009-08-19 5 views
3

Je met à jour un Makefile qui accède à des ressources provenant d'une source externe, par exemple il y a une règle de la formevariables Lire Makefile de la console sinon mis en

$(External)/% : 
    cvs up [email protected] 

... qui fonctionne comme prévu sans restriction Ressources. Maintenant, il y a eu une dérive de fonction et les ressources externes nécessite une connexion plus complexe, de sorte que la règle a changé quelque chose pas trop différent de ceci:

$(External)/% : 
    cvs -d :pserver:$(CVSUSER)@cvs-server up [email protected] 

... ce qui rend la règle en fonction de la variable CVSUSER. La manière rapide et facile d'appliquer ceci serait d'abandonner avec un message d'erreur utile s'il n'est pas défini. Mais ce n'est pas amusant, je voudrais lire la variable CVSUSER de la console si elle n'est pas mise à jour au moment où elle est nécessaire. Je ai naïvement essayé

CVSUSER ?= $(shell read -p "User name: ") 

mais cela ne fonctionne évidemment pas :) Comment allez-vous faire cela?

Répondre

1

Ah, bien sûr, j'ai besoin d'une variable simplement développée, pas une variable récursive. De cette façon, je peux laisser la variable dépendre d'elle-même et utiliser les utilitaires Make normaux pour la définir conditionnellement. L'attribution conditionnelle crée implicitement une normale (récursive) un, donc je dois faire soit

CVSUSER := $(shell if [ -z $(CVSUSER) ] ; then read -p "User name: " REPLY ; echo $$REPLY ; fi) 

ou

ifndef CVSUSER 
    CVSUSER := $(shell then read -p "User name: " REPLY ; echo $$REPLY ; fi) 
endif 
3

$(shell) récupère la sortie de la commande shell. Mais read lit l'entrée dans une variable (REPLY par défaut) et ne la sort pas. Voici une solution rapide:

CVSUSER ?= $(shell read -p "User name: ";echo $$REPLY) 
+0

encore, qui invoqueraient la commande shell à chaque fois que la variable est accessible. Ce n'est pas bien quand vous faites quelques centaines de mises à jour de fichiers :) – Christoffer

2

Vous avez déjà trouvé vous-même la solution, mais je dirais que c'est une mauvaise Pratiquez pour créer un makefile qui dépend de l'interaction de l'utilisateur à tout moment après avoir été appelé. Cela rend la construction plus difficile à intégrer dans les systèmes de construction automatisés (par exemple, CruiseControl, AntHill, etc), et rend également plus difficile à intégrer dans les systèmes de construction distribués (pvmgmake, etc).

Une meilleure approche consisterait à mettre la vérification pour CVSUSER dans un script wrapper qui appelle le makefile, puis de quitter immédiatement le makefile avec une erreur si CVSUSER n'est pas défini.

Meilleures salutations,

Eric Melski

http://blog.electric-cloud.com

+0

Si le Makefile n'est pas utilisé pour la création de logiciels, il est plutôt utilisé pour simplifier la création de divers fichiers de configuration à partir de templates ("run make here machines pour vous "), puis la lecture de l'entrée de l'utilisateur peut être justifiée. Ce n'est pas un cas courant, bien sûr, mais c'est un cas d'utilisation que j'ai déjà vu. –

Questions connexes