2010-06-01

Kompilacja WinUAE 2.1.0

Wymagania:
  • Visual Studio 2010
  • zainstalowane najlepiej najnowsze WDK (także pod XP SP3)
  • zainstalowane najlepiej najnowsze DirectX SDK
Tutaj jedna uwaga. Warto sobie wszystkie pliki *.h w WDK i DirectX SDK przestawić na tylko do odczytu. Sprawdźmy plik $(USERPROFILE)\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user. Jego zawartość powinna wyglądać mniej więcej tak:


$(ExecutablePath);C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin;C:\Program Files (x86)\NASM
$(IncludePath);C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include;C:\Program Files (x86)\Microsoft DirectX SDK (February 2010)\Include;C:\DDK_7.1\inc\api
$(ReferencePath)
$(LibraryPath);C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib;C:\Program Files (x86)\Microsoft DirectX SDK (February 2010)\Lib\x86;C:\DDK_7.1\lib\wxp\i386
$(SourcePath)
$(ExcludePath);C:\Program Files\Microsoft SDKs (x86)\Windows\v7.0A\Include


Chodzi o to by ścieżki dołączane przez VS2010 typu $(*Path) były na samym początku. Na tym etapie powinniśmy poustawiać odpowiednio ścieżki do WDK i DirectX SDK. Najlepiej zrobić to tutaj, dzięki czemu nie będziemy musieli konfigurować każdego projektu z osobna. Pobierz NASM, zainstaluj go i dodaj go do ExecutablePath Pobieramy źródła WinUAE. Utwórz katalog winuae-base. W nim katalog winuae do którego wypakuj źródła. Pobieramy także źródła WinUAE z repozytorium GIT http://github.com/tonioni/WinUAE.git (patrz oficjalna strona projektu, sekcja Download). Ja użyłem do tego TortoiseGIT. Wymaga do działania msysgit. Podczas instalacji msysgit wybierz Run Git From Windows Command Promp. Kopiujemy katalog winuae-git/prowizard, którego brakuje w oficjalnych źródłach 2.1.0.
Czas na pobranie mnóstwa pakietów wymaganych do poprawnej kompilacji WinUAE. Tutaj doskonałe źródło wiedzy na ten temat. Skorzystanie np. z OpenAL, obsługi sieci, drukarek, czyli funkcjonalności której te pakiety dostarczają, wymaga z reguły by WinUAE miał dostęp do odpowiednich bibliotek DLL. Nie są one wymagane w momencie startu, są ładowane dynamicznie w razie potrzeby. WinUAE radzi sobie dobrze z obsługą sytuacji gdy ich nie ma. Ja skupiam się w tylko na skompilowaniu WinUAE z minimalną liczbą zmian. Można i to z sukcesem skompilować WinUAE bez tych wszystkich pakietów. Podstawowe elementy takie jak CD, HDD, gry, dźwięk będą działać. Wymaga to jednak dużego nakładu pracy. OpenAL Pobieramy OpenAL 1.1 Core SDK. Instalujemy. Tworzymy katalog winuae-base/openal i kopiujemy tam al.h, alc.h, OpenAL32.lib. Możemy odinstalować. zlib Pobieramy paczkę źródeł, wypakowujemy do winuae-base/zlib UnRAR Pobieramy UnRAR.dll i do katalogu winuae-base/unrar wypakowujemy unrar.h. WinPcap Pobieramy Developer's Pack i do wypakowujemy do katalogu winuae-base/winpcap katalogi Include i Lib. FreeType Pobieramy Binaries, do katalogu winuae-base/freetype wypakowujemy katalogi Include i Lib. Ze struktury katalogów eliminujemy freetype2. libpng Pobieramy źródła i wypakowujemy do katalogu winuae-base/libpng. TVicPort Pobieramy, instalujemy, do katalogu winuae-base/tvicport kopiujemy TVicPort.h. I w moim przypadku odinstalowujemy. Catweasel Pobieramy najnowszą wersję Catweasel ISA/MK3/MK4/MK4plus. Do katalogu winuae-base/catweasel wypakowujemy catweasl_usr.h. Ghostscritp Pobieramy źródła i wypakowujemy do katalogu winuae-base/ghostscript pliki errors.h, iapi.h, ierrors.h. PortAudio Pobieramy wersję v19. Wypakowujemy do katalogu winuae-base/portaudio. fdrawcmd Pobieramy ten plik i zapisujemy do winuae-base/fdrawcmd. G15 LCD Pobieramy sterowniki. Instalujemy je. Odnajdujemy LCDSDK_3.04.143.zip. Do katalogu winuae-base/logitechlcd wypakowujemy lglcd.h i lglcd.lib. Sterowniki możemy odinstalować. WinIO Do katalogu winuae-base/winio wypakowujemy zawartość katalogu Source. ParaPort Zawartość pliku nagłówkowego zapisujemy do winuae-base/paraport/paraport.h (najlepiej skopiować go ze źródeł strony). wnaspi32 Zapisuje do winuae-base/wnaspi32/wnaspi32.h enet Wypakowujemy do katalogu winuae-base/enet.
Do katalogu winuae-base/winuae/od-win32/winuae_msvc10/ kopiujemy plik solucji z repozytorium GIT. Otwieramy solucje. Usuwamy projekt unpackers. Usuwamy pliki *.obj z projektu winuae. Tworzymy w projekcie folder asm i dodajemy do niego pliki *.asm, które te obj-ty generowały. Zaznaczamy je wszystkie i wybieramy ich właściwości. Wybieramy wszystkie konfiguracje. Jako Item Type wybieramy Custom Build Tool. Naciskamy zastosuj. W Custom Build Tool ustawiamy: Command Line: nasm.exe -O1 -f win32 -Xvc -o "$(IntDir)%(Filename).obj" "%(RootDir)%(Directory)\%(Filename).asm" -w-orphan-labels Description: Compiling asm file %(Filename).asm Outputs: $(IntDir)%(Filename).obj;%(Outputs) Dla projektów build68k, genblitter, gencpu, gencomp dla Pre-Link-Event i Post-Build Event ujednolicamy wpisy dla wszystkich konfiguracji. Dla build68k zmieniamy by zamiast cpudefs.c generowany był plik cpudefs.cpp. Podobnie robimy dla projektu genblitter i genlinetoscr. Ustawiamy zależności pomiędzy projektami: winuae zależy od genblitter, gencpu, gencomp, genlinetoscr, prowizard oraz gencpu i gencomp zależą od build68k. We właściwościach projektu winuae do referencji dodajemy prowizard i ustawiamy Output File na domyślne dla wszystkich konfiguracji. Wybieramy konfiguracje Debug. W właściwościach solucji w Configuration Properties dla wszystkich konfiguracji włączamy w proces budowania tylko build68k, gencpu, gencomp, genblitter, genlinetoscr, prowizard, winuae. Budujemy build68k, genblitter - bez problemów. Budujemy gencomp, mamy błędy. W sysdeps.h dodajemy przed #include <tchar.h> wpis #include <windows.h>. Budujemy ponownie. Budujemy gencpu bez problemu. Budujemy genlinetoscr z problemami. Dla projektów build68k, gencpu, gencomp, genlinetoscr, genblitter dla wszystkich konfiguracji ustawiamy Output Directory i Intermediate Directory na $(Configuration)\, zaś Output File na $(OutDir)\..\$(TargetName)$(TargetExt). Budujemy genlinetoscr ponownie. Budujemy prowizard. Błędy. Kopiujemy z Release do Debug zawartość Additional Include Directories. Budujemy ponownie. Ujednolicamy dla wszystkich projektów zawartość Additional Include Directories. Z braku możliwości znalezienia lib-a do obsługi tabletu musiałem jego obsługę wyłączyć. W skórcie komentujemy #include <wintab.h>, #include <pktdef.h> i eliminujemy reszte błędów. Można także alternatywnie dodać nową definicje preprocesora do sysconfig.h. Usuwamy z Linker/Additional Dependencies wpis wintab32.lib dla wszystkich konfiguracji. Usuwamy z Delay Loaded Dlls wpis wintab32.dll dla wszystkich konfiguracji. Dla projektu winuae ustawiamy Output Directory i Intermediate Directory na $(Configuration)\ dla wszystkich konfiguracji. Ustawiamy Output File na domyślne dla wszystkich konfiguracji. Budujemy projekt winuae. Same błędy związane z brakiem plików nagłówkowych. Uzupełniamy Additional Include Directories o: ..\..\..\catweasel;..\..\..\enet\include;..\..\..\fdrawcmd;..\..\..\freetype\include;..\..\..\libpng;..\..\..\logitechlcd;..\..\..\openal;..\..\..\paraport;..\..\..\portaudio\include;..\..\..\tvicport;..\..\..\unrar;..\..\..\winio\Dll;..\..\..\winpcap\include;..\..\..\wnaspi32;..\..\..\zlib;%(AdditionalIncludeDirectories) Pozostały nam 2 błędy kompilacji: syntax error : identifier 'PARAPORT_INFO' d:\programowanie\c++\moje programy\winuae-base\winuae\od-win32\ioport.cpp Usuwamy: typedef BOOL (*getPortInfo)(HANDLE, PARAPORT_INFO*); static getPortInfo pp_getportinfo; pp_getportinfo = (getPortInfo)GetProcAddress (para, "getPortInfo"); Nic z tego nie korzysta. Co do drugiego błędu: 'Pa_OpenStream' : cannot convert parameter 7 from 'int (__cdecl *)(const void *,void *,unsigned long,const PaStreamCallbackTimeInfo *,PaStreamCallbackFlags,void *)' to 'PaStreamCallback (__stdcall *)' d:\programowanie\c++\moje programy\winuae-base\winuae\od-win32\sounddep\sound.cpp Uzupełniamy w portaudio.h deklarację PaStreamCallback o __cdecl. Budujemy ponownie winuae. Teraz to już tylko błędy linkowania. Ujednolicamy Linker/Additional Dependencies i Delay Loaded Dlls dla wszystkich konfiguracji projektu winuae. Uzupełniamy Additional Library Directories dla wszystkich konfiguracji o: ..\..\..\logitechlcd;..\..\..\winpcap\Lib;..\..\..\openal;..\..\..\freetype\lib Dodajemy do solucji WinIo.vcproj. Dodajemy do referencji winuae projekt WinIO. Usuwamy winio.lib z Linker/Additional Dependencies. Dla projektu WinIO ustawiamy Output Directory i Intermediate Directory na $(Configuration)\ dla wszystkich konfiguracji. Upewnijmy się w solucji że odpowiednie konfiguracje zostały wybrane. Bardzo często się zdarza, że np. dla konfiguracji solucji Release WinIO zostanie ustawiony na Debug. Budujemy WinIO. Budujemy ponownie winuae. Teraz zlib. Robimy dokładnie to co poprzednio w przypadku WinIO. Projekt to zlibstat.vcxproj. Budujemy zlibstat. Budujemy winuae. Teraz libpng. Edytujemy libpng.vcxproj. Usuwamy <import project="$(SolutionDir)\zlib.props">. Dodajemy projekt do solucji. Ustawiamy Output Directory i Intermediate Directory na $(Configuration)\ dla wszystkich konfiguracji. Target Name zaś na $(ProjectName) dla wszystkich konfiguracji. Ustawiamy Additional Include Directories na ..\..\..\..\zlib dla wszystkich konfiguracji. W właściwościach solucji ustawiamy Debug Library i Release Library dla odpowiednich konfiguracji. Dodajemy do referencji winuae projekt libpng. Usuwamy libpng.lib z Linker/Additional Dependencies. Budujemy libpng. Budujemy winuae. Czas na portaudio. Dodajemy do solucji portaudio.vcproj. Dodajemy do referencji winuae projekt portaudio. Ustawiamy Output Directory i Intermediate Directory na $(Configuration)\ dla wszystkich konfiguracji. Ustawiamy Output File na domyślne dla wszystkich konfiguracji. Usuwamy portaudio_x86.lib z Linker/Additional Dependencies dla wszystkich konfiguracji. Budujemy portaudio. Usuwamy z dysku jak i z projektu katalog ASIO. Budujemy. Usuwamy portaudio.def z projektu. Budujemy. Usuwamy dla wszystkich konfiguracji Module Definition File. Dodajmy do symboli preprocesora dla wszystkich konfiguracji PA_NO_ASIO. Zmieniamy w Delay Loaded Dlls portaudio_x86.dll na portaudio.dll. Budujemy. Uwaga: po zmianie nazwy dll-ki nie skorzystamy już z oryginalnej. Budujemy winuae. Czas na enet. Dodajemy do solucji enet.dsp. Dodajemy do referencji winuae projekt enet. Ustawiamy Output Directory i Intermediate Directory na $(Configuration)\ dla wszystkich konfiguracji. Ustawiamy Output File na domyślne dla wszystkich konfiguracji. Usuwamy enet.lib z Linker/Additional Dependencies dla wszystkich konfiguracji. Budujemy enet. Budujemy winuae. Usuwamy prowizard.lib z Linker/Additional Dependencies dla wszystkich konfiguracji. Budujemy winuae. Czas na błędy typu unresolved externals. Dla projektu enet, libpng, prowizard zmieniamy konwencje wywołań na stdcall dla wszystkich konfiguracji. Projekt portaudio nie eksportuje żadnych symboli. Dodajemy pliki nagłówkowe do projektu portaudio. Dodajemy na początek portaudio.h #ifdef _USRDLL #define DELC_EXTERN __declspec(dllexport) #else #define DELC_EXTERN __declspec(dllimport) #endif Dodajemy DELC_EXTERN do każdej funkcji w portaudio.h. Dodajemy _cdecl do każdej funkcji. Czyścimy dla wszystkich konfiguracji Linker/Advanced/Import Library. Otwieramy pcap.h, packet32.h, remote-ext.h i każdą funkcję raportowaną jako unresolved external dekorujemy __cdecl (a najlepiej wszystkie z tych plików). W tym momencie jedyne błędy linkera jakie zostały to multiply symbol define. Dla projektów enet, winuae, portaudio, prowizard, libpng, zlibstat, winio dla wszystkich konfiguracji poustawiajmy prawidłowo Runtime Library. Budujemy winuae. I mamy plik wykonywalny. Jeszcze jeśli idzie o Release. Dodajemy do projektu zlibstat do Pre_Build Event: cd ..\..\masmx86 bld_ml32.bat

Brak komentarzy:

Prześlij komentarz