Criando o VirtualBox para Windows


Introdução


É um fato bem conhecido para muitos usuários da versão Windows do VirtualBox (a partir de agora, VB ; não deve ser confundido com o Visual Basic) que, começando com 4.3.14, os desenvolvedores adicionaram o chamado "reforço" projetado para evitar injeções maliciosas no VB. Embora as intenções fossem boas, a implementação causou numerosos conflitos com produtos totalmente legítimos, como antivírus, módulos criptográficos e até algumas atualizações do próprio Windows, e quando esse conflito ocorre, o VB simplesmente para de funcionar. Os usuários precisam esperar pelo menos um mês até que a nova versão do VB seja lançada com as exclusões apropriadas adicionadas. O pior é que o aplicativo ou atualização conflitante deve ser desinstalado ou o próprio VB deve ser rebaixado para a versão 4.3.12, que foi a mais recente sem proteção. Inúmeras solicitações para adicionar uma lista de exclusão controlada pelo usuário ou uma opção para desativar o fortalecimento são deixadas sem resposta. A única resposta dos desenvolvedores soa como "se você não quiser, construa a partir do código-fonte". Bem, parece que vamos precisar.

Embora as instruções de compilação sejam descritas no Wiki oficial do projeto, elas estão incompletas e um pouco desatualizadas, enquanto o procedimento de compilação geralmente falha com vagas mensagens de erro. Então, quando, no final, o fiz funcionar, pensei que valeria a pena documentar em detalhes todos os detalhes em um artigo separado. Esta instrução está sendo atualizada periodicamente e, no momento, está adaptada para a criação do VB versão 6.0.4. No entanto, se você precisar de informações sobre a criação de versões anteriores do VB ou de bibliotecas auxiliares, sempre poderá obtê-lo do histórico de alterações .

Sumário

» Declaração do Problema
» Uma palavra de advertência
» Preparação do ambiente de construção
» Peculiaridades de Instalação de Aplicativos
» Toques Finais
» Criando o VirtualBox
» Epílogo
» Alterações

Declaração do Problema


No começo, eu queria simplificá-lo, apenas reconstruindo os componentes binários e copiando-os na parte superior da versão instalada na distribuição oficial. No entanto, isso parece estar longe de ser simples, porque a instalação depende de alguma API obscura do sistema e requer instalação de drivers e registro de componentes COM. Eu me perguntava se era viável aprender como tudo isso funcionava e escrever um script para automatizar essas tarefas, mas, após algumas considerações, decidi aumentar e construir uma distribuição completa que fosse o mais próxima possível da oficial, apenas sem endurecimento.

Devo dizer que essa tarefa se mostrou muito difícil e não consegui cumpri-la em 100%. O que eu encontrei foram as Adições de Convidados, fornecidas para Windows (32 e 64 bits), OS / 2, Linux e alguns outros sistemas * NIX. Os comentários no Makefile correspondente mencionam que todos eles são construídos em máquinas remotas diferentes, e eu definitivamente não estava ansioso para gerenciar uma fábrica de construção. Portanto, minha solução final foi criar tudo a partir dos códigos-fonte, exceto os Additions, mas levar a imagem ISO oficial com eles e colocar na minha distribuição como está. Não verifiquei se as adições têm o mesmo mecanismo de proteção, mas mesmo que nunca tenham ouvido alguma reclamação.

Uma palavra de aviso


• Considerações de segurança

O endurecimento não foi adicionado por capricho, era uma solução para fechar uma vulnerabilidade no VB. Infelizmente, a Oracle se recusa a fornecer a descrição detalhada do problema, mesmo que ele tenha sido corrigido há muitos anos. Geralmente, ele tem algo a ver com o mecanismo de injeção de DLL no Windows que, no caso do VB, pode levar à elevação de privilégios não autorizados no computador host, e existem explorações de trabalho para esta vulnerabilidade. Portanto, esteja avisado se você decidir usar a versão menos rígida de qualquer maneira.

• assinatura de drivers

A partir do Vista, nas versões de 64 bits do Windows, os usuários não podem mais carregar drivers arbitrários. Os drivers devem ser assinados por um certificado com uma cadeia de certificados cruzados que vá até a CA raiz da Microsoft (e no Windows 10 com a Inicialização segura ativada, os drivers devem ser assinados pela própria Microsoft). Antes de iniciar a jornada de construção do VB, você precisa decidir como resolver esse problema. Você pode gastar algum dinheiro e comprar seu próprio certificado ou tentar entrar em contato com empresas terceirizadas que fornecem serviços de assinatura para projetos de código aberto (se eles concordarem em assinar drivers vulneráveis) ou definir seu Windows no modo de teste que permite carregar drivers assinado com um certificado de teste gerado localmente.

