2011-10-28 8 views
10

È possibile impostare la catena di build in modo tale che eventuali modifiche nei commenti (o spazi) vengano ignorate? Ad esempio ogni volta che viene modificato un commento in un file di intestazione, ogni file sorgente che lo include viene ricompilato, anche quando ciò non è necessario.C++ build setup per ignorare le modifiche nei commenti

Quando il preprocessore è terminato con la rimozione dei commenti dal file modificato, la catena di build potrebbe innanzitutto verificare se l'output è effettivamente cambiato. In caso contrario, dovrebbe comportarsi come se il file stesso non fosse cambiato.

Utilizzo Visual Studio 2010 btw.

Modifica: @MikeSeymour, VS's cl.exe ha un interruttore/Gm per le ricostruzioni minime. Non è ben documentato, ma penso che sia ciò che sto chiedendo. Ma non è compatibile con l'opzione/MP per l'utilizzo di più core. Sul mio dual core (con hyperthreading),/Gm dovrebbe saltare la compilazione di ~ 3 su 4 unità in media. Mentre trovo dubbio che questo sia il caso, non sono nemmeno sicuro di come valutare se/Gm ne vale la pena o meno.

+2

Interessante. Fondamentalmente vorrai un sistema di build esteso che elabori un target, quindi confronta il risultato con il file esistente e * non * sovrascrive se sono uguali. Quindi lo combinerai con la separazione della fase di preelaborazione in un bersaglio separato, e avresti finito. Sarebbe una bella caratteristica! –

+1

Ho una vaga idea che Visual Studio lo faccia comunque - penso di ricordarlo mentre produce messaggi come "ignorare i cambiamenti irrelavent". Potrei sbagliarmi però.Per altre piattaforme di sviluppo, puoi fare esattamente quello che vuoi con [ccache] (http://ccache.samba.org/). –

+0

@MikeSeymour: ccache _does_ impedisce la ricompilazione per le variazioni di spazi bianchi al di fuori dei commenti (e giustamente, IMO) – sehe

risposta

0

No.

Come può il compilatore a sapere che le uniche modifiche apportate a un file erano nei commenti, fino a quando non compila quel file?

I file successivi devono quindi essere ricompilati perché il file dipendente è cambiato, anche se il binario risultante era lo stesso.

+2

L'OP sta dicendo che la modifica di un commento in un file .hpp potrebbe causare la ricompilazione di centinaia di file .cpp senza modifiche rilevanti nell'intestazione. Sì. L'hpp deve essere riesaminato per vedere se c'è un cambiamento, ma quando non è stata rilevata alcuna modifica rilevante, è possibile salvare tutti quelli .cpps dalla ricompilazione. L'unica volta che ciò non sarebbe possibile è quando fai cose rare come finire un .hpp con '/ *' e poi inserisci '* /' nel file incluso. (non è sicuro che tu possa farlo!) – tenfour

+0

È possibile ignorare le modifiche ai commenti semplicemente preelaborando e non compilando; questo è ciò che [ccache] (http://ccache.samba.org/) fa. Ho una vaga idea che Visual Studio faccia qualcosa di simile (penso che a volte stampi messaggi sulla falsariga di "ignorare le modifiche irrilevanti"), ma è passato molto tempo da quando l'ho usato. –

0

Esistono molte tecniche per evitare molte interdipendenze. Prova a utilizzare la dichiarazione anticipata.

Con l'utilizzo della dichiarazione di inoltro è sufficiente compilare il codice che utilizza effettivamente il codice. Il libro di Scott Myers può dirti di più. Ha un buon numero di pagine su questo argomento.

+2

Forse più adatto come commento, dal momento che non risponde alla domanda in alcun modo. –

+0

Cristiano - Stavo dando per scontato che ciò implicasse che la modifica di un file richiedesse la compilazione di una serie di altri file. –

+4

Forse, ma la vera domanda è di natura completamente diversa, comunque. Sicuramente le dichiarazioni avanzate sono una buona idea, ma non sono una risposta alla sua domanda. –

2

Sì. Devi avere un sistema di build che ti consenta di attivare eventi di build se alcuni predicati sono veri. Quello che vorresti è un predicato che dice "questo file è cambiato in un modo semanticamente interessante".

Una buona approssimazione di tale predicato esiste, nella forma della nostra famiglia di strumenti SmartDifferencers che confronta i file del codice sorgente, utilizzando una conoscenza approfondita (ad esempio un parser di produzione) della struttura del codice sorgente. In particolare, SmartDifferencer mostrerà le modifiche nel codice sorgente in termini di modifiche ai costrutti del linguaggio (ad es. Identificatori, dichiarazioni, dichiarazioni, blocchi) e azioni di modifica plausibili (inserire, sostituire, eliminare, spostare, rinominare, rinominare-attraverso il blocco, ecc. .). Non è interessato al layout o ai commenti (a meno che non lo si imponga). Quindi è abbastanza facile da ottenere che SmartDifferencer indichi se un file di codice sorgente ha cambiato qualcosa di diverso dai commenti o dagli spazi bianchi. Gli SmartDifferencer esistono per un'ampia varietà di lingue.

Ora, come si può far cooperare il sistema di generazione? Unix Crea trigger su un predicato, ma non di questo tipo; ciò che effettivamente fa è attivare eventi di build su entità basate sulla data di recency delle date del file rispetto all'obiettivo. È possibile simulare ciò avendo una dipendenza da un file "changed_signal", producendo tale file, se lo SmartDifferencer vede una differenza interessante.

+0

Bello, è anche più di quello che stavo chiedendo. Potrebbe anche essere troppo. Immagina "solo" l'inserimento di una linea vuota: come si suppone che il debugger sappia che ogni breakpoint che segue quella linea è disattivato di uno? È possibile integrare questo SmartDifferencer con VS 2010? –

+0

Beh, nel caso del debugger, è piuttosto facile. Ha una mappatura dei punti di interruzione per i numeri di riga nel file iniziale. Inserisci linee arbitrarie; l'IDE crea una tabella che dice "N righe inserite nella riga legacy M". Ora qualsiasi numero di linea di breakpoint legacy può essere mappato con un numero di linea moderno. Se l'IDE può tenere traccia di questo tavolo per lunghi periodi è un'altra questione, ma sono rimasto molto colpito dal fatto che MS Visual Studio faccia proprio questo durante le mie sessioni di debug piuttosto bene. Non ricordo come funziona bene attraverso le invocazioni dell'IDE. –

+0

Per quanto riguarda "lo SmartDifferencer è integrato in VSStudio" ... beh, non conosco la risposta, non siamo arrivati ​​a questo punto. È uno strumento che può essere richiamato dalla riga di comando e restituisce i codici di stato degli errori. Credo che VSStudio ti consenta di eseguire qualsiasi strumento del genere. Se è possibile inserirlo nel processo di compilazione come descritto ... Non ho mai visto come MSVisual Studio gestisca effettivamente i passaggi di generazione in questi giorni. Partendo dal presupposto che è qualcosa come i file make (non è stato MS a spingere qualcosa chiamato NMake?) Sembra che dovrebbe essere possibile. –

Problemi correlati