Schließen Sie Quelldateien beim Kompilieren nach Architektur aus

8

Ich schreibe ein Go-Programm für Windows, das mehrere Pakete enthält. Eines dieser Pakete verwendet CGo, um einige Funktionen aufzurufen, die in einigen .h- und .c-Dateien definiert sind. Diese .c-Dateien sind abhängig von windows.h.

Da die Entwicklung auf der Windows-Plattform unglaublich mühsam ist, möchte ich die Funktionen in dieser Datei nachbilden und stattdessen auf Linux aufbauen. Aber wenn ich versuche zu kompilieren, bekomme ich:

%Vor%

Da das go-Tool versucht, meine Windows-abhängigen Dateien zu kompilieren. Gibt es einen Weg dahin? Ich weiß, dass etwas wie

gesetzt wird %Vor%

ist nicht die beste Vorgehensweise, aber in diesem Fall brauche ich etwas, um nur die "Linux" -Dateien kompilieren zu können.

    
Johan Wikström 02.09.2013, 11:02
quelle

1 Antwort

12

Zitat aus der Build-Constraints -Dokumentation:

  

Eine Build-Einschränkung ist ein Zeilenkommentar, der mit der Anweisung + build beginnt und die Bedingungen auflistet, unter denen eine Datei in das Paket aufgenommen werden soll. Constraints können in jeder Art von Quelldatei (nicht nur Go) vorkommen, aber sie müssen am Anfang der Datei erscheinen, nur mit Leerzeilen und anderen Zeilenkommentaren.

     

Um Build-Constraints von der Paketdokumentation zu unterscheiden, muss auf eine Reihe von Build-Constraints eine Leerzeile folgen.

     

Eine Build-Einschränkung wird als OR von durch Leerzeichen getrennten Optionen ausgewertet. Jede Option wird als AND ihrer durch Komma getrennten Begriffe ausgewertet. und jeder Ausdruck ist ein alphanumerisches Wort oder, dem seine Negation vorausgeht. Das heißt, die Build-Einschränkung:

%Vor%
  

entspricht der booleschen Formel:

%Vor%
  

Eine Datei kann mehrere Build-Einschränkungen haben. Die Gesamtbeschränkung ist das UND der einzelnen Bedingungen. Das heißt, die Build-Einschränkungen:

%Vor%
  

entspricht der booleschen Formel:

%Vor%
  

Während eines bestimmten Builds sind die folgenden Wörter erfüllt:

  • das Zielbetriebssystem, wie es von runtime.GOOS
  • geschrieben wird
  • die Zielarchitektur, wie sie von runtime.GOARCH
  • geschrieben wird
  • Der verwendete Compiler, entweder "gc" oder "gccgo"
  • "cgo", wenn ctxt.CgoEnabled true ist
  • "go1.1", ab Go Version 1.1
  • alle zusätzlichen Wörter, die in ctxt.BuildTags
  • aufgelistet sind
  

Wenn der Name einer Datei nach dem Entfernen der Erweiterung und einem möglichen _test-Suffix mit einem der folgenden Muster übereinstimmt:

%Vor%
  

(Beispiel: source_windows_amd64.go) oder die Literale:

%Vor%
  

(Beispiel: windows.go) wobei GOOS und GOARCH für alle bekannten Betriebssystem- und Architekturwerte stehen, dann wird davon ausgegangen, dass die Datei eine implizite Build-Einschränkung enthält, die diese Ausdrücke erfordert.

     

Um zu verhindern, dass eine Datei für den Build berücksichtigt wird:

%Vor%
  

(jedes andere unzufriedene Wort funktioniert auch, aber "ignorieren" ist konventionell.)

     

Um eine Datei nur mit cgo und nur unter Linux und OS X zu erstellen:

%Vor%
  

Eine solche Datei wird normalerweise mit einer anderen Datei gepaart, die die Standardfunktionalität für andere Systeme implementiert, die in diesem Fall die Einschränkung tragen würde:

%Vor%
  

Wenn Sie eine Datei dns_windows.go benennen, wird sie nur beim Erstellen des Pakets für Windows einbezogen. In ähnlicher Weise wird math_386.s nur beim Erstellen des Pakets für 32-Bit x86 enthalten sein.

    
zzzz 02.09.2013, 11:09
quelle

Tags und Links