No artigo, vou sugerir principalmente o último cenário, mas mencionarei como o procedimento muda se você tiver um certificado comercial "completo".

Preparação do ambiente de construção


O guia oficial recomenda usar o Windows 7 a 10 como um sistema de compilação. Fiz todo o trabalho no Windows 7 SP1 x64 e não acho que a versão do sistema operacional afete muito o procedimento. Lembre-se de que a máquina (real ou virtual) que você usará para criar o VB deve ter conexão com a Internet.

O ambiente de compilação requer várias ferramentas. Se algum programa tiver uma versão portátil, prefiro usá-lo em vez de usar o instalador.

Agora, os seguintes programas podem ser obtidos apenas como distribuições instaláveis ​​(pelo menos oficialmente). Para o Visual Studio e SDK / WDK, é importante seguir a ordem de instalação conforme especificado abaixo. Depois de terminar, recomendo executar o Windows Update e buscar as atualizações mais recentes para todos os produtos da Microsoft.

Os outros programas são baixados como arquivos portáteis ou códigos-fonte:

Você também precisará dos seguintes arquivos:

Para que você quer tudo isso?
Se você não quiser criar exatamente o mesmo pacote que eu, poderá se livrar de algumas das ferramentas mencionadas acima. Então, aqui vou dar alguns detalhes para sua finalidade no processo de compilação.

  • SDK 8.1
    A compilação real é realizada usando o SDK 7.1, mas você precisará do programa SignTool da 8.1, porque a versão 7.1 não pode executar a assinatura dupla SHA-1 / SHA-256. Se você tiver o SDK 8.1 instalado em outro lugar, basta copiar o signtool.exe com todas as suas dependências e especificar o caminho no arquivo LocalConfig.kmk (veja abaixo ).
  • WiX
    Essa é a estrutura para criar pacotes MSI. Embora a distribuição final do VB seja um EXE, ela contém dois arquivos MSI, portanto, você precisa do WiX para construí-los. No entanto, se você pretender criar apenas os arquivos binários do VB sem empacotá-los, poderá fazê-lo sem o WiX.
  • Sdl
    Essa biblioteca é usada para um VBoxSDL.exe simplista adicional de front-end, que pode ser usado em vez do VirtualBox.exe . Em teoria, se você não precisar desse componente, poderá executar a compilação sem ter SDL, mas eu não tentei isso.
  • gSOAP
    Essa biblioteca é usada para criar o VBoxWebSrv.exe , serviço de gerenciamento remoto do VB. Se você não possui o gSOAP, esse componente será ignorado silenciosamente durante a compilação.
  • libvpx , libopus
    Estes são os codecs de vídeo e áudio usados ​​para gravar a tela da VM. Se você não os tiver, a compilação ainda será concluída com êxito e o VB ainda terá todas as opções para captura de vídeo, mas essas opções serão ignoradas (mesmo que a animação da captura seja reproduzida, nenhuma gravação real será salva) .
  • Cygwin
    Necessário para construir a libvpx.
  • MiKTeX
    O MiKTeX é usado para compilar a documentação em PDF ( doc\UserManual.pdf ). Sem esse programa, o PDF será omitido silenciosamente da construção e embalagem.
  • NASM
    O assembler usado durante a construção do OpenSSL. Você pode construí-lo também sem usar o assembler, mas eu ainda recomendo usá-lo para gerar um código mais otimizado.

Aqui está o resumo de todas as ferramentas e bibliotecas que estou usando, incluindo suas versões exatas (sempre que possível) e os caminhos de instalação que escolhi no meu sistema de compilação. A designação " {x32|x64} " é usada para locais separados de instalação das versões de 32 e 64 bits.
Programa / ferramentaVersãoCaminho da instalação
Visual studioProfissional de 2010C:\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}\
Openssl1.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\
Folhas de estilo DocBook XSL1.69.1C:\Programs\DocBook\xsl\

Peculiaridades de Instalação de Aplicativos


Aqui, forneço algumas instruções sobre a instalação de algumas das ferramentas mencionadas acima, onde o procedimento não é óbvio ou requer ações adicionais.

• Windows SDK v7.1
A instalação deste SDK provavelmente falhará porque inclui as versões desatualizadas das bibliotecas do compilador e do tempo de execução. Depois de instalar o VS 2010, há versões mais novas das presentes no sistema, portanto, as mais antigas não são instaladas e o instalador principal considera um erro crítico. Para contornar esse problema, desmarque as caixas de seleção correspondentes ou, antes da instalação do SDK, desinstale os pacotes denominados "Microsoft Visual C ++ 2010 <arch> Redistributable" , "Microsoft Visual C ++ 2010 <arch> Runtime" , "Microsoft Compiladores Visual C ++ ... ” Deixe o SDK instalar as versões mais antigas e execute o Windows Update para obter as versões disponíveis mais recentes.

