Perché Visual Studio 2012 esegue un passaggio di compilazione personalizzato quando il file di origine non è stato modificato?

 C Programming >> Programmazione C >  >> Tags >> File
Perché Visual Studio 2012 esegue un passaggio di compilazione personalizzato quando il file di origine non è stato modificato?


Sto usando yacc e lex con Visual Studio 2012 C++/CLI e ho creato un passaggio di compilazione personalizzato per il file sorgente yacc come mostrato nell'immagine seguente



Ci sono due dipendenze per il file di output. Sono il file sorgente yacc icl5kyacc.y e il file modello yyparse.c. Ogni volta che costruisco la soluzione, il passaggio di build personalizzato viene eseguito anche quando i file sorgente yyparse.ce icl5kyacc.y non sono stati modificati. Ecco l'elenco delle directory dopo una 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

E dopo aver ricostruito di nuovo


2> Generazione di icl5kyacc.cpp da 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

Mi sbaglio nel credere che l'utilizzo di una fase di compilazione personalizzata debba applicare automaticamente regole di dipendenza standard tra i file di input e di output della fase di compilazione? Una cosa che mi incuriosisce è il %(AdditionalInputs) macro che Studio ha inserito per me in Dipendenze aggiuntive. Non sono sicuro di cosa sia o se stia in qualche modo puntando a un file che viene modificato.


Risposte:


Il problema era che %(Directory) era un percorso relativo dal genitore della soluzione alla directory del progetto "ICL5K\ICL5K\" e durante la compilazione la directory corrente è già la directory del progetto. Quindi il dipendente yyparse.c veniva cercato in C:\ICL5K\ICL5K\ICL5K\ICL5K. Avrei dovuto usare $(ProjectDir) che è un percorso completo dalla radice incluso l'identificatore di unità "C:\ICL5K\ICL5K\". Ma ancora meglio era rendersi conto che tutti i file di input e output erano nella directory del progetto e che era già la directory predefinita corrente e rimuovere tutte le macro di directory come mostrato di seguito

Inoltre non è necessario specificare icl5kyacc.y come dipendente dalla build personalizzata step è una proprietà di icl5kyacc.y quindi quel file è già incluso come dipendente.