Erstellen von VirtualBox für Windows


Intro


Vielen Benutzern der Windows-Version von VirtualBox (von nun an VB ; nicht zu verwechseln mit Visual Basic) ist bekannt, dass die Entwickler ab 4.3.14 das sogenannte "Hardening" hinzugefügt haben, um dies zu verhindern böswillige Injektionen in VB. Obwohl die Absichten gut waren, verursachte die Implementierung zahlreiche Konflikte mit völlig legitimen Produkten wie Virenschutzprogrammen, kryptografischen Modulen und sogar einigen Updates von Windows selbst, und wenn ein solcher Konflikt auftritt, funktioniert VB einfach nicht mehr. Benutzer müssen mindestens einen Monat warten, bis die neue VB-Version mit den entsprechenden Ausschlüssen veröffentlicht wird. Im schlimmsten Fall muss die in Konflikt stehende Anwendung oder das in Konflikt stehende Update deinstalliert werden, oder VB selbst muss auf die neueste Version 4.3.12 heruntergestuft werden, ohne zu verhärten. Zahlreiche Anfragen zum Hinzufügen einer benutzergesteuerten Ausschlussliste oder eine Option zum Deaktivieren der Absicherung bleiben unbeantwortet. Die einzige Antwort von Entwicklern lautet: "Wenn Sie nicht möchten, dass es selbst aus dem Quellcode erstellt wird". Sieht so aus, als müssten wir.

Obwohl die Build-Anweisungen im offiziellen Projekt-Wiki beschrieben sind, sind sie unvollständig und etwas veraltet, während die Build-Prozedur häufig mit vagen Fehlermeldungen fehlschlägt. Als ich es am Ende zum Laufen brachte, dachte ich, es lohnt sich, es in einem separaten Artikel ausführlich zu dokumentieren. Diese Anweisung wird von Zeit zu Zeit aktualisiert und ist derzeit an die Erstellung von VB Version 6.0.4 angepasst. Wenn Sie jedoch Informationen zum Erstellen früherer Versionen von VB oder Zusatzbibliotheken benötigen, können Sie diese jederzeit aus dem Änderungsverlauf abrufen .

Inhaltsverzeichnis

» Problemstellung
» Ein Wort der Warnung
» Vorbereitung der Build-Umgebung
» Anwendungsinstallationsprobleme
» Letzte Berührungen
» VirtualBox erstellen
» Nachwort
» Änderungen

Problemstellung


Zuerst wollte ich es einfach halten, indem ich nur die Binärkomponenten neu erstellte und sie auf die von der offiziellen Distribution installierte Version kopierte. Dies war jedoch alles andere als einfach, da die Installation auf einer undurchsichtigen System-API beruht und die Installation der Treiber und die Registrierung der COM-Komponenten erfordert. Ich fragte mich, ob es sinnvoll war, zu lernen, wie das alles funktioniert, und ein Skript zur Automatisierung dieser Aufgaben zu schreiben, aber nach einiger Überlegung entschied ich mich, eine vollständige Distribution zu erstellen, die der offiziellen so nahe wie möglich kommt, nur ohne Härten.

Ich muss sagen, dass sich diese Aufgabe als sehr schwierig erwiesen hat und ich sie nicht zu 100% erfüllt habe. Worauf ich gestoßen bin, waren die Guest Additions, die für Windows (32- und 64-Bit), OS / 2, Linux und einige andere * NIX-Systeme bereitgestellt werden. In den Kommentaren im entsprechenden Makefile wird erwähnt, dass sie alle auf verschiedenen Remote-Computern erstellt wurden, und ich freute mich definitiv nicht darauf, eine solche Build-Factory zu verwalten. Meine endgültige Lösung bestand also darin, alles außer den Ergänzungen aus den Quellcodes zu erstellen, aber das offizielle ISO-Image mitzunehmen und es einfach so wie es ist in meine Distribution aufzunehmen. Ich habe nicht überprüft, ob die Zusätze den gleichen Härtungsmechanismus haben, aber selbst wenn dies der Fall ist, habe ich noch nie Beschwerden darüber gehört.

Ein Wort der Warnung


• Sicherheitsüberlegungen

Das Härten wurde nicht aus einer Laune heraus hinzugefügt, sondern war eine Lösung zum Schließen einer Sicherheitsanfälligkeit in VB. Leider weigert sich Oracle, die detaillierte Beschreibung des Problems bereitzustellen, obwohl es vor vielen Jahren behoben wurde. Im Allgemeinen hat dies etwas mit dem DLL-Injection-Mechanismus in Windows zu tun, der im Fall von VB zu einer nicht autorisierten Erhöhung von Berechtigungen auf dem Host-Computer führen kann, und es gibt funktionierende Exploits für diese Sicherheitsanfälligkeit. Seien Sie also gewarnt, wenn Sie sich trotzdem für eine Version ohne Härtung entscheiden.

• Treiber signieren

Ab Vista können Benutzer in 64-Bit-Windows-Versionen keine beliebigen Treiber mehr laden. Die Treiber müssen von einem Zertifikat mit einer zertifikatsübergreifenden Kette signiert sein, die bis zur Microsoft-Stammzertifizierungsstelle reicht (und in Windows 10 mit aktiviertem Secure Boot müssen die Treiber von Microsoft selbst signiert sein). Bevor Sie sich auf den Weg zum Bau von VB machen, müssen Sie entscheiden, wie Sie dieses Problem lösen möchten. Sie können entweder etwas Geld ausgeben und Ihr eigenes Zertifikat kaufen oder versuchen, sich an Drittanbieter zu wenden, die Signaturdienste für Open Source-Projekte anbieten (sofern diese damit einverstanden sind, anfällige Treiber zu signieren), oder Ihr Windows in den Testmodus versetzen, in dem Treiber geladen werden können signiert mit einem lokal generierten Testzertifikat.

In dem Artikel werde ich hauptsächlich das letztere Szenario implizieren, aber ich werde erwähnen, wie sich das Verfahren ändert, wenn Sie ein "ausgewachsenes" Handelszertifikat haben.

Vorbereitung der Build-Umgebung


Im offiziellen Handbuch wird empfohlen, Windows 7 bis 10 als Build-System zu verwenden. Ich habe die ganze Arbeit in Windows 7 SP1 x64 erledigt und glaube nicht, dass die Betriebssystemversion das Verfahren sehr beeinflusst. Beachten Sie bitte, dass die Maschine (real oder virtuell), die Sie zum Erstellen von VB verwenden möchten, über eine Internetverbindung verfügen muss.

Die Build-Umgebung erfordert eine ganze Reihe von Tools. Wenn ein Programm eine tragbare Version hat, bevorzuge ich diese, anstatt das Installationsprogramm zu verwenden.

Jetzt können die folgenden Programme nur als installierbare Distributionen (zumindest offiziell) bezogen werden. Für Visual Studio und SDK / WDK ist es wichtig, die unten angegebene Installationsreihenfolge einzuhalten. Nachdem Sie mit ihnen fertig sind, empfehle ich dringend, Windows Update auszuführen und die neuesten Updates für alle Microsoft-Produkte abzurufen.

Die anderen Programme werden als tragbare Archive oder Quellcodes heruntergeladen:

Sie benötigen außerdem folgende Archive:

Wofür solltest du das alles wollen?
Wenn Sie nicht genau das gleiche Paket wie ich erstellen möchten, können Sie möglicherweise einige der oben genannten Tools entfernen. Hier werde ich einige Details für ihren Zweck im Erstellungsprozess angeben.

  • SDK 8.1
    Der eigentliche Build wird mit SDK 7.1 ausgeführt, Sie benötigen jedoch das SignTool-Programm ab 8.1, da das Programm ab 7.1 keine SHA-1 / SHA-256-Doppelsignatur ausführen kann. Wenn Sie SDK 8.1 an einer anderen Stelle installiert haben, können Sie einfach signtool.exe mit all seinen Abhängigkeiten von dort kopieren und den Pfad dazu in der Datei LocalConfig.kmk (siehe unten ).
  • WiX
    Dies ist das Framework zum Erstellen von MSI-Paketen. Obwohl die endgültige VB-Distribution eine EXE-Datei ist, enthält sie zwei MSI-Dateien. Sie benötigen daher WiX, um sie zu erstellen. Wenn Sie jedoch nur die VB-Binärdateien erstellen möchten, ohne sie zu packen, können Sie dies ohne WiX tun.
  • Sdl
    Diese Bibliothek wird für eine zusätzliche vereinfachte Front-End- VBoxSDL.exe verwendet, die anstelle von VirtualBox.exe . Wenn Sie diese Komponente nicht benötigen, sollten Sie theoretisch in der Lage sein, den Build ohne SDL auszuführen, aber ich habe dies nicht versucht.
  • gSOAP
    Diese Bibliothek wird zum VBoxWebSrv.exe , VB- VBoxWebSrv.exe , verwendet. Wenn Sie nicht über gSOAP verfügen, wird diese Komponente während der Erstellung stillschweigend übersprungen.
  • libvpx , libopus
    Dies sind die Video- und Audio-Codecs, die zum Aufzeichnen des VM-Bildschirms verwendet werden. Wenn Sie sie nicht haben, wird der Build weiterhin erfolgreich abgeschlossen und VB verfügt weiterhin über alle Optionen für die Videoaufnahme. Diese Optionen werden jedoch ignoriert (obwohl die Aufnahmeanimation abgespielt wird, wird keine tatsächliche Aufnahme gespeichert). .
  • Cygwin
    Erforderlich zum Erstellen von libvpx.
  • MiKTeX
    MiKTeX wird zum Kompilieren der PDF-Dokumentation verwendet ( doc\UserManual.pdf ). Ohne dieses Programm wird das PDF stillschweigend beim Erstellen und Verpacken weggelassen.
  • NASM
    Der Assembler, der beim Erstellen von OpenSSL verwendet wird. Sie können es auch ohne Verwendung des Assemblers erstellen, ich empfehle jedoch weiterhin, es zum Generieren eines optimierten Codes zu verwenden.