Ao instalar o SDK, verifique as amostras do programa (Windows Native Code Development -> Samples): elas contêm alguns scripts usados ​​pelas regras de criação do VB. Sem eles, você não poderá criar os pacotes MSI.

• Windows SDK v8.1
Você só precisa instalar o componente "Windows Software Development Kit".

• WDK v7.1
Você só precisa instalar o componente "Build Ambientes".

• Qt 5.6.3
A partir do Qt 5.7.0, para construí-lo, você precisa do Visual Studio 2012 ou posterior, por isso estamos presos ao 5.6.x.
Como não há compilações oficiais para o Visual Studio 2010, teremos que construir o Qt a partir do código-fonte.

  1. Descompacte o arquivo de código-fonte Qt em C:\Programs\Qt\ e renomeie o diretório qt-everywhere-opensource-src-5.6.3 para 5.6.3-src .
  2. Ao lado, crie um diretório build-x32 onde a compilação ocorrerá.
  3. Abra o console e execute os seguintes comandos para preparar o ambiente:
     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 
    O comando color é opcional, ele se livra da cor verde que foi definida pelo script SetEnv.Cmd .
  4. Agora precisamos executar o script configure.bat partir da 5.6.3-src . O VB não usa grande parte do que o Qt inclui, portanto, podemos reduzir significativamente o tempo de compilação desativando vários componentes, mas observe que algumas opções são cruciais para o VB. Particularmente, descobri que:
    • O OpenGL ES 2 não é suportado (ao criar o VB, o compilador falha ao encontrar alguns arquivos de cabeçalho).
    • O suporte ao FreeType deve estar ativado (caso contrário, o plugin qoffscreen não será criado e é necessário para o VB).
    Esta é a linha de comando completa com a qual acabei:
     ..\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. O caminho de instalação do Qt especificado aqui (na opção -prefix ) é codificado nos arquivos de código-fonte intermediários pelo script configure, para que os arquivos binários também se lembrem dele. Qualquer aplicativo baseado em Qt criado usando esta biblioteca procurará primeiro os plug-ins necessários nesse caminho e, somente se não puderem ser encontrados, ele usará seu próprio local atual. Na maioria dos casos, isso é bom, mas suponha que no computador em que o nosso VB esteja instalado, haja outra compilação do Qt localizada em c:\Programs\Qt\5.6.3-x32 , mas compilada com opções diferentes ou por um compilador diferente? Em seguida, o VB tentará carregar esses plugins (incompatíveis) e travará.
    Existem duas maneiras possíveis de evitar esse problema. Primeiro, adicione à instalação um arquivo adicional chamado qt.conf com o seguinte texto:
     [Paths] Plugins=. 
    A outra é corrigir o caminho de instalação salvo antes da criação do Qt, para que ele aponte para o diretório do aplicativo. Decidi seguir pela última maneira, não gostei da idéia de ter arquivos adicionais para o que a distribuição Oracle VB possuía. Você precisa abrir o arquivo C:\Programs\Qt\build-x32\qtbase\src\corelib\global\qconfig.cpp criado pelo script configure, localize a seguinte linha:
     static const char qt_configure_prefix_path_str [512 + 12] = "qt_prfxpath=c:/Programs/Qt/5.6.3-x32"; 
    e substitua o caminho por um único ponto, para que esta linha fique assim:
     static const char qt_configure_prefix_path_str [512 + 12] = "qt_prfxpath=."; 
    Essa alteração afetará apenas o comportamento do tempo de execução do VB. A etapa de instalação do Qt em si usará o caminho original, porque agora está armazenado nos Makefiles que não modificamos.
  6. Em seguida, execute a construção usando o comando nmake
  7. E instale a biblioteca construída usando o nmake install

Agora abra uma nova janela do console e faça o mesmo para a versão de 64 bits. Você precisará substituir "x32" por "x64" em todos os caminhos, e os comandos de preparação do ambiente terão a seguinte aparência:
 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 

Após concluir a instalação, os diretórios build-x32 , build-x64 e 5.6.3-src podem ser excluídos.

• MinGW
Simplesmente descompacte os arquivos de 32 e 64 bits nos respectivos diretórios de instalação.

• Cygwin
Durante a instalação, você precisa escolher os pacotes make e yasm .

• SDL
  1. Descompacte o arquivo SDL duas vezes em caminhos separados: C:\Programs\SDL\x32\ e C:\Programs\SDL\x64\ .
  2. Mova todo o conteúdo do subdiretório C:\Programs\SDL\x64\lib\x64\ para o diretório pai (ou seja, em C:\Programs\SDL\x64\lib\ ) e exclua os subdiretórios C:\Programs\SDL\x64\lib\x86 e x64 .
  3. Faça o mesmo para a versão de 32 bits: mova o conteúdo de C:\Programs\SDL\x32\lib\x86\ para C:\Programs\SDL\x32\lib\ e exclua C:\Programs\SDL\x64\lib\x86 e x64 .

