2017-03-09 14 views
1

Ich habe ein Makefile, und ich versuche, diesen bestimmten Satz von Variablen zu machen und implizite Regeln arbeitenWarum funktioniert diese implizite Makefile-Regel nicht?

pcode-LINKDEPS := pasv5-database pasv5-log pasv5-utils 
%/node_modules: $(%-LINKDEPS) 
    cd $*; npm install; for link in $^ ; do npm link $$link ; done 
pasv5-database: 
    cd libs/database; npm link 

I pcode/node_modules Verzeichnis entfernen und führen make -d und ich kann sehen, dass es die Musterregel %/node_modules aufgreift und tut die grundlegende Installation, aber die $^ Erweiterung ist leer und so die Verbindung nicht erfolgt und die Voraussetzung pasv5-Datenbank wird nie ausgeführt. Bedeutet dies, dass ich % nicht innerhalb der Voraussetzung Erweiterung setzen kann, und wenn ja, welchen Ansatz kann ich ergreifen, um pcode-LINKDEPS für die Liste der Voraussetzungen ausgewählt, so dass das Ziel pasv5-database ausgeführt wird?

Oder mache ich einen anderen grundlegenden Fehler?

Die pasv5-Datenbank (und die anderen Elemente von pcode-LINKDEPS) sind alle in .PHONY definiert.

Antwort

3

Das Problem ist, dass $(%-LINKDEPS) erweitert wird, bevor die Regel mit dem Ziel übereinstimmt, das Sie erstellen möchten. Und da Sie keine Variable namens %-LINKDEPS haben, expandiert sie zu nichts.

Versuchen secondary expansion:

.SECONDEXPANSION: 
%/node_modules: $$(%-LINKDEPS) 
    ... 
+0

Perfect. Ich hatte eigentlich einige von denen, die nicht funktionierten, aber jetzt macht es genau das, was ich will. – akc42