Hier finden Sie eine Zusammenfassung aller von mir verwendeten Tools und Bibliotheken, einschließlich der genauen Versionen (sofern möglich) und Installationspfade, die ich auf meinem Build-System ausgewählt habe. Die Bezeichnung " {x32|x64} " wird für separate Installationsorte für 32- und 64-Bit-Versionen verwendet.
Programm / WerkzeugVersionInstallationspfad
Visuelles Studio2010 ProfessionalC:\Program Files (x86)\Microsoft Visual Studio 10.0\
SDK7.1C:\Program Files\Microsoft SDKs\Windows\v7.1\
SDK8.1C:\Programs\DevKits\8.1\
Wdk7.1.0C:\WinDDK\7600.16385.1\
Activeperl5.26.1 Build 2601 x64C:\Programs\Perl\
ActivePython2.7.14.2717 x64C:\Programs\Python\
WiX3.11.1.2318C:\Programs\WiX\
Qt5.6.3C:\Programs\Qt\5.6.3-{x32|x64}\
MinGW-324.5.4C:\Programs\mingw32\
MinGW-644.5.4C:\Programs\mingw64\
Cygwin- -C:\Programs\cygwin64\
Sdl1.2.15C:\Programs\SDL\{x32|x64}\
cURL7.64.1C:\Programs\curl\{x32|x64}\
Öffnet1.1.1bC:\Programs\OpenSSL\{x32|x64}\
gSOAP2.8.82C:\Programs\gSOAP\
libvpx1.7.0C:\Programs\libvpx\
libopus1.3C:\Programs\libopus\
MiKTeX Portable2.9.6942C:\Programs\MiKTeX\
NASM2.14.02 x64C:\Programs\nasm\
DocBook XML DTD4.5C:\Programs\DocBook\xml\
DocBook XSL-Stylesheets1.69.1C:\Programs\DocBook\xsl\

Anwendungsinstallations-Macken


Hier gebe ich einige Anweisungen zur Installation einiger der oben genannten Tools, bei denen das Verfahren nicht offensichtlich ist oder zusätzliche Maßnahmen erfordert.

• Windows SDK v7.1
Die Installation dieses SDK schlägt wahrscheinlich fehl, da es die veralteten Versionen der Compiler- und Laufzeitbibliotheken enthält. Nach der Installation von VS 2010 sind im System neuere Versionen vorhanden, sodass die älteren Versionen nicht installiert werden können. Das Hauptinstallationsprogramm betrachtet dies als kritischen Fehler. Um dies zu umgehen, müssen Sie entweder die entsprechenden Kontrollkästchen deaktivieren oder vor der Installation des SDK die Pakete mit dem Namen "Microsoft Visual C ++ 2010 <arch> Redistributable" , "Microsoft Visual C ++ 2010 <arch> Runtime" , "Microsoft" deinstallieren Visual C ++ - Compiler ... ” Lassen Sie das SDK die älteren Versionen davon installieren und führen Sie dann Windows Update aus, um die neuesten verfügbaren Versionen zu erhalten.

Stellen Sie bei der Installation des SDK sicher, dass Sie die Programmbeispiele (Windows Native Code Development -> Beispiele) überprüfen: Sie enthalten einige Skripts, die von den VB-Erstellungsregeln verwendet werden. Ohne sie können Sie die MSI-Pakete nicht erstellen.

• Windows SDK v8.1
Sie müssen nur die Komponente "Windows Software Development Kit" installieren.

• WDK v7.1
Sie müssen nur die Komponente "Build Environments" installieren.

• Qt 5.6.3
Ab Qt 5.7.0 benötigen Sie zum Erstellen Visual Studio 2012 oder höher, sodass wir bei 5.6.x bleiben.
Da es keine offiziellen Builds für Visual Studio 2010 gibt, müssen wir Qt selbst aus dem Quellcode erstellen.

  1. Entpacken Sie das Qt-Quellcodearchiv in C:\Programs\Qt\ und benennen Sie das Verzeichnis qt-everywhere-opensource-src-5.6.3 in 5.6.3-src .
  2. Daneben erstellen Sie ein Verzeichnis build-x32 in dem der Build stattfinden wird.
  3. Öffnen Sie die Konsole und führen Sie die folgenden Befehle aus, um die Umgebung vorzubereiten:
     cd /d C:\Programs\Qt\build-x32 SET QTVER=5.6.3 "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x86 /win7 COLOR 07 SET QTDIR=C:\Programs\Qt\%QTVER%-x32 SET PATH=%QTDIR%\bin;%PATH% SET QMAKESPEC=win32-msvc2010 
    Der SetEnv.Cmd ist optional. Er entfernt die grüne Farbe, die vom Skript SetEnv.Cmd .
  4. Jetzt müssen wir das Skript configure.bat von 5.6.3-src . VB verwendet nicht das meiste, was Qt enthält, daher können wir die Erstellungszeit erheblich reduzieren, indem wir verschiedene Komponenten deaktivieren. Beachten Sie jedoch, dass einige Optionen für VB von entscheidender Bedeutung sind. Insbesondere habe ich Folgendes entdeckt:
    • OpenGL ES 2 wird nicht unterstützt (beim Erstellen von VB findet der Compiler einige Header-Dateien nicht).
    • Die FreeType-Unterstützung muss aktiviert sein (andernfalls wird das Plugin qoffscreen nicht erstellt und ist für VB erforderlich).
    Dies ist die vollständige Befehlszeile, mit der ich am Ende fertig bin:
     ..\5.6.3-src\configure.bat -prefix c:\Programs\Qt\5.6.3-x32 -mp -opensource -confirm-license -nomake tests -nomake examples -no-compile-examples -release -shared -pch -no-ltcg -accessibility -no-sql-sqlite -opengl desktop -no-openvg -no-nis -no-iconv -no-evdev -no-mtdev -no-inotify -no-eventfd -largefile -no-system-proxies -qt-zlib -qt-pcre -no-icu -qt-libpng -qt-libjpeg -qt-freetype -no-fontconfig -qt-harfbuzz -no-angle -incredibuild-xge -no-plugin-manifests -qmake -qreal double -rtti -strip -no-ssl -no-openssl -no-libproxy -no-dbus -no-audio-backend -no-wmf-backend -no-qml-debug -no-direct2d -directwrite -no-style-fusion -native-gestures -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtconnectivity -skip qtdeclarative -skip qtdoc -skip qtenginio -skip qtgraphicaleffects -skip qtlocation -skip qtmacextras -skip qtmultimedia -skip qtquickcontrols -skip qtquickcontrols2 -skip qtscript -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview -skip qtx11extras -skip qtxmlpatterns 
  5. Der hier angegebene Qt-Installationspfad (in der Option -prefix ) wird vom Konfigurationsskript fest in die Zwischenquellcodedateien -prefix , sodass sich auch die Binärdateien daran erinnern. Jede Qt-basierte Anwendung, die mit dieser Bibliothek erstellt wurde, sucht zuerst nach den erforderlichen Plugins in diesem Pfad. Nur wenn sie nicht gefunden werden konnten, verwendet sie ihren eigenen aktuellen Speicherort. In den meisten Fällen ist dies in Ordnung. Angenommen, auf dem Computer, auf dem unser VB installiert ist, befindet sich unter c:\Programs\Qt\5.6.3-x32 weiterer Build von Qt, der jedoch mit verschiedenen Optionen oder von einem anderen Compiler kompiliert wurde. Dann wird VB versuchen, diese (inkompatiblen) Plugins zu laden und abstürzen.
    Es gibt zwei Möglichkeiten, um dieses Problem zu vermeiden. Zunächst wird der Installation eine zusätzliche Datei mit dem Namen qt.conf mit dem folgenden Text qt.conf :
     [Paths] Plugins=. 
    Die andere Möglichkeit besteht darin, den gespeicherten Installationspfad vor dem Erstellen von Qt so zu korrigieren, dass er auf das Verzeichnis der Anwendung verweist. Ich entschied mich für den letzteren Weg, ich mochte die Idee nicht, zusätzliche Dateien zu der Oracle VB-Distribution zu haben. Sie müssen die vom Konfigurationsskript erstellte Datei C:\Programs\Qt\build-x32\qtbase\src\corelib\global\qconfig.cpp Suchen Sie die folgende Zeile:
     static const char qt_configure_prefix_path_str [512 + 12] = "qt_prfxpath=c:/Programs/Qt/5.6.3-x32"; 
    und ersetzen Sie den Pfad durch einen einzelnen Punkt, sodass diese Linie folgendermaßen aussieht:
     static const char qt_configure_prefix_path_str [512 + 12] = "qt_prfxpath=."; 
    Diese Änderung wirkt sich nur auf das Laufzeitverhalten des VB aus. Der Installationsschritt von Qt selbst verwendet den ursprünglichen Pfad, da er jetzt in den Makefiles gespeichert ist, die wir nicht ändern.
  6. Führen Sie als Nächstes den Build mit dem Befehl nmake
  7. Und installieren Sie die erstellte Bibliothek mit nmake install

Öffnen Sie nun ein neues Konsolenfenster und machen Sie dasselbe für die 64-Bit-Version. Sie müssen "x32" in allen Pfaden durch "x64" ersetzen, und die Befehle zur Umgebungsvorbereitung sehen folgendermaßen aus:
 md C:\Programs\Qt\build-x64 cd /d C:\Programs\Qt\build-x64 SET QTVER=5.6.3 "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x64 /win7 COLOR 07 SET QTDIR=C:\Programs\Qt\%QTVER%-x64 SET PATH=%QTDIR%\bin;%PATH% SET QMAKESPEC=win32-msvc2010 

Nach Abschluss der Installation können die Verzeichnisse build-x32 , build-x64 und 5.6.3-src gelöscht werden.

• MinGW
Entpacken Sie einfach die 32- und 64-Bit-Archive in die entsprechenden Installationsverzeichnisse.

• Cygwin
Während der Installation müssen Sie die Pakete make und yasm .

• SDL
  1. Entpacken Sie das SDL-Archiv zweimal in separate Pfade: C:\Programs\SDL\x32\ und C:\Programs\SDL\x64\ .
  2. Verschieben Sie den gesamten Inhalt des Unterverzeichnisses C:\Programs\SDL\x64\lib\x64\ in das übergeordnete Verzeichnis ( C:\Programs\SDL\x64\lib\x64\ in C:\Programs\SDL\x64\lib\ ) und löschen Sie dann die Unterverzeichnisse C:\Programs\SDL\x64\lib\x86 und x64 .
  3. Machen Sie dasselbe für die 32-Bit-Version: Verschieben Sie den Inhalt von C:\Programs\SDL\x32\lib\x86\ nach C:\Programs\SDL\x32\lib\ und löschen Sie dann C:\Programs\SDL\x64\lib\x86 und x64 .

• NASM
Entpacken Sie das Archiv nasm-2.14.02-win64.zip in C:\Programs\ und benennen Sie das resultierende Verzeichnis nasm-2.14.02 in nasm .