• NASM
Descompacte o archive nasm-2.14.02-win64.zip em C:\Programs\ e renomeie o diretório resultante nasm-2.14.02 como nasm .

• OpenSSL
  1. Descompacte o arquivo OpenSSL em C:\Programs\OpenSSL\ duas vezes, renomeando as cópias do diretório openssl-1.1.1b como openssl-1.1.1b-x32 e openssl-1.1.1b-x64 .
  2. Abra o console, construa e instale a versão de 32 bits executando:
     "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 
    Se a etapa de configuração emitir um aviso assustador sobre um compilador ausente, desconsidere esta mensagem, está mentindo escandalosamente.
    Se você não quiser usar o NASM, pule o comando com a modificação PATH e, para o script Configure especifique o parâmetro adicional no-asm .
  3. Agora abra uma nova janela do console e faça o mesmo para a versão de 64 bits:
     "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 
    Desativar o NASM é o mesmo que em 32 bits.
  4. Agora você pode excluir os diretórios C:\Programs\OpenSSL\openssl-1.1.1b-x32 e openssl-1.1.1b-x64 .

• cURL
  1. Descompacte o arquivo cURL em C:\Programs\curl\ e renomeie o subdiretório resultante curl-7.64.1 para curl-7.64.1-x32 .
  2. Abra o arquivo C:\Programs\curl\curl-7.64.1-x32\winbuild\MakefileBuild.vc em um editor de texto e procure o seguinte bloco de código (ao redor das linhas No.61 a 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 
    Após essas linhas, adicione a nova diretiva:
     CFLAGS = $(CFLAGS) /DCURL_DISABLE_LDAP 
    Caso contrário, a construção do VB falhará com erros de link.
  3. Agora abra o arquivo C:\Programs\curl\curl-7.64.1-x32\winbuild\gen_resp_file.bat e, após a primeira linha ( @echo OFF ), insira este comando:
     cd . 
    Ele não faz nada, exceto redefinir o código ERRORLEVEL . O script é tão simples que é possível concluir sem executar nenhum comando que altere o código de erro. Portanto, se esse código for diferente de zero antes de iniciar o script, ele manterá seu valor na saída do script, e o nmake pensaria que foi o script que retornou esse código de erro e encerrou a compilação com falha. A adição desse cd falso corrige o problema.
  4. Agora faça uma cópia completa do curl-7.64.1-x32 sob o nome curl-7.64.1-x64 .
  5. Abra o console, construa a versão de 32 bits e copie os arquivos que precisamos:
     "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. Abra outra janela do console e construa a versão de 64 bits:
     "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 
    Observe que, além do que fizemos na versão de 32 bits, também curl.exe o arquivo curl.exe . Nós o usaremos mais tarde, para baixar a imagem de adições de convidados.
  7. Os diretórios C:\Programs\curl\curl-7.64.1-x32 e curl-7.64.1-x64 não são mais necessários e podem ser removidos.

Libvpx
  1. Descompacte o arquivo libvpx em C:\Programs\libvpx-build\ .
  2. Inicie o terminal Cygwin, a compilação será realizada lá. Nossa plataforma de destino é o Visual Studio 2010; o sistema de compilação oferece suporte apenas parcialmente: ele tentará executar a compilação real usando o msbuild.exe mas não funciona por algum motivo; Não consegui descobrir o porquê. Em vez disso, podemos simplesmente executar o próprio Visual Studio e usá-lo para criar o projeto. Felizmente, ele pode ser usado na linha de comando, portanto, não é necessário iniciar o IDE real (embora você possa, se desejar, nesse caso, você precisará modificar a variável PATH e adicionar o caminho C:\Programs\cygwin64\bin , ou de qualquer outra forma, permita que o VS encontre o yasm.exe localizado lá e necessário para a compilação). Portanto, para executar a construção de ambas as arquiteturas, execute os seguintes comandos no terminal Cygwin:
     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. Feche o Cygwin, não precisaremos mais dele. O diretório C:\Programs\libvpx-build pode ser removido.

Libopus
  1. Descompacte o arquivo opus em C:\Programs\libopus-build\ , vá para o subdiretório opus-1.3\win32\VS2015 .
  2. Este projeto foi desenvolvido para a versão mais recente do Visual Studio, portanto, precisamos modificá-lo para compilá-lo em nossa versão 2010. Você pode fazê-lo usando o IDE ou um editor de texto sem formatação. Eu escolhi o último. Abra o arquivo opus.vcxproj e faça o seguinte:
    1. Encontre todas as linhas que contêm o texto
       <PlatformToolset>v140</PlatformToolset> 
      e substitua a v140 pela v100 . Se você estiver usando o IDE, esta é a opção de configuração "Platrofm Toolset" localizada na página Propriedades de configuração -> Geral. Não se esqueça dos seletores de configuração e plataforma na parte superior da caixa de diálogo.
    2. Em seguida, procure este bloco de código:
        <ItemDefinitionGroup> <ClCompile> 
      e adicione uma nova tag dentro dela:
        <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> 
      No IDE, você pode fazer isso abrindo a página Propriedades de configuração -> C / C ++ -> Geral e definindo "Debug Information Format" em "ProgramDatabase (/ Zi)". Na verdade, você pode configurá-lo com qualquer outro valor válido, não precisamos do banco de dados de depuração, mas com um valor inválido, o projeto falhará ao criar.
  3. Agora vamos criar a versão Release para ambas as plataformas (usando o VS IDE ou a linha de comando) e copie a biblioteca opus.lib e o subdiretório include\ no caminho de destino:
     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. O diretório C:\Programs\libopus-build pode ser removido.

• gSOAP
Abra o arquivo gsoap-2.8\gsoap , vá para o subdiretório gsoap-2.8\gsoap e descompacte seu conteúdo em C:\Programs\gSOAP\ . O OpenSSL 1.1.x requer o gSOAP versão 2.8.41 ou superior. Se, por algum motivo, você quiser usar uma versão mais antiga, precisará aplicar o patch criado por Mattias Ellert . A aplicação de um patch pode ser feita manualmente (o formato é fácil: abra os arquivos mencionados, exclua as linhas marcadas com menos, adicione linhas marcadas com mais; o resto é contexto) ou obtenha a ferramenta de patch portada para Windows e use-a.

• MiKTeX
  1. Descompacte o arquivo em C:\Programs\MiKTeX\ .
  2. Abra o console e instale módulos adicionais:
     "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
Para XML DTD, você precisa criar um diretório e descompactar o conteúdo do arquivo. Para folhas de estilo XSL, todo o conteúdo já está em um único diretório, portanto, é necessário extrair isso e renomeá-lo posteriormente.

Toques finais


O ambiente de construção está quase pronto, são necessárias mais algumas etapas. Faça o download do arquivo de código-fonte do VirtualBox (se ainda não o tiver feito) e descompacte-o no local em que você deseja trabalhar. Eu escolhi C:\Devel\ para esse fim, coloquei os códigos-fonte descompactados e renomeei o subdiretório para VirtualBox-src .

Adicionando certificados

Se você não possui um certificado pago, recomendo que você crie pelo menos um certificado pessoal autoassinado: é mais fácil fazer o Windows carregar drivers autoassinados do que os não assinados. Para fazer isso, abra o console com privilégios elevados e execute os seguintes comandos que adicionam dois certificados (SHA-1 e SHA-256) e os importam para seu armazenamento pessoal:
 "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 
Você pode, é claro, escolher seu próprio nome para os certificados, em vez de "Roga and Kopyta Ltd", e o caminho para armazenar os arquivos. Agora precisamos obter as impressões digitais dos certificados gerados. Abra o console de gerenciamento de Certificados (executando certmgr.msc ) e navegue até o armazenamento Pessoal. Você verá os dois novos certificados denominados "Roga e Kopyta Ltd" lá. Clique duas vezes no primeiro; na caixa de diálogo exibida, vá para a guia Detalhes . O campo "Algoritmo de assinatura" contém o nome do algoritmo: sha256RSA ou sha1RSA. Role para baixo até o campo "Impressão digital", que contém a sequência de números hexadecimais. Copie esse valor completo e anote-o em algum lugar. Faça o mesmo para o segundo certificado; não esqueça de marcar qual impressão digital era para o SHA-1 e qual era para o SHA-256.

• Construindo xmllint

Uma das etapas de compilação precisará do programa xmllint . Eu não o coloquei na lista de requisitos de compilação porque suas fontes estão agrupadas no arquivo VirtualBox. Mas você ainda precisará construí-lo, porque as regras de compilação do VB não o fazem. Eu escolhi C:\Programs\xmllint como diretório de destino.
  1. Copie o diretório C:\Devel\VirtualBox-src\src\libs\libxml2-2.9.4 em C:\Programs\ para garantir que sua compilação não afete o VB de nenhuma maneira.
  2. Abra o console e execute os seguintes comandos:
     "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. Remova o diretório C:\Programs\libxml2-2.9.4 .

• Modificações de arquivos VB

Antes de iniciar a compilação, também precisamos trazer algumas alterações no código-fonte do VB. O conjunto completo deles é apresentado aqui como um arquivo de patch para download que pode ser aplicado manualmente ou usando a ferramenta de patch (que você precisa baixar separadamente):

» Vbox_build.patch

Se não houver problemas ao aplicar o patch, você pode pular para a próxima etapa . No entanto, se você tiver alguns problemas e precisar de mais informações sobre alterações específicas, ou se simplesmente quiser entender o que está sendo alterado e o motivo, poderá continuar e ler os detalhes fornecidos abaixo. Observe que as alterações vêm aqui em uma ordem diferente em comparação ao arquivo de correção. Os caminhos para os arquivos são especificados em relação ao diretório de código-fonte do VB C:\Devel\VirtualBox-src .
  1. Arquivo configure.vbs :
    • A linha de código:
       if Shell(DosSlashes(strPathVC & "/bin/cl.exe"), True) <> 0 then 
      é substituído por:
       if Shell(DosSlashes(strPathVC & "/bin/cl.exe") & " /?", True) <> 0 then 
      Essa linha executa a verificação do compilador, mas esquece que o cl.exe sem nenhum argumento retorna um erro e, portanto, é considerado um compilador inválido. Adicionando o " /? "O argumento torna a saída da ajuda e a saída com o código não de erro 0.
    • Agora vamos pular para a função CheckForMinGW32Sub . Como o nome indica, ele verifica a validade do MinGW de 32 bits. No entanto, ele foi projetado para a versão 3.3.3, enquanto estou usando o 4.5.4, que possui uma estrutura de arquivo / diretório diferente, então substituí toda a função pelo código a seguir (que é basicamente apenas uma cópia do CheckForMinGWw64Sub adaptada para o Variante de 32 bits):
       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 
    • Nossa próxima função é CheckForCurlSub , e o bloco de código a ser editado é:
        if LogFileExists(strPathCurl, "include/curl/curl.h") _ And LogFindFile(strPathCurl, "libcurl.dll") <> "" _ And LogFindFile(strPathCurl, "libcurl.lib") <> "" _ 
      Ele verifica a validade do libcurl, mas requer uma versão vinculada dinamicamente e falha se nenhum arquivo DLL puder ser encontrado. Estamos usando a versão vinculada estaticamente, portanto, infelizmente, a verificação da DLL precisa ser executada e nos deixar:
        if LogFileExists(strPathCurl, "include/curl/curl.h") _ And LogFindFile(strPathCurl, "libcurl.lib") <> "" _ 
    • Agora entre na função CheckForPython onde a variável VBOX_BLD_PYTHON é gerada:
        CfgPrint "VBOX_BLD_PYTHON := " & strPathPython & "\python.exe" 
      A barra invertida na frente do python.exe deve ser substituída pela anterior: "/python.exe" (sem essa correção, algumas verificações durante o processo de compilação falharão; não notei outros efeitos negativos, mas é mais bonito sem mensagens de falha e, em qualquer caso, melhor prevenir do que remediar).
    • A versão do Windows do script de configuração não suporta libvpx e libopus, então eu as adicionei. Obviamente, a maneira mais simples era apenas codificar os caminhos para as bibliotecas, mas eu preferia implementá-lo como todos os demais componentes, passando o caminho na linha de comando e verificações de validade adequadas. O código principal para isso consiste nas duas funções de verificação:
       '' ' 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 
      O usage função é usado para imprimir a lista de argumentos da linha de comando; anexamos nossos dois novos argumentos aqui:
        Print " --with-libvpx=PATH " Print " --with-libopus=PATH " 
      No início da função Main variáveis ​​são definidas para armazenar caminhos para os componentes, precisamos adicionar dois novos lá:
        strOptVpx = "" strOptOpus = "" 
      Um pouco mais abaixo, segue o bloco de select-case que processa os argumentos e preenche as variáveis; adicionando nossa contribuição:
        case "--with-libvpx" strOptVpx = strPath case "--with-libopus" strOptOpus = strPath 
      E, finalmente, quase no final do arquivo existe a cadeia de todas essas chamadas de função de verificação, é aqui que adicionamos a chamada de nossas duas novas funções:
        CheckForVpx strOptVpx CheckForOpus strOptOpus 
  2. O próximo arquivo é src\VBox\Runtime\Makefile.kmk . Precisamos encontrar as definições das variáveis VBoxRT_LIBS.win e VBoxRT-x86_LIBS.win e adicionar duas novas bibliotecas a elas, bcrypt.lib e bcrypt.lib . Portanto, o seguinte código:
     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 
    se transforma em:
     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 
    (não perca a barra invertida após delayimp.lib !); e, respectivamente, este bloco:
     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 
    torna-se:
     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 
    Essa alteração é necessária para vincular com êxito o VBoxRT.dll . Não tenho 100% de certeza do motivo, a versão do Oracle não depende do tempo de carregamento do crypt32.dll , é carregada em tempo de execução, portanto, o arquivo LIB não deve ser necessário. No entanto, sem ele, o vinculador não consegue encontrar algumas funções e falha. Suspeito que possa estar relacionado às opções de compilação do OpenSSL, mas não verifiquei isso, adicionar a dependência é mais fácil. E a segunda dependência, bcrypt.dll , é um requisito para o novo OpenSSL 1.1.1.
  3. Se você possui o gSOAP da versão 2.8.79 ou superior, edite o arquivo src\VBox\Runtime\r3\win\VBoxRT-openssl-1.1plus.def e adicione as seguintes linhas à lista de exportações:
      OpenSSL_version_num DH_generate_parameters_ex DH_new ASN1_STRING_get0_data 
    Esta lista define quais funções são exportadas pela biblioteca VBoxRT.dll (que contém o OpenSSL dentro). Quando a ferramenta VBoxWebSrv.exe está sendo vinculada, dependendo da versão do gSOAP, ela pode exigir funções adicionais do OpenSSL. Como estão ausentes na lista de exportações, o vinculador adiciona o próprio OpenSSL e imediatamente reclama de VBoxRT conflitos entre esse OpenSSL externo e sua própria cópia já incorporada ao VBoxRT . A adição das exportações mencionadas corrige o problema.
  4. Como mencionei no começo, não construo as adições de convidados, mas preciso ter sua imagem ISO como parte da distribuição. As regras de compilação foram projetadas para esse cenário, mas esperam que a imagem ISO pronta apareça magicamente no lugar certo e na hora certa. Adicionei essa mágica ao arquivo src\VBox\Makefile.kmk . Procure o seguinte código:
      ifdef VBOX_WITH_ADDITIONS include $(PATH_SUB_CURRENT)/Additions/Makefile.kmk endif 
    e logo abaixo segue a regra para o download automático do arquivo de imagem:
      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 
    Se você editar os arquivos manualmente, em vez de aplicar o patch, observe que os comandos da regra devem começar com o caractere de tabulação.
  5. Antes da versão 6.0, a documentação era um dos subsistemas criados com êxito sem nenhuma alteração. Não sei o que havia de errado nisso, mas foi redesenhado significativamente de tal maneira que não funciona mais no meu sistema de compilação. Não tenho idéia de como o próprio Oracle constrói a documentação (talvez em um sistema * NIX), mas para mim as regras de construção continuavam perdendo barras nos caminhos ou adicionando um excesso delas e, como resultado, não conseguiram encontrar os arquivos de destino. devido a incompatibilidades nos arquivos de catálogo. Finalmente consegui combinar algumas mudanças que permitiram construir a documentação sem erros. Primeiro, um dos diretórios de destino estava ausente, portanto, alguns dos arquivos intermediários não puderam ser criados. Esse problema foi corrigido no arquivo doc\manual\Makefile.kmk , dentro do seguinte bloco de código:
     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 
    Logo após o $$(RM) , adicionei um comando para criar o diretório ausente:
      $$(QUIET)$$(MKDIR) -p "$$(@D)" 

    Quanto às barras, as correções estão localizadas no arquivo doc\manual\Config.kmk . Não consegui encontrar uma solução "normal" para isso, mas há uma solução alternativa boa o suficiente para fins práticos, o que implica duplicar as regras de substituição de caminho para caminhos incorretos. Primeiro, abaixo da linha:
      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 
      or
       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) 
      or
       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

