2013-09-02 16 views
8

Sto scrivendo un programma Go per Windows che contiene diversi pacchetti. Uno di questi pacchetti utilizza CGo per chiamare alcune funzioni definite in alcuni file .h e .c. Questi file .c dipendono da windows.h.Escludi i file di origine go per architettura durante la compilazione

Dal momento che lo sviluppo sulla piattaforma Windows è incredibilmente noioso, vorrei creare un mockup delle funzioni in questo file e svilupparlo su Linux. Ma quando provo a compilare ottengo:

fatal error: windows.h: No such file or directory 

Poiché lo strumento go tenta di compilare i miei file dipendenti da Windows. C'è un modo per aggirare questo? So che mettere qualcosa come

#ifdef .. 
import x 
#endif 

non è delle migliori pratiche, ma in questo caso ho bisogno di qualcosa per consentire la compilazione solo i file "Linux".

risposta

12

Citando dalla documentazione build constraints:

Un vincolo build è una riga di commento che inizia con la direttiva + build che elenca le condizioni in cui un file deve essere incluso nel pacchetto. I vincoli possono apparire in qualsiasi tipo di file sorgente (non solo Go), ma devono comparire in cima al file, preceduti solo da righe vuote e altri commenti di riga.

Per distinguere i vincoli di compilazione dalla documentazione del pacchetto, una serie di vincoli di costruzione deve essere seguita da una riga vuota.

Un vincolo di compilazione viene valutato come OR delle opzioni separate dallo spazio; ogni opzione valuta come AND dei suoi termini separati da virgole; e ogni termine è una parola alfanumerica o, preceduta da!, la sua negazione. Cioè, il vincolo di costruzione:

// +build linux,386 darwin,!cgo 

corrisponde alla formula booleana:

(linux AND 386) OR (darwin AND (NOT cgo)) 

Un file può avere più vincoli di compilazione. Il vincolo generale è l'AND dei vincoli individuali. Cioè, i vincoli di build:

// +build linux darwin 
// +build 386 

corrisponde alla formula booleana:

(linux OR darwin) AND 386 

durante una particolare costruzione, le seguenti parole sono soddisfatti:

  • il sistema operativo di destinazione, come chiaramente dalla runtime.GOOS
  • l'architettura target, come chiaramente dalla runtime.GOARCH
  • il compilatore in uso, viene "gc" o "gccgo"
  • "CGO", se ctxt.CgoEnabled è true
  • "go1.1", da Go versione 1.1 in poi
  • eventuali ulteriori parole elencate ctxt.BuildTags

Se il nome di un file, dopo la rimozione del prolungamento e le possibili suffissi _test, corrisponde a uno dei seguenti modelli:

*_GOOS 
*_GOARCH 
*_GOOS_GOARCH 

(esempio: source_windows_amd64.go) o letterali:

GOOS 
GOARCH 

(esempio: windows.go) dove GOOS e GOARCH rappresentano rispettivamente qualsiasi sistema operativo noto e valori architettura, il file è considerato avere un vincolo accumulo implicito da tali termini.

Per conservare un file venga preso in considerazione per la compilazione:

// +build ignore 

(qualsiasi altra parola insoddisfatta funziona così, ma “ignora” è convenzionale.)

Per costruire un file solo quando si utilizza cgo e solo su Linux e OS X:

// +build linux,cgo darwin,cgo 

Tale file viene generalmente accoppiato con un altro file attuare la funzionalità predefinita per altri sistemi, che in questo caso sarebbe portare il vincolo:

// +build !linux,!darwin !cgo 

Denominazione di un file di dns_windows.go ne causa da includere solo quando si crea il pacchetto per Windows; allo stesso modo, math_386.s sarà incluso solo quando si costruisce il pacchetto per x86 a 32 bit.

Problemi correlati