• OpenSSL
  1. Entpacken Sie das OpenSSL-Archiv zweimal in C:\Programs\OpenSSL\ und openssl-1.1.1b die Kopien des Verzeichnisses openssl-1.1.1b openssl-1.1.1b-x32 und openssl-1.1.1b-x64 .
  2. Öffnen Sie die Konsole, erstellen und installieren Sie die 32-Bit-Version, indem Sie Folgendes ausführen:
     "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x86 /win7 COLOR 07 set PATH=%PATH%;C:\Programs\nasm cd /d C:\Programs\OpenSSL\openssl-1.1.1b-x32\ perl Configure VC-WIN32 no-shared --prefix=C:\Programs\OpenSSL\x32 --openssldir=C:\Programs\OpenSSL\x32\ssl nmake nmake test nmake install 
    Wenn der Konfigurationsschritt eine beängstigende Warnung über einen fehlenden Compiler ausgibt, ignorieren Sie diese Nachricht bitte, sie liegt unverschämt.
    Wenn Sie NASM nicht verwenden möchten, überspringen Sie einfach den Befehl mit PATH Änderung und geben Sie für das Configure Skript den zusätzlichen Parameter no-asm .
  3. Öffnen Sie nun ein neues Konsolenfenster und machen Sie dasselbe für die 64-Bit-Version:
     "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x64 /win7 COLOR 07 set PATH=%PATH%;C:\Programs\nasm cd /d C:\Programs\OpenSSL\openssl-1.1.1b-x64\ perl Configure VC-WIN64A no-shared --prefix=C:\Programs\OpenSSL\x64 --openssldir=C:\Programs\OpenSSL\x64\ssl nmake nmake test nmake install 
    Das Deaktivieren von NASM ist dasselbe wie bei 32-Bit.
  4. Jetzt können Sie die Verzeichnisse C:\Programs\OpenSSL\openssl-1.1.1b-x32 und openssl-1.1.1b-x64 .

• cURL
  1. Entpacken Sie das cURL-Archiv in C:\Programs\curl\ und benennen Sie das resultierende Unterverzeichnis curl-7.64.1 in curl-7.64.1-x32 .
  2. Öffnen Sie die Datei C:\Programs\curl\curl-7.64.1-x32\winbuild\MakefileBuild.vc in einem Texteditor und suchen Sie nach dem folgenden Codeblock (um die Zeilen Nr. 61–69):
     !IF "$(VC)"=="6" CC_NODEBUG = $(CC) /O2 /DNDEBUG CC_DEBUG = $(CC) /Od /Gm /Zi /D_DEBUG /GZ CFLAGS = /I. /I../lib /I../include /nologo /W4 /wd4127 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL !ELSE CC_NODEBUG = $(CC) /O2 /DNDEBUG CC_DEBUG = $(CC) /Od /D_DEBUG /RTC1 /Z7 /LDd CFLAGS = /I. /I ../lib /I../include /nologo /W4 /wd4127 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL !ENDIF 
    Nach diesen Zeilen fügen Sie die neue Direktive hinzu:
     CFLAGS = $(CFLAGS) /DCURL_DISABLE_LDAP 
    Wenn Sie dies nicht tun, schlägt der Build von VB mit Verbindungsfehlern fehl.
  3. Öffnen Sie nun die Datei C:\Programs\curl\curl-7.64.1-x32\winbuild\gen_resp_file.bat und C:\Programs\curl\curl-7.64.1-x32\winbuild\gen_resp_file.bat nach der ersten Zeile ( @echo OFF ) diesen Befehl ein:
     cd . 
    Es wird nichts anderes getan, als den ERRORLEVEL Code zurückzusetzen. Das Skript ist so einfach, dass es ausgeführt werden kann, ohne einen Befehl auszuführen, der den Fehlercode ändern würde. Wenn dieser Code also vor dem Starten des Skripts ungleich Null war, behält er seinen Wert beim Beenden des Skripts bei, und nmake würde nmake , dass es das Skript war, das diesen Fehlercode zurückgegeben hat, und den Build mit einem Fehler beenden. Das Hinzufügen dieser gefälschten cd behebt das Problem.
  4. curl-7.64.1-x32 nun eine vollständige Kopie von curl-7.64.1-x32 unter dem Namen curl-7.64.1-x64 .
  5. Öffnen Sie die Konsole, erstellen Sie die 32-Bit-Version und kopieren Sie die benötigten Dateien:
     "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x86 /win7 COLOR 07 cd /d C:\Programs\curl\curl-7.64.1-x32\winbuild md C:\Programs\curl\x32 nmake /f Makefile.vc mode=static WITH_SSL=static DEBUG=no MACHINE=x86 SSL_PATH=C:\Programs\OpenSSL\x32 ENABLE_SSPI=no ENABLE_WINSSL=no ENABLE_IDN=no copy ..\builds\libcurl-vc-x86-release-static-ssl-static-ipv6\lib\libcurl_a.lib ..\..\x32\libcurl.lib xcopy /E ..\builds\libcurl-vc-x86-release-static-ssl-static-ipv6\include\curl ..\..\x32\include\curl\ 
  6. Öffnen Sie ein anderes Konsolenfenster und erstellen Sie die 64-Bit-Version:
     "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x64 /win7 COLOR 07 cd /d C:\Programs\curl\curl-7.64.1-x64\winbuild md C:\Programs\curl\x64 nmake /f Makefile.vc mode=static WITH_SSL=static DEBUG=no MACHINE=x64 SSL_PATH=C:\Programs\OpenSSL\x64 ENABLE_SSPI=no ENABLE_WINSSL=no ENABLE_IDN=no copy ..\builds\libcurl-vc-x64-release-static-ssl-static-ipv6\lib\libcurl_a.lib ..\..\x64\libcurl.lib xcopy /E ..\builds\libcurl-vc-x64-release-static-ssl-static-ipv6\include\curl ..\..\x64\include\curl\ copy ..\builds\libcurl-vc-x64-release-static-ssl-static-ipv6\bin\curl.exe ..\..\x64\curl.exe 
    Beachten Sie, dass wir hier zusätzlich zu dem, was wir für die 32-Bit-Version getan haben, auch die Datei curl.exe . Wir werden es später verwenden, um das Bild mit den Gastzugaben herunterzuladen.
  7. Die Verzeichnisse C:\Programs\curl\curl-7.64.1-x32 und curl-7.64.1-x64 werden nicht mehr benötigt und können entfernt werden.