Agora precisamos criar o arquivo LocalConfig.kmkno diretório de fontes VB e escrever lá todos os caminhos e construir parâmetros. Você pode usar o seguinte texto como modelo:
 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 
Você precisará editar este modelo:
  • As variáveis VBOX_CERTIFICATE_SUBJECT_NAMEe VBOX_CERTIFICATE_SHA2_SUBJECT_NAMEdevem conter os nomes dos certificados SHA-1 e SHA-256, respectivamente.
  • As variáveis VBOX_CERTIFICATE_FINGERPRINTe VBOX_CERTIFICATE_SHA2_FINGERPRINTdevem conter as impressões digitais desses certificados; você os copiou anteriormente do console de gerenciamento de certificados.
  • 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.
  • A variável VBOX_BUILD_PUBLISHERespecifica o sufixo da marca no número da versão. Por padrão, é "_OSE" (ou seja, a versão completa do produto é "6.0.4_OSE"). Você pode especificar qualquer outro sufixo aqui ou configurá-lo como vazio para se livrar dele completamente. Mas se você excluir a variável completamente, ela usará o padrão "_OSE".
O restante das variáveis ​​é usado principalmente para declarar quais componentes devem ser construídos. E, é claro, a declaração principal está no topo: desligue o endurecimento.

Criando virtualbox


