2016-08-04 46 views
0

Problem: Target wird nicht erstellt, da die Abhängigkeitsliste zur Laufzeit erstellt wird. So geben Sie die Abhängigkeitsliste an, wenn beim Deklarieren von Variablendateien keine Dateien vorhanden sind.Festlegen der Variablen in der Makefile-Regel

Wie man Variable VIP_FOFs VIP_XMLs vom Rezept (Regel) neu definiert?

Code: (* .fof Dateien werden vom Skript temp.pl vom Ziel copy_fof generiert) Gibt es also eine Möglichkeit, folgende VIP_FOFs und VIP_XMLs aus dem Rezept von copy_fof zu deklarieren? sein muss, basierend auf Beschreibungen von Ziel/Voraussetzungen Abhängigkeiten

VIP_FOFs := $(wildcard $(RECITAL_PATH)/vip_xml/xml_generation/*.fof) 

VIP_XMLs = $(VIP_FOFs:.fof=.xml) 

all: copy_fof $(RECITAL_PATH)/catalog/catalog.xml 

copy_fof: 
     `perl temp.pl` 

%.xml: %.fof 
    rpfImport \ 
     --view rtl_simulation \ 
     --append_log \ 
     --log $(RECITAL_PATH)/logs/rpfImport.log \ 
     --format fof --vlnv ,,$(notdir $(basename $< .fof)), \ 
     --output [email protected] $< ; 

$(RECITAL_PATH)/catalog/catalog.xml: $(VIP_XMLs) 
    @echo "# generating catalog.xml "; \ 
    rpfCatalog --add $(VIP_XMLs) 
+0

Bitte korrigieren Sie Ihre Formatierung, es ist schwer zu verstehen. – user657267

+0

Dank @Kusalanada. Hoffe, es ist jetzt klar –

+1

Nein, es ist überhaupt nicht klar. Sie erklären nicht klar, wonach Sie fragen, welches Ergebnis Sie derzeit haben, warum es nicht zufriedenstellend ist und nicht zuletzt, was Sie zeigen, dass es nicht einmal eine gültige Syntax ist. Bitte helfen Sie uns, Ihnen zu helfen. –

Antwort

0

make soll nur wieder aufzubauen. Wenn jedes Mal, wenn Sie make aufrufen, die *.fof Ziele von Ihrem temp.pl Skript neu erstellt werden, ist make eher nutzlos. Um jedes Mal alles neu zu erstellen, passen Sie einfach Ihr Perl-Skript an, um den Job zu beenden, und verwenden Sie nicht make.

Im Folgenden werde ich davon ausgehen, dass, solange das temp.pl Skript nicht ändert, es keine Notwendigkeit gibt, die *.fof neu zu erstellen. Ich nehme auch an, dass Sie den Namen der *.fof Dateien, die Ihr Hauptproblem zu sein scheint, nicht vorhersagen können.

Um dieses Problem zu lösen Sie rekursive make verwenden können (machen Aufruf machen):

VIP_FOFs := $(wildcard $(RECITAL_PATH)/vip_xml/xml_generation/*.fof) 
VIP_XMLs := $(patsubst %.fof,%.xml,$(VIP_FOFs)) 

.PHONY: all 

all: copy_fof 
    $(MAKE) $(RECITAL_PATH)/catalog/catalog.xml 

copy_fof: temp.pl 
    perl temp.pl 
    touch [email protected] 

$(VIP_XMLs): %.xml: %.fof 
    rpfImport \ 
     --view rtl_simulation \ 
     --append_log \ 
     --log $(RECITAL_PATH)/logs/rpfImport.log \ 
     --format fof --vlnv ,,$(notdir $(basename $< .fof)), \ 
     --output [email protected] $< ; 

$(RECITAL_PATH)/catalog/catalog.xml: $(VIP_XMLs) 
    @echo "# generating catalog.xml "; \ 
    rpfCatalog --add $(VIP_XMLs) 

Wenn Sie make aufrufen wird, wird es die all falschen Ziel bauen. Da all falsch ist, wird das Rezept immer ausgeführt. Wenn die leere Datei copy_fof neuer als das temp.pl Skript ist, wird nichts für die Voraussetzungen von all zu tun, die *.fof Dateien sind auf dem neuesten Stand. Andernfalls wird das Skript temp.pl ausgeführt, das die Dateien *.fof erstellt und die leere Datei copy_fof erstellt oder ändert, um anzuzeigen, dass der Job ausgeführt wurde.

Dann wird das all Rezept ausgeführt, make wird ein zweites Mal aufgerufen, um zu erstellen. Diesmal sind die *.fof Dateien vorhanden und die VIP_FOFs und VIP_XMLs Variablen werden die Werte annehmen, die Sie erwarten.

+0

Vielen Dank @Renaud Pacalet ... Verwendung von rekursiven make löst mein Problem. –