2012-09-22 7 views
5

Ich verwende yacc und lex mit Visual Studio 2012 C++/CLI und haben einen benutzerdefinierten Schritt für die yacc Quelldatei erstellt, wie untenWarum führt Visual Studio 2012 einen benutzerdefinierten Buildschritt aus, wenn die Quelldatei nicht geändert wurde?

Custom Build Property Page

in Bild gezeigt gibt es zwei Abhängigkeiten für die Ausgabedatei . Sie sind die yacc Quelldatei icl5kyacc.y und die yyparse.c Vorlagendatei. Jedes Mal, wenn ich die Lösung erstelle, wird der benutzerdefinierte Build-Schritt auch dann ausgeführt, wenn die Quelldateien yyparse.c und icl5kyacc.y nicht geändert wurden. Hier ist die Verzeichnisliste nach einem Build.

21-Sep-2012 10:19:18p   28,210 A icl5kyacc.y 
    17-Sep-2012 7:32:06p   9,042 A yyparse.c 
    22-Sep-2012 11:43:56a   38,233 A ICL5KYACC.cpp 
    22-Sep-2012 11:43:56a   2,160 A icl5kyacc.h 

Und nach

2 wieder den Bau> Die Erzeugung icl5kyacc.cpp von icl5kyacc.y

21-Sep-2012 10:19:18p   28,210 A icl5kyacc.y 
    17-Sep-2012 7:32:06p   9,042 A yyparse.c 
    22-Sep-2012 11:45:46a   38,233 A ICL5KYACC.cpp 
    22-Sep-2012 11:45:46a   2,160 A icl5kyacc.h 

Täusche ich mich in der Annahme, dass die einen benutzerdefinierten Schritt unter Verwendung von automatisch Standardabhängigkeitsregeln gelten sollten zwischen den Eingabe- und Ausgabedateien des Erstellungsschritts? Eine Sache, auf die ich gespannt bin, ist das % (AdditionalInputs) Makro, das Studio für mich unter Zusätzliche Abhängigkeiten einfügt. Nicht sicher, was das ist oder ob das irgendwie auf eine Datei zeigt, die gerade geändert wird.

+0

Das Entfernen des Makros **% (AdditionalInputs) ** hatte keine Auswirkungen auf das Problem. – JonN

Antwort

3

Das Problem war, dass% (Directory) ein relativer Pfad vom Eltern der Lösung zum Projektverzeichnis "ICL5K \ ICL5K \" war und das aktuelle Verzeichnis während des Builds bereits das Projektverzeichnis ist. Daher wurde nach der abhängigen Datei "yyparse.c" in C: \ ICL5K \ ICL5K \ ICL5K \ ICL5K gesucht. Ich hätte $ (ProjectDir) verwenden sollen, was ein vollständiger Pfad vom Stamm ist, einschließlich des Laufwerksbezeichners "C: \ ICL5K \ ICL5K \". Aber noch besser war zu erkennen, dass alle Ein- und Ausgabedateien im Projektverzeichnis waren und das bereits das aktuelle Standardverzeichnis war und alle Verzeichnismakros wie unten gezeigt entfernt wurden. image here Es ist auch nicht notwendig, icl5kyacc.y als a anzugeben abhängig, da der benutzerdefinierte Build-Schritt eine Eigenschaft von icl5kyacc.y ist, so dass diese Datei bereits als abhängiger Bestandteil enthalten ist.

3

Sind Sie sicher, dass Ihre Ausgabedateien tatsächlich an der von Ihnen angegebenen Stelle liegen?

Mit Blick auf Ihren Eintrag haben Sie die Eingabe unter %(Directory)yyparse.c (dies sollte auch die. YE-Datei enthalten). Sollte Ihre Ausgabe nicht auch in %(Directory)icl5kyacc.h und %(Directory)ICL5KYACC.cpp liegen, sehen Sie, dass Ihr Eintrag darauf hinweist, dass sie sich im selben Verzeichnis befinden.

Die Build-Task wird erneut ausgeführt, wenn sie die Ausgabedateien nicht finden kann oder wenn die Ausgabedateien älter als die Eingabedateien sind. Wenn der Pfad zu den Ausgabedateien falsch ist, wird das Tool sie nicht finden und annehmen, dass die Erstellungsaufgabe erneut ausgeführt werden muss.

+0

Ihre Antwort ist zwar nicht ganz korrekt, führt aber zur Lösung. Ich dachte,% (Verzeichnis) wäre der vollständige Pfad vom Stammverzeichnis zum Projektverzeichnis, das während des Builds auch das aktuelle Verzeichnis ist. % (Directory) zeigt auf das Projektverzeichnis, aber ohne das Laufwerk oder den führenden Schrägstrich "ICL5K \ ICL5K \", was nicht sehr nützlich ist, da es sich um einen relativen Pfad vom übergeordneten Element der Lösung handelt. Was ich wollte, war $ (ProjectDir), was "C: \ ICL5K \ ICL5K \" ist. Obwohl ich eine einfachere Lösung fand, war es, alle% (Directory) -Makros zu entfernen, da sich alle Dateien im Projektverzeichnis befinden und das bereits das aktuelle Verzeichnis ist. – JonN

Verwandte Themen