Finalmente, agora podemos começar a criar o VirtualBox. Se você normalmente prefere construir para diferentes plataformas em paralelo, você terá que ficar sem ela por enquanto ou usar duas cópias separadas da árvore de origem, porque o VB tem um arquivo de configuração comum que é gerado antes da construção e contém dados dependentes da plataforma. Não seria bom para o compilador lançá-lo de repente do ambiente de compilação de 64 bits para o de 32 bits no meio do processo de compilação.
Se você precisar de assinaturas de drivers compatíveis com o Windows 10, consulte as informações fornecidas após a descrição do procedimento principal.
  1. Vamos começar com a versão de 64 bits. Abra o console e execute os seguintes comandos:
     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.

Se nenhum de nós estragou tudo, toda essa longa cadeia deve oferecer a você um novo e brilhante instalador do VirtualBox que difere do Oracle apenas pelo seu ícone, a imagem About e, é claro, a profunda falta de proteção. Não é difícil substituir também o ícone e a imagem, mas não vou entrar neste tópico aqui.

Por conveniência, criei um único arquivo em lote que automatiza a compilação completa do VB. Você pode usá-lo se precisar criar o instalador completo regularmente.

Apenas mais algumas palavras sobre a instalação da distribuição resultante, se você estiver usando um certificado autoassinado. Como foi descoberto subitamente, no Windows 8/10 não é suficiente inicializar no modo de teste, a instalação ainda falha, alegando que as assinaturas do driver são inválidas. Você pode solucionar esse problema adicionando os certificados ao armazenamento raiz da CA:
  1. Abra a caixa de diálogo Propriedades do instalador do VB clicando com o botão direito do mouse e selecionando Propriedades , depois mude para a guia Assinaturas digitais . Você encontrará duas assinaturas lá, ambas nomeadas "Roga e Kopyta Ltd", uma é sha1, a outra sha256. Selecione o primeiro, clique em Detalhes .
  2. Outra caixa de diálogo é exibida, na qual você precisa clicar no botão Exibir certificado .
  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