• libvpx
  1. Entpacken Sie das libvpx-Archiv in C:\Programs\libvpx-build\ .
  2. Starten Sie das Cygwin-Terminal, der Build wird dort ausgeführt. Unsere Zielplattform ist Visual Studio 2010; Das Build-System unterstützt es nur teilweise: Es versucht, den eigentlichen Build mit msbuild.exe auszuführen, funktioniert jedoch aus irgendeinem Grund nicht. Ich konnte nicht herausfinden warum. Stattdessen können wir einfach Visual Studio selbst ausführen und es zum Erstellen des Projekts verwenden. Glücklicherweise kann es über die Befehlszeile verwendet werden, so dass es nicht erforderlich ist, die eigentliche IDE zu starten (obwohl Sie dies können, wenn Sie möchten. In diesem Fall müssen Sie die Variable PATH ändern und den Pfad C:\Programs\cygwin64\bin dazu oder erlauben Sie VS auf andere Weise, die dort befindliche und für den Build erforderliche yasm.exe zu finden. Führen Sie zum Ausführen beider Architekturen die folgenden Befehle im Cygwin-Terminal aus:
     mkdir -p /cygdrive/c/Programs/libvpx-build/build32 cd /cygdrive/c/Programs/libvpx-build/build32 ../libvpx-1.7.0/configure --target=x86-win32-vs10 --disable-install-bins --disable-examples --disable-tools --disable-docs --prefix=../../libvpx make "/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/devenv.com" vpx.sln /Project vpx.vcxproj /Rebuild "Release|Win32" make install mkdir -p /cygdrive/c/Programs/libvpx-build/build64 cd /cygdrive/c/Programs/libvpx-build/build64 ../libvpx-1.7.0/configure --target=x86_64-win64-vs10 --disable-install-bins --disable-examples --disable-tools --disable-docs --prefix=../../libvpx make "/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/devenv.com" vpx.sln /Project vpx.vcxproj /Rebuild "Release|x64" make install 
  3. Schließen Sie Cygwin, wir werden es nicht mehr brauchen. Das Verzeichnis C:\Programs\libvpx-build kann entfernt werden.

• Libopus
  1. Entpacken Sie das Opus-Archiv in C:\Programs\libopus-build\ und C:\Programs\libopus-build\ Sie in das Unterverzeichnis opus-1.3\win32\VS2015 .
  2. Dieses Projekt wurde für die neuere Visual Studio-Version entwickelt, daher müssen wir es ändern, damit es in unserer Version 2010 erstellt wird. Sie können dies entweder mit der IDE oder einem Nur-Text-Editor tun. Ich habe mich für Letzteres entschieden. Öffnen Sie die Datei opus.vcxproj und gehen Sie wie folgt vor:
    1. Suchen Sie alle Zeilen, die den Text enthalten
       <PlatformToolset>v140</PlatformToolset> 
      und ersetzen Sie v140 durch v100 . Wenn Sie IDE verwenden, ist dies die Konfigurationsoption "Platrofm Toolset" auf der Seite Konfigurationseigenschaften -> Allgemein. Vergessen Sie nicht die Konfigurations- und Plattform-Selektoren oben im Dialogfeld.
    2. Suchen Sie als Nächstes nach diesem Codeblock:
        <ItemDefinitionGroup> <ClCompile> 
      und fügen Sie ein neues Tag hinzu:
        <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> 
      In der IDE können Sie dies tun, indem Sie die Seite Konfigurationseigenschaften -> C / C ++ -> Allgemein öffnen und "Debug Information Format" in "ProgramDatabase (/ Zi)" setzen. Sie können es auf einen anderen gültigen Wert setzen. Wir benötigen die Debugging-Datenbank überhaupt nicht, aber mit einem ungültigen Wert kann das Projekt nicht erstellt werden.
  3. Erstellen wir nun die Release-Version für beide Plattformen (entweder über die VS-IDE oder die Befehlszeile) und kopieren Sie die Bibliothek opus.lib und das Unterverzeichnis include\ in unseren opus.lib :
     cd /d C:\Programs\libopus-build\opus-1.3\win32\VS2015 md C:\Programs\libopus\lib\x64 md C:\Programs\libopus\lib\Win32 xcopy /EC:\Programs\libopus-build\opus-1.3\include C:\Programs\libopus\include\ "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.com" opus.sln /Project opus.vcxproj /Rebuild "Release|x64" copy x64\Release\opus.lib C:\Programs\libopus\lib\x64\ "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.com" opus.sln /Project opus.vcxproj /Rebuild "Release|Win32" copy Win32\Release\opus.lib C:\Programs\libopus\lib\Win32\ 
  4. Das Verzeichnis C:\Programs\libopus-build kann entfernt werden.

• gSOAP
Öffnen Sie das Archiv, gehen Sie in das Unterverzeichnis gsoap-2.8\gsoap und entpacken Sie den Inhalt in C:\Programs\gSOAP\ . OpenSSL 1.1.x erfordert gSOAP Version 2.8.41 oder höher. Wenn Sie aus irgendeinem Grund eine ältere Version verwenden möchten, müssen Sie den von Mattias Ellert erstellten Patch anwenden. Das Anwenden eines Patches kann entweder manuell erfolgen (das Format ist einfach: Öffnen Sie die genannten Dateien, löschen Sie die mit Minus gekennzeichneten Zeilen, fügen Sie mit Plus gekennzeichnete Zeilen hinzu; der Rest ist Kontext) oder lassen Sie das patch Tool für Windows portieren und verwenden Sie es.

• MiKTeX
  1. Entpacken Sie das Archiv in C:\Programs\MiKTeX\ .
  2. Öffnen Sie die Konsole und installieren Sie weitere Module:
     "C:\Programs\MiKTeX\texmfs\install\miktex\bin\mpm.exe" --verbose --install=koma-script --install=ucs --install=tabulary --install=url --install=fancybox --install=fancyvrb --install=bera --install=charter --install=mptopdf 

• DocBook
Für die XML-DTD müssen Sie ein Verzeichnis erstellen und den Archivinhalt dort entpacken. Bei XSL-Stylesheets befindet sich der gesamte Inhalt bereits in einem einzigen Verzeichnis. Sie müssen ihn also extrahieren und anschließend umbenennen.

Letzte Berührungen


Die Build-Umgebung ist fast fertig, es sind nur noch wenige Schritte erforderlich. Laden Sie das VirtualBox-Quellcodearchiv herunter (falls Sie es noch nicht getan haben) und entpacken Sie es an den Ort, an dem Sie arbeiten möchten. Zu diesem Zweck habe ich C:\Devel\ , dort die entpackten Quellcodes abgelegt und das Unterverzeichnis in VirtualBox-src .

• Hinzufügen von Zertifikaten

Wenn Sie kein kostenpflichtiges Zertifikat haben, empfehle ich Ihnen, mindestens ein selbstsigniertes persönliches Zertifikat zu erstellen: Es ist einfacher, Windows dazu zu bringen, selbstsignierte Treiber zu laden als nicht signierte. Öffnen Sie dazu die Konsole mit erhöhten Berechtigungen und führen Sie die folgenden Befehle aus, mit denen zwei Zertifikate (SHA-1 und SHA-256) hinzugefügt und in Ihren persönlichen Speicher importiert werden:
 "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x64 /win7 COLOR 07 makecert.exe -a sha1 -r -pe -ss my -n "CN=Roga and Kopyta Ltd" C:\Devel\testcert_1.cer makecert.exe -a sha256 -r -pe -ss my -n "CN=Roga and Kopyta Ltd" C:\Devel\testcert_256.cer certmgr.exe -add C:\Devel\testcert_1.cer -s -r localMachine root certmgr.exe -add C:\Devel\testcert_256.cer -s -r localMachine root 
Sie können natürlich Ihren eigenen Namen für die Zertifikate anstelle von "Roga and Kopyta Ltd" und den Pfad zum Speichern der Dateien wählen. Jetzt müssen wir die Fingerabdrücke der generierten Zertifikate abrufen. Öffnen Sie die Zertifikatsverwaltungskonsole (indem Sie certmgr.msc ) und navigieren Sie zum persönlichen Speicher. Dort sehen Sie die beiden neuen Zertifikate mit dem Namen "Roga and Kopyta Ltd". Doppelklicken Sie auf den ersten. Wechseln Sie im angezeigten Dialogfeld zur Registerkarte Details . Das Feld "Signaturalgorithmus" enthält den Algorithmusnamen: sha256RSA oder sha1RSA. Scrollen Sie nach unten zum Feld "Fingerabdruck", das die Folge von Hexadezimalzahlen enthält. Kopieren Sie diesen vollständigen Wert und schreiben Sie ihn irgendwo auf. Machen Sie dasselbe für das zweite Zertifikat. Vergessen Sie nicht zu markieren, welcher Fingerabdruck für SHA-1 und welcher für SHA-256 war.

• Erstellen von xmllint

Für einen der Build-Schritte ist das Programm xmllint erforderlich. Ich habe es nicht in die Liste der Build-Anforderungen aufgenommen, da seine Quellen im VirtualBox-Archiv gebündelt sind. Sie müssen es jedoch weiterhin selbst erstellen, da die VB-Erstellungsregeln dies nicht tun. Ich habe C:\Programs\xmllint als C:\Programs\xmllint .
  1. Kopieren Sie das Verzeichnis C:\Devel\VirtualBox-src\src\libs\libxml2-2.9.4 nach C:\Programs\ , um sicherzustellen, dass der Build VB in keiner Weise beeinflusst.
  2. Öffnen Sie die Konsole und führen Sie die folgenden Befehle aus:
     "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x64 /win7 COLOR 07 cd /d C:\Programs\libxml2-2.9.4\win32 cscript.exe configure.js cruntime=/MT prefix=C:\Programs\xmllint iconv=no nmake /f Makefile.msvc nmake /f Makefile.msvc install 
  3. Entfernen Sie das Verzeichnis C:\Programs\libxml2-2.9.4 .

• Änderungen von VB-Dateien

Bevor wir mit dem Build beginnen, müssen wir auch einige Änderungen am VB-Quellcode vornehmen. Der vollständige Satz davon wird hier als herunterladbare Patch-Datei dargestellt, die entweder manuell oder mithilfe des patch Tools (das Sie separat herunterladen müssen) angewendet werden kann:

» Vbox_build.patch

Wenn beim Anwenden des Patches keine Probleme aufgetreten sind, können Sie mit dem nächsten Schritt fortfahren . Wenn Sie jedoch Probleme hatten und weitere Informationen zu bestimmten Änderungen benötigen oder einfach nur verstehen möchten, was und warum geändert wird, können Sie die folgenden Details lesen. Bitte beachten Sie, dass die Änderungen hier in einer anderen Reihenfolge als in der Patch-Datei vorgenommen werden. Pfade zu den Dateien werden relativ zum VB-Quellcodeverzeichnis C:\Devel\VirtualBox-src .
  1. Datei configure.vbs :
    • Die Codezeile:
       if Shell(DosSlashes(strPathVC & "/bin/cl.exe"), True) <> 0 then 
      wird ersetzt durch:
       if Shell(DosSlashes(strPathVC & "/bin/cl.exe") & " /?", True) <> 0 then 
      Diese Zeile führt die Compilerprüfung durch, vergisst jedoch, dass cl.exe ohne Argumente einen Fehler zurückgibt und daher als ungültiger Compiler betrachtet wird. Hinzufügen des " /? "Argument bewirkt, dass die Hilfe ausgegeben und mit dem fehlerfreien Code 0 beendet wird.
    • Springen wir nun zur Funktion CheckForMinGW32Sub . Wie der Name schon sagt, wird die Gültigkeit des 32-Bit-MinGW überprüft. Es wurde jedoch für Version 3.3.3 entwickelt, während ich 4.5.4 verwende, das eine andere Datei- / Verzeichnisstruktur aufweist. Daher habe ich die gesamte Funktion durch den folgenden Code ersetzt (der im Grunde nur eine Kopie von CheckForMinGWw64Sub die für die CheckForMinGWw64Sub angepasst wurde) 32-Bit-Variante):
       function CheckForMinGW32Sub(strPathMingW32, strPathW32API) g_strSubOutput = "" if strPathW32API = "" then strPathW32API = strPathMingW32 LogPrint "trying: strPathMingW32=" &strPathMingW32 & " strPathW32API=" & strPathW32API if LogFileExists(strPathMingW32, "bin/gcc.exe") _ And LogFileExists(strPathMingW32, "bin/ld.exe") _ And LogFileExists(strPathMingW32, "bin/objdump.exe") _ And LogFileExists(strPathMingW32, "bin/dllwrap.exe") _ And LogFileExists(strPathMingW32, "bin/dlltool.exe") _ And LogFileExists(strPathMingW32, "bin/as.exe") _ And LogFileExists(strPathMingW32, "include/bfd.h") _ And LogFileExists(strPathMingW32, "lib32/libgcc_s.a") _ And LogFileExists(strPathMingW32, "i686-w64-mingw32/lib/dllcrt1.o") _ And LogFileExists(strPathMingW32, "i686-w64-mingw32/lib/dllcrt2.o") _ And LogFileExists(strPathMingW32, "i686-w64-mingw32/lib/libmsvcrt.a") _ And LogFileExists(strPathMingW32, "i686-w64-mingw32/lib/libmsvcr100.a") _ And LogFileExists(strPathMingW32, "i686-w64-mingw32/include/_mingw.h") _ And LogFileExists(strPathMingW32, "i686-w64-mingw32/include/stdint.h") _ And LogFileExists(strPathMingW32, "i686-w64-mingw32/include/windows.h") _ then if Shell(DosSlashes(strPathMingW32 & "/bin/gcc.exe") & " -dumpversion", True) = 0 then dim offVer, iMajor, iMinor, iPatch, strVer ' extract the version. strVer = Trim(Replace(Replace(g_strShellOutput, vbCr, ""), vbLf, "")) if (Mid(strVer, 2, 1) = ".") _ And (Mid(strVer, 4, 1) = ".") then iMajor = Int(Left(strVer, 1)) ' Is Int() the right thing here? I want atoi()!!! iMinor = Int(Mid(strVer, 3, 1)) iPatch = Int(Mid(strVer, 5)) else LogPrint "Malformed version: '" & strVer & "'" strVer = "" end if if strVer <> "" then if (iMajor = 4) And (iMinor >= 4) then CheckForMinGW32Sub = True g_strSubOutput = strVer else LogPrint "MinGW32 version '" & iMajor & "." & iMinor & "." & iPatch & "' is not supported (or configure.vbs failed to parse it correctly)." end if else LogPrint "Couldn't locate the GCC version in the output!" end if else LogPrint "Failed to run gcc.exe!" end if end if end function 
    • Unsere nächste Funktion ist CheckForCurlSub zu bearbeitende Codeblock lautet:
        if LogFileExists(strPathCurl, "include/curl/curl.h") _ And LogFindFile(strPathCurl, "libcurl.dll") <> "" _ And LogFindFile(strPathCurl, "libcurl.lib") <> "" _ 
      Es überprüft die Gültigkeit von libcurl, erfordert jedoch eine dynamisch verknüpfte Version und schlägt fehl, wenn keine DLL-Datei gefunden werden kann. Wir verwenden eine statisch verknüpfte Version, daher muss der Check für die DLL leider gehen und uns Folgendes hinterlassen:
        if LogFileExists(strPathCurl, "include/curl/curl.h") _ And LogFindFile(strPathCurl, "libcurl.lib") <> "" _ 
    • Gehen Sie nun in die Funktion CheckForPython in der die Variable VBOX_BLD_PYTHON generiert wird:
        CfgPrint "VBOX_BLD_PYTHON := " & strPathPython & "\python.exe" 
      Der Backslash vor python.exe sollte durch den Forward ersetzt werden: "/python.exe" (ohne dieses "/python.exe" einige Überprüfungen während des Erstellungsvorgangs fehl; ich habe keine anderen negativen Auswirkungen bemerkt, aber es ist hübscher ohne Fehlermeldungen und auf jeden Fall besser sicher als leid).
    • Die Windows-Version des Konfigurationsskripts unterstützt libvpx und libopus nicht, daher habe ich sie selbst hinzugefügt. Der einfachste Weg bestand natürlich darin, die Pfade zu den Bibliotheken fest zu codieren, aber ich zog es vor, sie wie alle anderen Komponenten zu implementieren, indem der Pfad in der Befehlszeile übergeben und die Gültigkeit überprüft wurde. Der Hauptcode hierfür besteht aus den beiden Prüffunktionen:
       '' ' Checks for libvpx sub CheckForVpx(strOptVpx) dim strPathVpx, str strVpx = "libvpx" PrintHdr strVpx if strOptVpx = "" then MsgError "Invalid path specified!" exit sub end if if g_strTargetArch = "amd64" then strVsBuildArch = "x64" else strVsBuildArch = "Win32" end if strLibPathVpx = "lib/" & strVsBuildArch & "/vpxmd.lib" strPathVpx = "" if LogFileExists(strOptVpx, "include/vpx/vpx_encoder.h") _ And LogFileExists(strOptVpx, strLibPathVpx) _ then strPathVpx = UnixSlashes(PathAbs(strOptVpx)) CfgPrint "SDK_VBOX_VPX_INCS := " & strPathVpx & "/include" CfgPrint "SDK_VBOX_VPX_LIBS := " & strPathVpx & "/" & strLibPathVpx else MsgError "Can't locate " & strVpx & ". " _ & "Please consult the configure.log and the build requirements." exit sub end if PrintResult strVpx, strPathVpx end sub '' ' Checks for libopus sub CheckForOpus(strOptOpus) dim strPathOpus, str strOpus = "libopus" PrintHdr strOpus if strOptOpus = "" then MsgError "Invalid path specified!" exit sub end if if g_strTargetArch = "amd64" then strVsBuildArch = "x64" else strVsBuildArch = "Win32" end if strLibPathOpus = "lib/" & strVsBuildArch & "/opus.lib" strPathOpus = "" if LogFileExists(strOptOpus, "include/opus.h") _ And LogFileExists(strOptOpus, strLibPathOpus) _ then strPathOpus = UnixSlashes(PathAbs(strOptOpus)) CfgPrint "SDK_VBOX_OPUS_INCS := " & strPathOpus & "/include" CfgPrint "SDK_VBOX_OPUS_LIBS := " & strPathOpus & "/" & strLibPathOpus else MsgError "Can't locate " & strOpus & ". " _ & "Please consult the configure.log and the build requirements." exit sub end if PrintResult strOpus, strPathOpus end sub 
      Die Funktionsverwendung wird zum Drucken der Liste der Befehlszeilenargumente verwendet. Fügen Sie dort unsere beiden neuen Argumente hinzu:
        Print " --with-libvpx=PATH " Print " --with-libopus=PATH " 
      Zu Beginn der Funktion Main viele Variablen zum Speichern von Pfaden zu den Komponenten definiert. Dort müssen zwei neue hinzugefügt werden:
        strOptVpx = "" strOptOpus = "" 
      Etwas weiter unten befindet sich der select-case Block, der die Argumente verarbeitet und die Variablen ausfüllt. Hinzufügen unseres Beitrags:
        case "--with-libvpx" strOptVpx = strPath case "--with-libopus" strOptOpus = strPath 
      Und schließlich befindet sich fast ganz am Ende der Datei die Kette all dieser Überprüfungsfunktionsaufrufe. Hier fügen wir den Aufruf unserer beiden neuen Funktionen hinzu:
        CheckForVpx strOptVpx CheckForOpus strOptOpus 
  2. Die nächste Datei ist src\VBox\Runtime\Makefile.kmk . Wir müssen die Definitionen der Variablen VBoxRT_LIBS.win und VBoxRT-x86_LIBS.win finden und ihnen zwei neue Bibliotheken hinzufügen, crypt32.lib und bcrypt.lib . Also der folgende Code:
     VBoxRT_LIBS.win = \ $(PATH_SDK_$(VBOX_WINDDK)_LIB)/vccomsup.lib \ $(PATH_SDK_$(VBOX_WINDDK)_LIB)/wbemuuid.lib \ $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/delayimp.lib 
    verwandelt sich in:
     VBoxRT_LIBS.win = \ $(PATH_SDK_$(VBOX_WINDDK)_LIB)/vccomsup.lib \ $(PATH_SDK_$(VBOX_WINDDK)_LIB)/wbemuuid.lib \ $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/delayimp.lib \ $(PATH_SDK_$(VBOX_WINPSDK)_LIB)/crypt32.lib \ $(PATH_SDK_$(VBOX_WINPSDK)_LIB)/bcrypt.lib 
    (Verpassen Sie nicht den delayimp.lib Backslash nach delayimp.lib !); bzw. dieser Block:
     VBoxRT-x86_LIBS.win = \ $(PATH_SDK_$(VBOX_WINDDK)_LIB.x86)/vccomsup.lib \ $(PATH_SDK_$(VBOX_WINDDK)_LIB.x86)/wbemuuid.lib \ $(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_LIB)/delayimp.lib 
    wird:
     VBoxRT-x86_LIBS.win = \ $(PATH_SDK_$(VBOX_WINDDK)_LIB.x86)/vccomsup.lib \ $(PATH_SDK_$(VBOX_WINDDK)_LIB.x86)/wbemuuid.lib \ $(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_LIB)/delayimp.lib \ $(PATH_SDK_$(VBOX_WINPSDK)_LIB.x86)/crypt32.lib \ $(PATH_SDK_$(VBOX_WINPSDK)_LIB.x86)/bcrypt.lib 
    Diese Änderung ist für eine erfolgreiche Verknüpfung von VBoxRT.dll . Ich bin mir nicht 100% sicher, warum das so ist. Die Oracle-Version hat nicht die Ladezeitabhängigkeit von crypt32.dll , sie wird zur Laufzeit geladen, daher sollte die LIB-Datei nicht erforderlich sein. Ohne sie kann der Linker jedoch einige Funktionen nicht finden und schlägt fehl. Ich vermute, dass dies mit den OpenSSL-Build-Optionen zusammenhängt, habe dies jedoch nicht überprüft. Das Hinzufügen der Abhängigkeit ist einfacher. Die zweite Abhängigkeit, bcrypt.dll , ist eine Voraussetzung für das neue OpenSSL 1.1.1.
  3. Wenn Sie über gSOAP der Version 2.8.79 oder höher verfügen, müssen Sie die Datei src\VBox\Runtime\r3\win\VBoxRT-openssl-1.1plus.def und der src\VBox\Runtime\r3\win\VBoxRT-openssl-1.1plus.def die folgenden Zeilen hinzufügen:
      OpenSSL_version_num DH_generate_parameters_ex DH_new ASN1_STRING_get0_data 
    Diese Liste definiert, welche Funktionen von der Bibliothek VBoxRT.dll (die OpenSSL enthält) exportiert werden. Wenn das Tool VBoxWebSrv.exe verknüpft wird, sind je nach gSOAP-Version möglicherweise zusätzliche OpenSSL-Funktionen erforderlich. Da sie in der Exportliste fehlen, fügt der Linker OpenSSL selbst hinzu und beschwert sich sofort über VBoxRT Konflikte zwischen dieser externen OpenSSL und ihrer eigenen Kopie, die bereits in VBoxRT . Das Hinzufügen der oben genannten Exporte behebt das Problem.
  4. Wie eingangs erwähnt, erstelle ich keine Gastzugaben, aber ich muss das ISO-Image als Teil der Distribution haben. Die Erstellungsregeln sind für dieses Szenario konzipiert, sie erwarten jedoch, dass das fertige ISO-Image zur richtigen Zeit auf magische Weise am richtigen Ort angezeigt wird. Ich habe diese Magie in die Datei src\VBox\Makefile.kmk . Suchen Sie nach folgendem Code:
      ifdef VBOX_WITH_ADDITIONS include $(PATH_SUB_CURRENT)/Additions/Makefile.kmk endif 
    und direkt darunter gilt die Regel für den automatischen Download der Bilddatei:
      ifndef VBOX_WITHOUT_ADDITIONS_ISO $(VBOX_PATH_ADDITIONS_ISO)/VBoxGuestAdditions.iso: $(QUIET)$(MKDIR) -p $(@D) $(VBOX_RETRY) $(TOOL_CURL_FETCH) http://download.virtualbox.org/virtualbox/$(VBOX_VERSION_STRING_RAW)/VBoxGuestAdditions_$(VBOX_VERSION_STRING_RAW).iso -o $@ endif 
    Wenn Sie die Dateien manuell bearbeiten, anstatt den Patch anzuwenden, beachten Sie bitte, dass die Regelbefehle mit dem Tabellierungszeichen beginnen müssen.
  5. Vor der Version 6.0 war die Dokumentation eines der Subsysteme, die ohne Änderungen erfolgreich erstellt wurden. Ich weiß nicht, was daran falsch war, aber es wurde erheblich überarbeitet, so dass es auf meinem Build-System nicht mehr funktioniert. Ich habe keine Ahnung, wie Oracle die Dokumentation selbst erstellt (möglicherweise auf einem * NIX-System), aber für mich haben die Erstellungsregeln immer wieder Schrägstriche in den Pfaden verloren oder einen Überschuss hinzugefügt, sodass die Zieldateien nicht gefunden wurden wegen Nichtübereinstimmungen in Katalogdateien. Ich habe es endlich geschafft, einige Änderungen zu kombinieren, die es ermöglichten, die Dokumentation fehlerfrei zu erstellen. Zunächst fehlte eines der Zielverzeichnisse, sodass einige der Zwischendateien nicht erstellt werden konnten. Dieses Problem wurde in der Datei doc\manual\Makefile.kmk im folgenden Codeblock behoben:
     define def_vbox_refentry_to_user_sect1 $$(VBOX_PATH_MANUAL_OUTBASE)/$(1)/user_$(2): $(3) \ $$(VBOX_PATH_MANUAL_SRC)/docbook-refentry-to-manual-sect1.xsl \ $$(VBOX_XML_CATALOG) $$(VBOX_XML_CATALOG_DOCBOOK) $$(VBOX_XML_CATALOG_MANUAL) \ $$(VBOX_VERSION_STAMP) | $$(dir $$@) $$(call MSG_TOOL,xsltproc $$(notdir $$(filter %.xsl,$$^)),,$$(filter %.xml,$$^),$$@) $$(QUIET)$$(RM) -f "$$@" $$(QUIET)$$(call VBOX_XSLTPROC_WITH_CAT) --output $$@ $$(VBOX_PATH_MANUAL_SRC)/docbook-refentry-to-manual-sect1.xsl $$< endef 
    Kurz nach dem $$(RM) habe ich einen Befehl zum Erstellen des fehlenden Verzeichnisses hinzugefügt:
      $$(QUIET)$$(MKDIR) -p "$$(@D)" 

    Die Korrekturen für die Schrägstriche befinden sich in der Datei doc\manual\Config.kmk . Ich konnte keine „normale“ Lösung dafür finden, aber es gibt eine Problemumgehung, die für praktische Zwecke gut genug ist und die das Duplizieren der Pfadsubstitutionsregeln für die falschen Pfade impliziert. Erstens unter der Linie:
      VBOX_FILE_URL_MAYBE_SLASH = $(if $(eq $(KBUILD_HOST),win),/,) 
    I've created two new variables which basically contain the same paths as their origins, but with triple slash after the disk letter instead of a single slash:
      VBOX_PATH_MANUAL_SRC_SLASHED = $(subst :/,:///,$(VBOX_PATH_MANUAL_SRC)) VBOX_PATH_MANUAL_OUTBASE_SLASHED = $(subst :/,:///,$(VBOX_PATH_MANUAL_OUTBASE)) 
    A little bit below that, there is a rule for creating the catalog file:
      $(VBOX_XML_CATALOG): $(MAKEFILE_CURRENT) | $$(dir $$@) $(call MSG_L1,Creating catalog $@) $(QUIET)$(APPEND) -tn "$@" \ '<?xml version="1.0"?>' \ '<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">' \ '<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">' \ ' <delegatePublic publicIdStartString="-//OASIS/ENTITIES DocBook XML" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \ ' <delegatePublic publicIdStartString="-//OASIS/DTD DocBook XML" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \ ' <delegateSystem systemIdStartString="http://www.oasis-open.org/docbook/" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \ ' <delegateURI uriStartString="http://www.oasis-open.org/docbook/" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \ ' <delegateSystem systemIdStartString="$(VBOX_PATH_MANUAL_SRC)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ ' <delegateURI uriStartString="$(VBOX_PATH_MANUAL_SRC)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ ' <delegateURI uriStartString="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_PATH_MANUAL_SRC)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ ' <delegateURI uriStartString="$(VBOX_PATH_MANUAL_OUTBASE)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ '</catalog>' 
    For each line which contains the variable VBOX_PATH_MANUAL_SRC or VBOX_PATH_MANUAL_OUTBASE (except for the line with the file:// prefix), I've appended the copy of the whole line, but with the variable replaced with its triple-slash counterpart. The result looks like this:
      $(VBOX_XML_CATALOG): $(MAKEFILE_CURRENT) | $$(dir $$@) $(call MSG_L1,Creating catalog $@) $(QUIET)$(APPEND) -tn "$@" \ '<?xml version="1.0"?>' \ '<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">' \ '<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">' \ ' <delegatePublic publicIdStartString="-//OASIS/ENTITIES DocBook XML" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \ ' <delegatePublic publicIdStartString="-//OASIS/DTD DocBook XML" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \ ' <delegateSystem systemIdStartString="http://www.oasis-open.org/docbook/" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \ ' <delegateURI uriStartString="http://www.oasis-open.org/docbook/" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \ ' <delegateSystem systemIdStartString="$(VBOX_PATH_MANUAL_SRC)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ ' <delegateSystem systemIdStartString="$(VBOX_PATH_MANUAL_SRC_SLASHED)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ ' <delegateURI uriStartString="$(VBOX_PATH_MANUAL_SRC)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ ' <delegateURI uriStartString="$(VBOX_PATH_MANUAL_SRC_SLASHED)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ ' <delegateURI uriStartString="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_PATH_MANUAL_SRC)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ ' <delegateURI uriStartString="$(VBOX_PATH_MANUAL_OUTBASE)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ ' <delegateURI uriStartString="$(VBOX_PATH_MANUAL_OUTBASE_SLASHED)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \ '</catalog>' 
    Even further down, there is another rule for creating an auxiliary catalog file; the starting line is:
      $(VBOX_XML_CATALOG_MANUAL): $(MAKEFILE_CURRENT) | $$(dir $$@) 
    Here I'm doing the same operation as above. In addition, in the beginning of the generated file there are several lines defining the entries in the common/ subdirectory:
      ' <system systemId="$(VBOX_PATH_MANUAL_SRC)/common/oracle-accessibility-en.xml" uri="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_PATH_MANUAL_SRC)/en_US/oracle-accessibility-en.xml"/>' \ ' <system systemId="$(VBOX_PATH_MANUAL_SRC)/common/oracle-support-en.xml" uri="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_PATH_MANUAL_SRC)/en_US/oracle-support-en.xml"/>' \ 
    With these we have the opposite problem: triple slash after the file is replaced with a single slash. I worked this around by getting rid of the file protocol altogether and replacing those URIs with direct file system paths in the target address (the uri attribute). The result for these lines looks like this (including the aforementioned fix):
      ' <system systemId="$(VBOX_PATH_MANUAL_SRC)/common/oracle-accessibility-en.xml" uri="$(VBOX_PATH_MANUAL_SRC)/en_US/oracle-accessibility-en.xml"/>' \ ' <system systemId="$(VBOX_PATH_MANUAL_SRC_SLASHED)/common/oracle-accessibility-en.xml" uri="$(VBOX_PATH_MANUAL_SRC)/en_US/oracle-accessibility-en.xml"/>' \ ' <system systemId="$(VBOX_PATH_MANUAL_SRC)/common/oracle-support-en.xml" uri="$(VBOX_PATH_MANUAL_SRC)/en_US/oracle-support-en.xml"/>' \ ' <system systemId="$(VBOX_PATH_MANUAL_SRC_SLASHED)/common/oracle-support-en.xml" uri="$(VBOX_PATH_MANUAL_SRC)/en_US/oracle-support-en.xml"/>' \ 
  6. When VB is built with signing, most of its binaries receive the integrity check flag (the linker option /IntegrityCheck ) which forces Windows to check digital signatures and forbids launching applications which are signed incorrectly. If you have a valid paid certificate that's not a problem; however with a self-signed certificate VB will refuse to start, even if Windows is booted in the test mode. I've modified the file Config.kmk in such a way that this flag is only added when you have a full-grown certificate (the criterion of that is presence of a cross-certificate in LocalConfig.kmk ; see below ). The changes look like this:
    • A new variable VBOX_INTEGRITY_CHECK is added, which contains the desired value of the option:
       if defined(VBOX_SIGNING_MODE) && defined(VBOX_CROSS_CERTIFICATE_FILE) VBOX_INTEGRITY_CHECK := /IntegrityCheck else VBOX_INTEGRITY_CHECK := /IntegrityCheck:NO endif 
    • Below that there is the editbin call:
        $(VBOX_VCC_EDITBIN) /LargeAddressAware /DynamicBase /NxCompat /Release /IntegrityCheck \ /Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \ "$@" 
      Here I've replaced the unconditional /IntegrityCheck with the new variable $(VBOX_INTEGRITY_CHECK) .
    • Next, look for the blocks of the following kinds:
       ifdef VBOX_SIGNING_MODE TEMPLATE_XXXXXX_LDFLAGS += -IntegrityCheck endif 
      oder
       if defined(VBOX_SIGNING_MODE) && defined(VBOX_WITH_HARDENING) TEMPLATE_XXXXXX_LDFLAGS += -IntegrityCheck endif 
      where « XXXXXX » stands for various component names. There are 6 such blocks in total, 3 of each kind. Here I've modified the condition by adding a check for cross-certificate. The first line then turns into, respectively:
       if defined(VBOX_SIGNING_MODE) && defined(VBOX_CROSS_CERTIFICATE_FILE) 
      oder
       if defined(VBOX_SIGNING_MODE) && defined(VBOX_CROSS_CERTIFICATE_FILE) && defined(VBOX_WITH_HARDENING) 
  7. Two more files modified by me do not take immediate part in building of VB: src\VBox\Installer\win\Scripts\PackDriversForSubmission.cmd and UnpackBlessedDrivers.cmd . These auxiliary scripts can be used if you intend to send the drivers into Microsoft for Windows 10 signing. The first script prepares a CAB archive for sending; the second one unpacks the resultant ZIP archive with the signed drivers and verifies the signatures. In the packing script all I did was just fixing several typos. In the unpacking script I added ability to specify path to the signtool program, and got rid of the unzip tool by replacing it with a small Perl script. The signing procedure is described below. If you don't plan to get the Microsoft signature you can simply ignore all these changes in the scripts.

• VB build configuration file

Jetzt müssen wir die Datei LocalConfig.kmkim VB-Quellverzeichnis erstellen und dort alle Pfade und Erstellungsparameter schreiben. Sie können den folgenden Text als Vorlage verwenden:
 VBOX_WITH_HARDENING := VBOX_PATH_WIX := C:\Programs\WiX VBOX_GSOAP_INSTALLED := 1 VBOX_PATH_GSOAP := C:\Programs\gSOAP VBOX_WITH_COMBINED_PACKAGE := 1 VBOX_WITH_QT_PAYLOAD := 1 VBOX_WITH_QTGUI_V5 := 1 VBOX_SIGNING_MODE := release VBOX_CERTIFICATE_SUBJECT_NAME := Roga and Kopyta Ltd VBOX_CERTIFICATE_FINGERPRINT := XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX VBOX_CERTIFICATE_SHA2_SUBJECT_NAME := Roga and Kopyta Ltd VBOX_CERTIFICATE_SHA2_FINGERPRINT := XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX VBOX_TSA_URL := http://timestamp.digicert.com VBOX_TSA_SHA2_URL := http://timestamp.digicert.com VBOX_TSA_URL_ARGS := /t "$(VBOX_TSA_URL)" VBOX_TSA_SHA2_URL_ARGS := /tr "$(VBOX_TSA_SHA2_URL)" /td sha256 VBOX_CROSS_CERTIFICATE_FILE := VBOX_CROSS_CERTIFICATE_FILE_ARGS := VBOX_CROSS_CERTIFICATE_SHA2_FILE := VBOX_CROSS_CERTIFICATE_SHA2_FILE_ARGS := VBOX_PATH_SIGN_TOOLS := C:\Programs\DevKits\8.1\bin\x64 VBOX_PATH_SELFSIGN := C:\WinDDK\7600.16385.1\bin\selfsign VBOX_PATH_WISUMINFO := "C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\sysmgmt\msi\scripts\WiSumInf.vbs" VBOX_PATH_WISUBSTG := "C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\sysmgmt\msi\scripts\WiSubStg.vbs" VBOX_WITH_DOCS := 1 VBOX_WITH_DOCS_CHM := 1 VBOX_WITH_DOCS_PACKING := 1 VBOX_WITH_ADDITIONS := VBOX_WITH_ADDITIONS_PACKING := 1 VBOX_HAVE_XMLLINT := 1 VBOX_XMLLINT := C:\Programs\xmllint\bin\xmllint.exe VBOX_PATH_DOCBOOK := C:/Programs/DocBook/xsl VBOX_PATH_DOCBOOK_DTD := C:/Programs/DocBook/xml VBOX_PATH_HTML_HELP_WORKSHOP := "C:\Program Files (x86)\HTML Help Workshop" VBOX_PDFLATEX := C:\Programs\MiKTeX\texmfs\install\miktex\bin\pdflatex.exe VBOX_PDFLATEX_CMD := $(VBOX_PDFLATEX) -halt-on-error -interaction batchmode TOOL_CURL_FETCH := C:\Programs\curl\x64\curl.exe PATH_TOOL_NASM := C:/Programs/nasm VBOX_INSTALLER_LANGUAGES := en_US VBOX_WITH_TESTCASES := VBOX_WITH_VALIDATIONKIT := VBOX_WITH_VBOX_IMG := 1 VBOX_WITH_RECORDING := 1 VBOX_WITH_AUDIO_RECORDING := 1 SDK_VBOX_VPX := 1 VBOX_WITH_LIBVPX := 1 SDK_VBOX_OPUS := 1 VBOX_WITH_LIBOPUS := 1 VBOX_BUILD_PUBLISHER := _OSE 
Sie müssen diese Vorlage bearbeiten:
  • Die Variablen VBOX_CERTIFICATE_SUBJECT_NAMEund VBOX_CERTIFICATE_SHA2_SUBJECT_NAMEsollten die Namen der SHA-1- bzw. SHA-256-Zertifikate enthalten.
  • Die Variablen VBOX_CERTIFICATE_FINGERPRINTund VBOX_CERTIFICATE_SHA2_FINGERPRINTsollten die Fingerabdrücke dieser Zertifikate enthalten. Sie haben sie zuvor von der Zertifikatsverwaltungskonsole kopiert.
  • If you have a paid certificate you should delete the lines defining the variables VBOX_CROSS_CERTIFICATE_FILE_ARGS and VBOX_CROSS_CERTIFICATE_SHA2_FILE_ARGS , then in the variables VBOX_CROSS_CERTIFICATE_FILE and VBOX_CROSS_CERTIFICATE_SHA2_FILE (without « _ARGS ») put the full path to the cross-certificate (without it the drivers will not be accepted). You can download it from the web site of the company that issued the certificate, or from Microsoft .
  • You can fine-tune the signing process using various additional variables and macros to redefine the certificate storage, timestamp server, or even construct a full command line for the signtool program. You can take a look into the file Config.kmk below the comment «Code Signing», there you'll find which variables are defined and how they are used.
  • If you've installed some of the programs into paths different from mine, you need to fix those paths in the template. It's strongly recommended to keep the path style for each variable (forward/backward slashes), sometimes it's critical for successful build.
  • Fox WiX you need to specify the path to its binaries. With the portable version, it is just the directory where you unpacked it; if you used the installer, the binaries will be located in the subdirectory bin . Please, note, that the path must not contain spaces! If it does you have to convert it into the 8.3 format (you can use dir /x for that). Unfortunately, enclosing the path in quotes does not work with this variable.
  • Die Variable VBOX_BUILD_PUBLISHERgibt das Branding-Suffix in der Versionsnummer an. Standardmäßig ist es "_OSE" (dh die vollständige Produktversion ist "6.0.4_OSE"). Sie können hier ein beliebiges anderes Suffix angeben oder es auf leer setzen, um es vollständig zu entfernen. Wenn Sie die Variable jedoch vollständig löschen, wird die Standardeinstellung "_OSE" verwendet.
Die restlichen Variablen werden meistens verwendet, um zu deklarieren, welche Komponenten erstellt werden sollen. Und natürlich steht die Hauptdeklaration ganz oben: Schalten Sie die Aushärtung aus.

Virtualbox erstellen


Schließlich können wir jetzt mit dem Erstellen von VirtualBox selbst beginnen. Wenn Sie normalerweise lieber parallel für verschiedene Plattformen erstellen möchten, müssen Sie zunächst darauf verzichten oder zwei separate Quellbaumkopien verwenden, da VB über eine gemeinsame Konfigurationsdatei verfügt, die vor dem Erstellen generiert wird und plattformabhängige Daten enthält. Es wäre für den Compiler nicht schön, ihn mitten im Erstellungsprozess plötzlich aus der 64-Bit-Build-Umgebung in die 32-Bit-Build-Umgebung zu werfen.
Wenn Sie Windows 10-kompatible Treibersignaturen benötigen, lesen Sie bitte die Informationen nach der Beschreibung des Hauptverfahrens.
  1. Beginnen wir mit der 64-Bit-Version. Öffnen Sie die Konsole und führen Sie die folgenden Befehle aus:
     cd /d C:\Devel\VirtualBox-src "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x64 /win7 COLOR 07 set BUILD_TARGET_ARCH=amd64 cscript configure.vbs --with-DDK=C:\WinDDK\7600.16385.1 --with-MinGW-w64=C:\Programs\mingw64 --with-MinGW32=C:\Programs\mingw32 --with-libSDL=C:\Programs\SDL\x64 --with-openssl=C:\Programs\OpenSSL\x64 --with-openssl32=C:\Programs\OpenSSL\x32 --with-libcurl=C:\Programs\curl\x64 --with-libcurl32=C:\Programs\curl\x32 --with-Qt5=C:\Programs\Qt\5.6.3-x64 --with-libvpx=C:\Programs\libvpx --with-libopus=C:\Programs\libopus --with-python=C:/Programs/Python env.bat kmk kmk C:/Devel/VirtualBox-src/out/win.x86/release/obj/Installer/VirtualBox-6.0.4_OSE-r128164-MultiArch_amd64.msi 
    The configure.vbs script verifies the environment and generates configuration files ( AutoConfig.kmk and env.bat ). The first kmk command builds the binaries and collect them into out\win.amd64\bin\ . And the last command packs them all into the intermediate MSI package. Important notes:
    • You must use forward slashes in the last command. With backslashes, kmk would fail to find the build rules.
    • Even though we are building the 64-bit version, the target package is located in out\win.x86\… , because the final stage of the build will be performed from the 32-bit build environment.
    • If you've changed the branding suffix you need to change the name of the target package by replacing the «_OSE» with what you specified in the variable VBOX_BUILD_PUBLISHER .
    • The revision number in the MSI package name (128164) can be found in the file Config.kmk inside the VBOX_SVN_REV_FALLBACK variable definition. Please, note, that this value may be different from revisions of the official distribution (for instance, the version 6.0.4 has release number 128413). Unfortunately, I have no idea why.
  2. Now we need to build the 32-bit version and pack everything together. For that, open a new console window, and run the following commands:
     cd /d C:\Devel\VirtualBox-src "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x86 /win7 COLOR 07 set BUILD_TARGET_ARCH=x86 cscript configure.vbs --with-DDK=C:\WinDDK\7600.16385.1 --with-MinGW-w64=C:\Programs\mingw64 --with-MinGW32=C:\Programs\mingw32 --with-libSDL=C:\Programs\SDL\x32 --with-openssl=C:\Programs\OpenSSL\x32 --with-libcurl=C:\Programs\curl\x32 --with-Qt5=C:\Programs\Qt\5.6.3-x32 --with-libvpx=C:\Programs\libvpx --with-libopus=C:\Programs\libopus --with-python=C:/Programs/Python env.bat kmk kmk C:/Devel/VirtualBox-src/out/win.x86/release/bin/VirtualBox-6.0.4_OSE-r128164-MultiArch.exe 
    Same as with the 64-bit, you need to replace the «_OSE» suffix with what you have.
    Notice how in the last command we are building an EXE , and not an MSI . This is the final installer which will cause the 32-bit package to be built automatically, from dependencies.
  3. Even if you have a paid certificate you will find that you cannot install this distribution into Windows 10 booted with Secure Boot enabled. This OS has stricter requirements, and the drivers must be signed by none other than Microsoft themselves. The procedure is explained in details on various Internet resources and is unrelated to this article, so I'm not going to go deep into this topic. Instead I'll outline the main steps you need to take for integrating this task with the VB build procedure.
    • The main requirement here is that you must have not just a normal code signing certificate, but an EV one (Extended Validation). Also you need to register an account at Hardware Dev Center and add your certificate there.
    • Now, during building the 64-bit version of VB, just after you've got all binary components (that is, after the first kmk run which was without arguments), you need to create a CAB archive with the drivers. There is a batch script template for that; the build system modifies it according to the current task and puts it into out\win.amd64\release\repack\ . Go into this path and run the following command:
       PackDriversForSubmission.cmd -x 
      When the script finishes, the file VBoxDrivers-6.0.4r128164-amd64.cab will appear in the same directory.
    • You need to sign this CAB archive with your EV certificate. Then go to the Microsoft Hardware Dev Center, create a new submission, upload your signed archive, select the desired target OS version (make sure it's 64-bit) and send the submission.
    • It will take several minutes to process, after which you will have a ZIP archive where all the drivers have been signed by Microsoft in addition to your signature, and all the CAT files generated anew. Download this archive and place it somewhere so that the build system had access to it.
    • Unpack the archive and put all the files from the subdirectories directly into out\win.amd64\release\bin\ overwriting the existing files. You can do it either manually or using another script from the same path out\win.amd64\release\repack\ by running the following commands:
       set _MY_SIGNTOOL=C:\Programs\DevKits\8.1\bin\x64\signtool.exe UnpackBlessedDrivers.cmd -n -i path\to\signed.zip 
      Of course, you need to put here the correct paths to signtool.exe and the ZIP archive.
    • Now you can run the second kmk command which packs all the components into an MSI installer. If you were doing all this in the same console window, don't forget to switch back to the base directory of the VB project.
    • Finally, proceed with building of the 32-bit version of VB, and perform all the same additional steps: after the first kmk switch to out\win.x86\release\repack\ , create the CAB archive, sign it, send to Microsoft (now choosing the 32-bit OS version), replace the drivers with their counter-signed versions, and run the final kmk for building the complete VB distribution.

Wenn keiner von uns etwas durcheinander gebracht hat, sollte Ihnen diese lange Kette ein glänzendes neues VirtualBox-Installationsprogramm bringen, das sich vom Oracle-Installationsprogramm nur durch das Symbol, das Info-Bild und natürlich den tiefgreifenden Mangel an Härtung unterscheidet. Es ist nicht schwer, auch das Symbol und das Bild zu ersetzen, aber ich werde hier nicht auf dieses Thema eingehen.

Der Einfachheit halber habe ich eine einzelne Batch-Datei erstellt, die den vollständigen Build von VB automatisiert. Sie können es verwenden, wenn Sie das gesamte Installationsprogramm regelmäßig erstellen müssen.

Nur noch ein paar Worte zur Installation der resultierenden Distribution, wenn Sie ein selbstsigniertes Zertifikat verwenden. Wie plötzlich festgestellt wurde, reicht es in Windows 8/10 nicht aus, in den Testmodus zu booten. Die Installation schlägt immer noch fehl und behauptet, die Treibersignaturen seien ungültig. Sie können dieses Problem umgehen, indem Sie die Zertifikate zu Ihrem CA-Stammspeicher hinzufügen:
  1. Öffnen Sie das Dialogfeld "Eigenschaften" des VB-Installationsprogramms, indem Sie mit der rechten Maustaste darauf klicken und " Eigenschaften" auswählen. Wechseln Sie dann zur Registerkarte " Digitale Signaturen" . Dort finden Sie zwei Unterschriften mit dem Namen "Roga and Kopyta Ltd", eine ist sha1, die andere ist sha256. Wählen Sie die erste aus und klicken Sie auf Details .
  2. Ein weiteres Dialogfeld wird angezeigt, in dem Sie auf die Schaltfläche Zertifikat anzeigen klicken müssen .
  3. One more dialog, click Install Certificate .
  4. In the Import wizard, select the location «Local Machine», click Next . After UAC confirmation (if needed), there's the certificate store selection. Select «Place all certificates in the following store», then click Browse and choose the store named «Trusted Root Certification Authorities». Then Next , Finish . You're done, the certificate is installed.
  5. Close all the dialogs but the very first one, select the second signature (sha256) and repeat the steps 2 to 4 for it too.
  6. Close all the dialogs, run the installer. Now it should work fine.

Epilogue


Als ich mit dem Schreiben des Artikels fertig war, war ich selbst von seinem Umfang überrascht. Zuerst wollte ich viele Details zu den Gründen für die Wahl dieser oder jener Art der Lösung jedes Problems erläutern, genau erklären, was das Problem ist und welche alternativen Lösungen anwendbar sein könnten. Aber sehr bald wurde klar, dass der Text, wenn er mit all diesen Einzelheiten beladen wäre, ungeheuer groß sein würde. Ich muss mich also für die Rezepte entschuldigen, die so aussehen: "Tu das einfach und stell keine Fragen." Ich habe eine starke Abneigung gegen diese selbst, aber ich konnte einfach keinen anderen Weg finden. Gelegentlich versuchte ich immer noch zu skizzieren, was los war, um den Eindruck zu mildern.

Viele Details über das VB-Build-System mussten hinter den Kulissen bleiben. denn ich habe mich beide gezögert, den Text aufzublähen, und war manchmal zu faul, um nach einem anderen, effizienteren Ansatz zur Lösung eines Problems zu suchen. Schließlich war mein Hauptziel zunächst, mir einen funktionierenden Build der aktuellen VirtualBox-Version zu verschaffen. 4.3.12 war zu diesem Zeitpunkt bereits weit veraltet, aber ich konnte nicht riskieren, eines meiner am aktivsten verwendeten Tools auf die gehärtete Version zu aktualisieren, die möglicherweise einfach jeden Moment nicht mehr funktioniert. Obwohl ich von Zeit zu Zeit zurückkomme und etwas Neues gefunden habe, füge es diesem Artikel hinzu.

Ich hoffe, dass dieser Artikel sein Publikum findet. Wenn Sie daran interessiert sind, das Endergebnis zu sehen und zu analysieren, aber nicht alle Programme einrichten möchten, können Sie meine Version der Distribution hier herunterladen:Version 6.0.4 . Alle Treiber (und andere Dateien) sind mit einem nicht vertrauenswürdigen selbstsignierten Zertifikat signiert. Um dieses Zertifikat in der 64-Bit-Windows-Version zu installieren, müssen Sie im Testmodus neu starten. Wenn Sie Fragen, Anregungen oder Empfehlungen haben, schreiben Sie mir bitte hier in Kommentaren oder per persönlicher Nachricht. Möge die Open Source mit Ihnen sein!

Änderungen


Archiv
• Russischer Artikel veröffentlicht am 21.01.2016
  1. VirtualBox 5.0.12.

• Update vom 24.05.2016
  1. Der Artikel wurde für VB 5.0.20 aktualisiert. Eine der wichtigsten Änderungen ist die doppelte Signatur von SHA-1 / SHA-256.
  2. Deaktivierung der erzwungenen Signaturprüfungen hinzugefügt, wenn selbstsignierte Zertifikate verwendet werden.
  3. Informationen zur Problemumgehung für Installationsfehler der selbstsignierten Distribution hinzugefügt.
  4. Bibliotheksversionen wurden aktualisiert.
  5. Disabled some unused components for speeding up the build process.
  6. Minor fixes and improvements.

• Update of 29.07.2016
  1. The article is updated for VB 5.1.2; the most important change is upgrading to Qt5. The differences from VB 5.0.x procedure are specified where applicable.
  2. Library versions were updated.
  3. The full build batch was updated to check error codes after each operation.
  4. Minor fixes and improvements.

• Update of 15.09.2016
  1. The article is updated for VB 5.1.6.
  2. Library versions were updated.
  3. Added NASM for building OpenSSL.
  4. Added OpenSSL into cURL; this fixes the broken function of checking for updates and downloading the Extension Pack.
  5. The full build batch now reads the VB version automatically.
  6. Various minor fixes and improvements.

• Update of 30.11.2016
  1. The article is updated for VB 5.1.10.
  2. Library versions were updated; particularly OpenSSL was upgraded to version 1.1.x.
  3. Fixed some installation errors:
    • path to the Qt plugins now points to the installation directory;
    • added forgotten OpenSSL libraries to the 32-bit components of the 64-bit VB version.
  4. The article no longer contains information about building older VB versions. If needed, the previous versions of it are available in the GitHub project .

• Update of 2.12.2016
  1. Switched to using statically linked OpenSSL.

• Update of 20.06.2017
  1. The article is updated for VB 5.1.22.
  2. cURL, OpenSSL, and gSOAP were updated; adapted the build instructions for cURL, gSOAP and VB.

• Update of 1.12.2017
  1. The article is updated for VB 5.2.2.
  2. Switched from MinGW-32 3.3.3 to 4.5.4.
  3. Qt, cURL, OpenSSL, gSOAP, and some build tools were updated; adapted the build instructions for cURL, gSOAP and VB.
  4. Switched to using local archives of DocBook XML/XSL instead of online versions.
  5. Using cURL program instead of wget for downloading the Guest Additions ISO image.
  6. Various minor fixes and improvements.

• Update of 4.12.2017
  1. The libxml version was fixed in the build instructions.

• Update of 4.09.2018
  1. The article is updated for VB 5.2.18.
  2. cURL, OpenSSL, gSOAP and some build tools were updated; adapted the build instructions for cURL.

• Update of 12.12.2018
  1. The article is updated for VB 5.2.22.
  2. Enabled screen recording functionality which is disabled in OSE version by default; added libraries libopus and libvpx for encoding.
  3. cURL, OpenSSL, and gSOAP were updated.
  4. The full set of VirtualBox source code changes is now published as a single patch file for easier application.

• Aktualisierung vom 25.01.2019
  1. Der Artikel wurde für VB 6.0.2 aktualisiert.
  2. Verbessertes Deaktivieren der Erstellung von Gastzugaben.
  3. cURL und gSOAP wurden aktualisiert; DocBook XSL-Stylesheets wurden auf die Version 1.69.1 heruntergestuft (die Dokumentation ist besser für diese Version geeignet).
  4. Der vollständige Build-Stapel wurde aus dem Artikeltext in eine herunterladbare Datei aufgeteilt.

• Aktualisierung vom 08.04.2019
  1. The article has been translated into English for the first time. Also numerous minor changes were introduced into the Russian version.
  2. Added information about drivers signing for Windows 10.
  3. The article is updated for VB 6.0.4.
  4. cURL, OpenSSL, gSOAP, and some tools were updated.
  5. The full build batch no longer has to be placed at the specific path. Also, it now contains the basic template for automated Windows 10 drivers signing.

Source: https://habr.com/ru/post/de447300/


All Articles