2010-11-09 12 views
4

J'essaie de comprendre pourquoi je ne peux pas spécifier une cible comme étant dans un répertoire différent. J'essaie de générer des classes php à partir de fichiers json, mais j'ai changé la ligne qui génère réellement le php en une déclaration d'écho factice, donc quelqu'un d'autre peut simplement copier coller et tester si elles se sentent très généreux.Comment spécifier une cible makefile dans un répertoire différent?

Il y a deux autres choses à ajouter au répertoire contenant le makefile:

  • Un fichier de dépendance factice appelé PatientDbPath.json
  • Un répertoire appelé à

Si j'ai un makefile par ce qui suit:

.SUFFIXES: .php .json 
.json.php: 
    echo "HelloMe" > PatientDbPath.php 

PatientDbPath.php: PatientDbPath.json 

clean: 
    $(RM) PatientDbPath.php 

Puis tout fonctionne quand je exécuter make; PatientDbPath.php est correctement créé et la prochaine fois que je lance make, je reçois le message make: 'PatientDbPath.php' is up to date.

Cependant, je veux générer le fichier php dans un répertoire distinct, donc je mis à jour mon makefile à ce qui suit:

.SUFFIXES: .php .json 
.json.php: 
    echo "HelloMe" > out/PatientDbPath.php 

out/PatientDbPath.php: PatientDbPath.json 

clean: 
    $(RM) out/PatientDbPath.php 

Dès que je fais cela, Make me dit make: Nothing to be done for 'out/PatientDbPath.php' même s'il n'y a pas de fichier PatientDbPath.php dans le répertoire out.

Alors j'ai pensé que c'était peut-être quelque chose avec les règles du suffixe et j'ai créé un troisième makefile.

out/PatientDbPath.php: PatientDbPath.json 
    echo "Whatever" > out/PatientDbPath.php 

clean: 
    rm out/PatientDbPath.php 

Celui-ci fonctionne bien, comme le premier. Est-ce que quelqu'un peut voir ce que je fais mal dans mon deuxième makefile?

Merci.

Répondre

3

Il existe deux erreurs dans votre règle générique (.json -> .php), une conceptuelle et une pratique.

L'erreur conceptuelle est qu'il s'agit d'une règle permettant de convertir des fichiers json arbitraires (disons, foo.json) en fichiers .php arbitraires, mais avec le même nom (disons, json.php). Pourtant, votre règle est spécifique à gnerating PatientDbPth.php. Une meilleure règle serait

.json.php: 
    echo "HelloMe" > [email protected] 

[email protected] est une variable nommant le fichier de sortie.

Cela montre également le problème pratique: Ces règles sont vraiment restreintes aux fichiers portant le même nom. Si vous avez une règle traduisant .json en .php, et vous avez foo.php, et que vous voulez bar.php, alors la règle générique ne correspondra pas. La correspondance implique le nom complet du fichier, de sorte que la règle générique ne correspond pas lorsque vous demandez out/PatientDbPath.php. Cela vous laisse avec la règle qui n'a aucune action, donc faire inférer que rien ne doit être fait.

S'il s'agit du seul fichier que vous souhaitez convertir, il est préférable de l'écrire comme vous l'avez fait dans le troisième fichier. Si vous avez beaucoup de fichiers json, et que vous voulez tous les convertir en/*.php, et que vous utilisez GNU make, vous pouvez utiliser des règles génériques généralisées de GNU make:

out/%.php: %.json 
    action 
+0

Merci pour la réponse, je vais essayer de changer mon vrai makefile pour utiliser la notation suggérée. Je vais suivre ou marquer la réponse très bientôt. En ce qui concerne les problèmes conceptuels, ce que j'ai posté ici est juste un exemple de makefile qui montre le problème, pas comment mon makefile réel. –

+0

Très bien, je l'ai testé et vous aviez absolument raison, en changeant mon makefile pour utiliser 'out /%. Php:% .json' a fait l'affaire. J'ai une question de suivi. Dois-je créer une règle distincte pour chaque fichier .json dans ce répertoire? –

+0

J'ai trouvé une solution pour ce que je voulais, fondamentalement je dois ajouter la ligne suivante: 'all :: $ (patsubst% .json, out /% .php, $ (joker * .json))' Cela ajoutera une dépendance de chacun des fichiers php à générer à partir de chacun des fichiers .json dans ce répertoire –

2

Il y a une autre façon de faire la même chose, peut-être plus élégante:

$(JSON_FILES): out/%.php: %.json 
    action 

Cela va créer une règle pour chaque fichier dans la liste JSON_FILES, donc si elle était définie JSON_FILES= foo.json bar.json, cela équivaudrait à:

out/foo.php: foo.json 
    action 

out/bar.php: bar.json 
    action 

Vous pouvez ensuite utiliser $(wildcard *.json) pour définir cette valeur si vous voulez vraiment tous les fichiers .json, ou définissez-le manuellement si la règle est unique à quelques-uns.