Quando terminei de escrever o artigo, fiquei surpreso com seu volume. No começo, eu estava planejando entrar em muitos detalhes sobre as razões para escolher esta ou aquela maneira de resolver cada problema, explicar qual é exatamente o problema e quais soluções alternativas podem ser aplicáveis. Mas muito em breve ficou claro que, se carregado com todos esses detalhes, o texto seria monstruosamente enorme. Tenho que me desculpar pelas receitas parecidas com "apenas faça isso e não faça perguntas". Eu tenho uma forte antipatia por eles, mas simplesmente não consegui encontrar outra maneira. Ocasionalmente, eu ainda tentava descrever o que estava acontecendo, para suavizar a impressão.

Uma grande quantidade de detalhes sobre o sistema de compilação VB teve que permanecer nos bastidores; pois ambos me senti relutante em inchar o texto e, às vezes, estava com preguiça de procurar uma abordagem diferente e mais eficiente para resolver um problema. Afinal, meu principal objetivo, inicialmente, era conseguir uma versão funcional da versão atual do VirtualBox. O 4.3.12 já estava desatualizado nessa época, mas não corria o risco de atualizar uma das minhas ferramentas mais ativamente usadas para a versão mais avançada, que poderia simplesmente parar de funcionar a qualquer momento. Embora, de tempos em tempos, eu volte e, tendo encontrado algo novo, adicione-o a este artigo.

Espero que este artigo encontre seu público. Se você estiver interessado em ver e analisar o resultado final, mas não quiser configurar toda a pilha de programas, poderá obter minha versão da distribuição aqui:versão 6.0.4 . Todos os drivers (e outros arquivos) são assinados com um certificado autoassinado não confiável; portanto, para instalar isso na versão de 64 bits do Windows, você precisará reiniciar o modo de teste. Se você tiver alguma dúvida, sugestão, recomendação, sinta-se à vontade para me escrever aqui nos comentários ou através de mensagens pessoais. Que o Código Aberto esteja com você!

Alterações


Arquivo
• Russian article published, 21.01.2016
  1. VirtualBox 5.0.12.

• Update of 24.05.2016
  1. The article is updated for VB 5.0.20, one of the main changes being SHA-1/SHA-256 dual-signing.
  2. Added disabling of forced signature checks if self-signed certificates are used.
  3. Added information about workaround for installation failure of the self-signed distribution.
  4. Library versions were updated.
  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.

• Atualização de 25/01/2019
  1. O artigo é atualizado para o VB 6.0.2.
  2. Construção aprimorada de desativação de adições de convidados.
  3. cURL e gSOAP foram atualizados; As folhas de estilo DocBook XSL foram rebaixadas para a versão 1.69.1 (a documentação é mais adequada para essa versão).
  4. O lote de compilação completo foi dividido do texto do artigo em um arquivo para download.

• Atualização de 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/pt447300/


All Articles