Compare commits

..

17 Commits

Author SHA1 Message Date
Automatic Release Builder
88cc7822b6 new version: 2018.3.6 2020-08-06 16:04:28 +01:00
Automatic Release Builder
f96972a083 Set submodule revision for 2018.3.6 2020-08-06 16:03:19 +01:00
Automatic Release Builder
8e6a83896b Submodule update 2020-08-06 15:59:04 +01:00
Automatic Release Builder
a9fca6bb2b Update submodule revisions 2020-08-03 14:30:29 +01:00
Automatic Release Builder
12fce0f5e9 new version: 2018.3.5 2020-04-02 08:41:52 +01:00
James Turner
08633dad45 2018.3.5 release commits 2020-04-02 08:41:35 +01:00
James Turner
c0af026d3c Update FG & SG versions to pick up some fixes 2020-03-22 11:06:19 +00:00
James Turner
7e14b07a6b macOS: code-signing changes 2020-03-20 09:35:03 +00:00
James Turner
5d5e58e3b9 Update 2018.3 branch tags 2019-11-12 15:16:10 +00:00
James Turner
4e073285d9 Notarization support in macOS packaging scripts 2019-11-12 15:16:01 +00:00
James Turner
4adf49587b New version: 2018.3.4 2019-08-07 10:02:47 +01:00
Torsten Dreyer
414402268b New version: 2018.3.3 2019-07-28 22:45:07 +02:00
James Turner
8413bbac76 Update for 2018.3.2 2019-01-06 16:16:10 +00:00
James Turner
6c7fdbc0c6 Remove -j option to Cmake --build 2018-11-26 13:54:12 +00:00
James Turner
ffdd4f062f Use Cmake -build to compile 2018-10-23 12:10:01 +01:00
James Turner
bf5ec63ac3 Include the OSG .DDS loader plugin in Mac builds 2018-10-05 13:14:27 +01:00
Torsten Dreyer
83abaeeee2 set correct release-branch for submodules 2018-09-21 17:22:27 +02:00
125 changed files with 1252 additions and 7104 deletions

5
.gitignore vendored
View File

@@ -1,6 +1,6 @@
dist
.DS_Store
install*/
install
3rdParty
3rdParty.x64
boost_1_44_0
@@ -22,6 +22,3 @@ CMakeCache.txt
*.pyc
build-*
testOutput*
md5sum.xml
staging

8
.gitmodules vendored
View File

@@ -1,11 +1,11 @@
[submodule "simgear"]
path = simgear
url = ../simgear
branch = next
branch = release/2018.3
[submodule "flightgear"]
path = flightgear
url = ../flightgear
branch = next
branch = release/2018.3
[submodule "fgrun"]
path = fgrun
url = ../fgrun
@@ -13,7 +13,7 @@
[submodule "fgdata"]
path = fgdata
url = ../fgdata
branch = next
branch = release/2018.3
[submodule "windows-3rd-party"]
path = windows-3rd-party
url = ../windows-3rd-party
@@ -21,4 +21,4 @@
[submodule "getstart"]
path = getstart
url = ../getstart
branch = next
branch = release/2018.3

View File

@@ -1,50 +0,0 @@
[Files]
; 64 bits install
Source: "{#InstallDir64}\bin\*.*"; DestDir: "{app}\bin"; Excludes: "{#ExcludedBinaries}"; Flags: ignoreversion recursesubdirs; Check: Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\zlib.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\OpenAL32.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\libpng.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\libcurl.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\libintl-8.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\sentry.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\crashpad_handler.exe"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\dbus-1-3.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\event_core.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\liblzma.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\openxr_loader.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
; Include the base package
#if IncludeData == "TRUE"
Source: "{#FgHarnessPath}\fgdata\*.*"; DestDir: "{app}\data"; Flags: ignoreversion recursesubdirs skipifsourcedoesntexist
#endif
; 64 bits install
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osg.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgDB.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgGA.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgParticle.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgText.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgUtil.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgViewer.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgSim.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgFX.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgTerrain.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#OSG64InstallDir}\bin\ot{#OTSoNumber}-OpenThreads.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_ac.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_osg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_osga.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_3ds.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_mdl.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_jpeg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_rgb.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_png.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_dds.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_txf.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_tiff.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_freetype.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_osgterrain.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_serializers_osg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_serializers_osgterrain.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode

View File

@@ -1,39 +0,0 @@
[Messages]
ConfirmUninstall=Are you sure you want to completely remove %1 {#FGVersion} and all of its components?
pl.ConfirmUninstall=Czy na pewno chcesz całkowicie usunąć %1 {#FGVersion} i wszystkie jego komponenty?
es.ConfirmUninstall=¿ Estás seguro de que quieres borrar completamente %1 {#FGVersion} y todos sus componentes ?
nl.ConfirmUninstall=Weet u zeker dat u %1 {#FGVersion} en alle bijbehorende onderdelen wilt verwijderen?
de.ConfirmUninstall=Bist Du sicher, dass Du %1 {#FGVersion} und alle Komponenten entfernen willst?
[CustomMessages]
CreateDesktopIcon=Create a &desktop icon
CreateDesktopIconGroup=Additional icons:
RemoveAllSettings=Remove all settings, downloaded scenery and aircraft
RemoveAllSettingsDescription=FlightGear stores some settings in your user folder. In addition, scenery or aircraft data may have been downloaded to the download directory. To completely remove all these files, select this option.
FirewallFgException=Allows FlightGear to send and receive data over the multiplayer network and to get METARs.
FirewallFgcomException=Allows FGCom to establish a connection to FlightGear and the VoIP server for voice ATC communication.
pl.CreateDesktopIcon=Utwórz ikony na pulpicie
pl.CreateDesktopIconGroup=Dodatkowe ikony:
pl.RemoveAllSettings=Usuń wszystkie ustawienia, pobraną scenerię i samoloty
pl.RemoveAllSettingsDescription=FlightGear zapisuje niektóre ustawienia w katalogach użytkownika. Dodatkowo, sceneria lub dane statków powietrznych mogą być pobierane do katalogu pobrań. Aby całkowicie usunąć te ustawienia, wybierz tą opcję.
pl.FirewallFgException=Pozwala aplikacji FlightGear na wysyłanie i pobieranie danych przez sieć multiplayer oraz aby pobrać dane pogodowe METAR.
pl.FirewallFgcomException=Pozwala aplikacji FGCom na ustanowienie połączenia do aplikacji FlightGear i do serwerów VoIP dla komunikacji głosowej z ATC (kontrolerem lotów).
es.CreateDesktopIcon=Crear icono en el escritorio
es.RemoveAllSettings=Borrar todos los ajustes, escenarios y aviones descargados
es.RemoveAllSettingsDescription=FlightGear almacena algunos ajustes en tu carpeta de usuario. Adicionalmente, los datos de escenarios y aviones pueden haber sido descargados en el directorio de descargas. Para borrar completamente todos esos archivos, selecciona esta opción.
es.FirewallFgException=Permite a FlightGear mandar y recibir datos a la red multijugador y obtener METAR.
es.FirewallFgcomException=Permite a FGCom establecer una conexión con FlightGear y el servidor VoIP para comunicaciones de voz con el ATC.
nl.CreateDesktopIcon=Maak een snelkoppeling op het &bureaublad
nl.RemoveAllSettings=Verwijder alle instellingen en gedownloade data
nl.RemoveAllSettingsDescription=FlightGear bewaart een aantal instellingen in uw gebruikersmap. Mogelijk is er ook data in de downloadmap opgeslagen. Selecteer deze optie om die bestanden definitief te verwijderen.
nl.FirewallFgException=Sta FlightGear toe om data te verzenden en ontvangen via het multiplayernetwerk en om live weergegevens te downloaden.
nl.FirewallFgcomException=Sta FGCom toe om verbinding met FlightGear en de VoIP server te maken voor op stem gebaseerde ATC-communicatie.
de.CreateDesktopIcon=Ein Desktop-Icon anlegen
de.RemoveAllSettings=Alle Einstellungen und heruntergeladene Daten löschen
de.RemoveAllSettingsDescription=FlightGear speichert seine Einstellungen in deinem User-Verzeichnis. Zusätzlich heruntergeladene Flugzeuge und Szenerie-Daten können sich im Download-Verzeichnis befinden. Wähle diese Option, um alle Daten zu löschen.
de.FirewallFgException=Erlaubt FlightGear die Verbindung zum Multiplayer-Netzwerk und den Download von METAR-Daten.
de.FirewallFgcomException=Erlaubt FGCom die Verbindung zu FlightGear- und VoIP-Servern für den ATC-Sprechfunk.

208
FlightGear.iss Normal file → Executable file
View File

@@ -1,4 +1,4 @@
; Script generated by the Inno Setup Script Wizard.
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
;
; This script creates an installable FlightGear package for Win32 using the
@@ -7,9 +7,7 @@
;
; http://www.jrsoftware.org/isinfo.php
;
; Note: Files root path is defined in the FgHarnessPath (in InstallConfig.iss)
;
; For example if You want to use X: drive as a root path
; Note: the files must appear in the X: drive.
; You can do this with the command below:
;
; subst X: path_to_files
@@ -19,95 +17,183 @@
; C:\> subst X: F:\Path\to\FlightGear\root
; C:\> subst X: F:\
;
; TRANSLATION NOTE:
; - external i18n files HAVE to be UTF-8 with BOM encoded. Otherwise the installer can
; not detect correct file encoding
;
; InstallConfig.iss example content:
;
; #define FGHarnessPath "x:"
; #define FGVersion "2020.4.1"
; #define FGVersionGroup "2020.4"
; #define OSGVersion "3.0.0"
; #define OSGSoNumber "2"
; #define OTSoNumber "3"
; #define FGDetails "-nightly"
; #define IncludeData "FALSE"
;
; Uninstall procedure with --uninstall flag:
; executed by fgfs.exe (fg_init.cxx):
; - removes all under the FG_HOME directory
; - removes all from Download dir/Terrasync
; - removes all from Download dir/Aircraft
#include "InstallConfig.iss"
#include "FlightGear-i18n.iss"
#define FGSourcePath FgHarnessPath + "\flightgear"
#define InstallDir64 FgHarnessPath + "\install\msvc140-64"
#define InstallDir32 "X:\install\msvc140"
#define OSGInstallDir InstallDir32 + "\OpenSceneGraph"
#define OSGPluginsDir OSGInstallDir + "\bin\osgPlugins-" + OSGVersion
#define InstallDir64 "X:\install\msvc140-64"
#define OSG64InstallDir InstallDir64 + "\OpenSceneGraph"
#define OSG64PluginsDir OSG64InstallDir + "\bin\osgPlugins-" + OSGVersion
#define ThirdPartyDir FgHarnessPath + "\windows-3rd-party\msvc140"
#define ThirdPartyDir "X:\windows-3rd-party\msvc140"
; we copy everything in install/<arch>/bin except these, which aren't
; useful to the end-user to ship
#define ExcludedBinaries "*smooth.exe,metar.exe"
#include "FlightGear-files.iss"
#define ExcludedBinaries "*smooth.exe,metar.exe,js_demo.exe"
[Setup]
AppId=FlightGear_{#FGVersionGroup}
AppId=FlightGear
AppName=FlightGear
AppPublisher=The FlightGear Team
OutputBaseFilename=FlightGear-{#FGVersion}{#FGDetails}
AppVerName=FlightGear v{#FGVersion}
AppVersion={#FGVersion}
AppPublisherURL=http://www.flightgear.org
AppSupportURL=http://www.flightgear.org
AppUpdatesURL=http://www.flightgear.org
DefaultDirName={pf}\FlightGear {#FGVersionGroup}
DefaultDirName={pf}\FlightGear {#FGVersion}
UsePreviousAppDir=no
DefaultGroupName=FlightGear {#FGVersionGroup}
DefaultGroupName=FlightGear {#FGVersion}
UsePreviousGroup=no
LicenseFile={#FGSourcePath}\COPYING
LicenseFile=X:\flightgear\COPYING
Uninstallable=yes
SetupIconFile={#FgHarnessPath}\windows\flightgear.ico
SetupIconFile=X:\flightgear\package\flightgear.ico
VersionInfoVersion={#FGVersion}.0
WizardImageFile={#FgHarnessPath}\windows\setupimg.bmp
InfoBeforeFile=X:\flightgear\package\windows\infobefore.txt
WizardImageFile=X:\flightgear\package\windows\setupimg.bmp
WizardImageStretch=No
WizardSmallImageFile={#FgHarnessPath}\windows\setupsmall.bmp
WizardSmallImageFile=X:\flightgear\package\windows\setupsmall.bmp
VersionInfoCompany=The FlightGear Team
UninstallDisplayIcon={app}\bin\fgfs.exe
ArchitecturesInstallIn64BitMode=x64
ArchitecturesAllowed=x64
ArchitecturesAllowed=x86 x64
; Sign tool must be defined in the Inno Setup GUI, to avoid
; exposing the certificate password
; SignTool=fg_code_sign1
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:CreateDesktopIconGroup}"
; NOTE: The following entry contains English phrases ("Create a desktop icon" and "Additional icons"). You are free to translate them into another language if required.
Name: "desktopicon"; Description: "Create a &desktop icon"; GroupDescription: "Additional icons:"
[Languages]
Name: "en"; MessagesFile: "compiler:Default.isl"; InfoBeforeFile: "{#FgHarnessPath}\windows\info-before-en.txt"
Name: "pl"; MessagesFile: "compiler:Languages\Polish.isl"; InfoBeforeFile: "{#FgHarnessPath}\windows\info-before-pl.txt"
Name: "es"; MessagesFile: "compiler:Languages\Spanish.isl";
Name: "nl"; MessagesFile: "compiler:Languages\Dutch.isl";
Name: "de"; MessagesFile: "compiler:Languages\German.isl";
[Files]
; NOTE: run subst X: F:\ (or whatever path the expanded tree resides at)
;Source: "X:\*.txt"; DestDir: "{app}"; Flags: ignoreversion
; 32 bits install
Source: "{#InstallDir32}\bin\*.*"; DestDir: "{app}\bin"; Excludes: "{#ExcludedBinaries}"; Flags: ignoreversion recursesubdirs; Check: not Is64BitInstallMode
;locale only exists for fgrun - which has been disabled
;Source: "{#InstallDir32}\share\locale\*"; DestDir: "{app}\bin\locale"; Flags: ignoreversion recursesubdirs; Check: not Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty\bin\zlib.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty\bin\OpenAL32.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty\bin\libpng.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty\bin\libcurl.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty\bin\libintl-8.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty\bin\CrashRpt1403.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty\bin\crashrpt_lang.ini"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty\bin\CrashSender1403.exe"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
; 64 bits install
Source: "{#InstallDir64}\bin\*.*"; DestDir: "{app}\bin"; Excludes: "{#ExcludedBinaries}"; Flags: ignoreversion recursesubdirs; Check: Is64BitInstallMode
;locale only exists for fgrun - which has been disabled
;Source: "{#InstallDir64}\share\locale\*"; DestDir: "{app}\bin\locale"; Flags: ignoreversion recursesubdirs; Check: Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\zlib.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\OpenAL32.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\libpng.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\libcurl.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\libintl-8.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\CrashRpt1403.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\crashrpt_lang.ini"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#ThirdPartyDir}\3rdParty.x64\bin\CrashSender1403.exe"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
; Include the base package
#if IncludeData == "TRUE"
Source: "X:\fgdata\*.*"; DestDir: "{app}\data"; Flags: ignoreversion recursesubdirs skipifsourcedoesntexist
#endif
; 32 bits install
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osg.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgDB.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgGA.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgParticle.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgText.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgUtil.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgViewer.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgSim.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
Source: "{#OSGInstallDir}\bin\osg{#OSGSoNumber}-osgFX.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
Source: "{#OSGInstallDir}\bin\ot{#OTSoNumber}-OpenThreads.dll"; DestDir: "{app}\bin"; Check: not Is64BitInstallMode
Source: "{#OSGPluginsDir}\osgdb_ac.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
Source: "{#OSGPluginsDir}\osgdb_osg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
Source: "{#OSGPluginsDir}\osgdb_osga.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
Source: "{#OSGPluginsDir}\osgdb_3ds.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
Source: "{#OSGPluginsDir}\osgdb_mdl.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
Source: "{#OSGPluginsDir}\osgdb_jpeg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
Source: "{#OSGPluginsDir}\osgdb_rgb.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
Source: "{#OSGPluginsDir}\osgdb_png.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
Source: "{#OSGPluginsDir}\osgdb_dds.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
Source: "{#OSGPluginsDir}\osgdb_txf.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
Source: "{#OSGPluginsDir}\osgdb_tiff.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
Source: "{#OSGPluginsDir}\osgdb_freetype.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
;Source: "{#OSGPluginsDir}\osgdb_serializers_osg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
;Source: "{#OSGPluginsDir}\osgdb_serializers_osganimation.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
;Source: "{#OSGPluginsDir}\osgdb_serializers_osgfx.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
;Source: "{#OSGPluginsDir}\osgdb_serializers_osgmanipulator.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
;Source: "{#OSGPluginsDir}\osgdb_serializers_osgparticle.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
;Source: "{#OSGPluginsDir}\osgdb_serializers_osgshadow.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
;Source: "{#OSGPluginsDir}\osgdb_serializers_osgsim.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
;Source: "{#OSGPluginsDir}\osgdb_serializers_osgterrain.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
;Source: "{#OSGPluginsDir}\osgdb_serializers_osgtext.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
;Source: "{#OSGPluginsDir}\osgdb_serializers_osgvolume.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
;Source: "{#OSGPluginsDir}\osgdb_deprecated_osg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
;Source: "{#OSGPluginsDir}\osgdb_deprecated_osgparticle.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Check: not Is64BitInstallMode
; 64 bits install
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osg.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgDB.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgGA.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgParticle.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgText.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgUtil.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgViewer.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgSim.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#OSG64InstallDir}\bin\osg{#OSGSoNumber}-osgFX.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#OSG64InstallDir}\bin\ot{#OTSoNumber}-OpenThreads.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_ac.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_osg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_osga.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_3ds.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_mdl.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_jpeg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_rgb.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_png.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_dds.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_txf.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_tiff.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
Source: "{#OSG64PluginsDir}\osgdb_freetype.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
;Source: "{#OSG64PluginsDir}\osgdb_serializers_osg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
;Source: "{#OSG64PluginsDir}\osgdb_serializers_osganimation.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
;Source: "{#OSG64PluginsDir}\osgdb_serializers_osgfx.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
;Source: "{#OSG64PluginsDir}\osgdb_serializers_osgmanipulator.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
;Source: "{#OSG64PluginsDir}\osgdb_serializers_osgparticle.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
;Source: "{#OSG64PluginsDir}\osgdb_serializers_osgshadow.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
;Source: "{#OSG64PluginsDir}\osgdb_serializers_osgsim.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
;Source: "{#OSG64PluginsDir}\osgdb_serializers_osgterrain.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
;Source: "{#OSG64PluginsDir}\osgdb_serializers_osgtext.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
;Source: "{#OSG64PluginsDir}\osgdb_serializers_osgvolume.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
;Source: "{#OSG64PluginsDir}\osgdb_deprecated_osg.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
;Source: "{#OSG64PluginsDir}\osgdb_deprecated_osgparticle.dll"; DestDir: "{app}\bin\osgPlugins-{#OSGVersion}"; Flags: skipifsourcedoesntexist; Check: Is64BitInstallMode
[Dirs]
; Make the user installable scenery directory
Name: "{%USERPROFILE}\FlightGear\Downloads"; Permissions: creatorowner-modify; Check: not DirExists(ExpandConstant('{%USERPROFILE}\FlightGear\Downloads'))
Name: "{%USERPROFILE}\FlightGear\Custom Aircraft"; Permissions: creatorowner-modify; Check: not DirExists(ExpandConstant('{%USERPROFILE}\FlightGear\Custom Aircraft'))
Name: "{%USERPROFILE}\FlightGear\Custom Scenery"; Permissions: creatorowner-modify; Check: not DirExists(ExpandConstant('{%USERPROFILE}\FlightGear\Custom Scenery'))
Name: "{userdocs}\FlightGear\Aircraft"; Permissions: everyone-modify; Check: not DirExists(ExpandConstant('{userdocs}\FlightGear\Aircraft'))
Name: "{userdocs}\FlightGear\TerraSync"; Permissions: everyone-modify; Check: not DirExists(ExpandConstant('{userdocs}\FlightGear\TerraSync'))
Name: "{userdocs}\FlightGear\Custom Scenery"; Permissions: everyone-modify; Check: not DirExists(ExpandConstant('{userdocs}\FlightGear\Custom Scenery'))
[Icons]
Name: "{userdesktop}\FlightGear {#FGVersionGroup}"; Filename: "{app}\bin\fgfs.exe"; Parameters: "--launcher"; WorkingDir: "{app}\bin"; Tasks: desktopicon;
Name: "{group}\FlightGear {#FGVersionGroup}"; Filename: "{app}\bin\fgfs.exe"; Parameters: "--launcher"; WorkingDir: "{app}\bin";
Name: "{userdesktop}\FlightGear {#FGVersion}"; Filename: "{app}\bin\fgfs.exe"; Parameters: "--launcher"; WorkingDir: "{app}\bin"; Tasks: desktopicon;
Name: "{group}\FlightGear"; Filename: "{app}\bin\fgfs.exe"; Parameters: "--launcher"; WorkingDir: "{app}\bin";
Name: "{group}\FlightGear Manual"; Filename: "{app}\data\Docs\getstart.pdf"
Name: "{group}\FlightGear Documentation"; Filename: "{app}\data\Docs\index.html"
Name: "{group}\Flightgear Wiki"; Filename: "http://wiki.flightgear.org"
Name: "{group}\Tools\Uninstall FlightGear {#FGVersion}"; Filename: "{uninstallexe}"
Name: "{group}\Tools\Uninstall FlightGear"; Filename: "{uninstallexe}"
Name: "{group}\Tools\fgjs"; Filename: "cmd"; Parameters: "/k fgjs.exe ""--fg-root={app}\data"""; WorkingDir: "{app}\bin"
Name: "{group}\Tools\yasim"; Filename: "cmd"; Parameters: "/k ""{app}\bin\yasim.exe"" -h"; WorkingDir: "{app}\bin"
Name: "{group}\Tools\fgpanel"; Filename: "cmd"; Parameters: "/k ""{app}\bin\fgpanel.exe"" -h"; WorkingDir: "{app}\bin"
@@ -242,6 +328,8 @@ var
procedure InitializeUninstallProgressForm();
begin
UninstallProgressForm
UninstallCheckCleanPage := TNewNotebookPage.Create(UninstallProgressForm);
UninstallCheckCleanPage.Notebook := UninstallProgressForm.InnerNotebook;
UninstallCheckCleanPage.Parent := UninstallProgressForm.InnerNotebook;
@@ -249,7 +337,7 @@ begin
DoCleanCheckbox := TNewCheckBox.Create(UninstallProgressForm);
DoCleanCheckbox.Parent := UninstallCheckCleanPage;
DoCleanCheckbox.Caption := ExpandConstant('{cm:RemoveAllSettings}');
DoCleanCheckbox.Caption := 'Remove all settings, downloaded scenery and aircraft';
DoCleanCheckbox.Left := ScaleX(10);
DoCleanCheckbox.Top := ScaleY(10);
@@ -264,7 +352,9 @@ begin
CleanHelp.Height := CleanHelp.AdjustHeight();
CleanHelp.WordWrap := True;
CleanHelp.Caption := ExpandConstant('{cm:RemoveAllSettingsDescription}');
CleanHelp.Caption := 'FlightGear stores some settings in your user folder. In addition, ' +
'scenery or aircraft data may have been downloaded to the download directory. ' +
'To completely remove all these files, select this option.';
UninstallProgressForm.InnerNotebook.ActivePage := UninstallCheckCleanPage;
@@ -299,10 +389,10 @@ begin
if (Version.Major >= 6) then
begin
{ IN and OUT rules must be specified separately, otherwise the firewall will create only the IN rule }
AddAdvancedFirewallException('FlightGear', ExpandConstant('{cm:FirewallFgException}'), ExpandConstant('{app}') + '\bin\fgfs.exe', NET_FW_IP_PROTOCOL_ALL, '', '', NET_FW_RULE_DIR_IN);
AddAdvancedFirewallException('FlightGear', ExpandConstant('{cm:FirewallFgException}'), ExpandConstant('{app}') + '\bin\fgfs.exe', NET_FW_IP_PROTOCOL_ALL, '', '', NET_FW_RULE_DIR_OUT);
AddAdvancedFirewallException('FlightGear FGCom', ExpandConstant('{cm:FirewallFgcomException}'), ExpandConstant('{app}') + '\bin\fgcom.exe', NET_FW_IP_PROTOCOL_ALL, '', '', NET_FW_RULE_DIR_IN);
AddAdvancedFirewallException('FlightGear FGCom', ExpandConstant('{cm:FirewallFgcomException}'), ExpandConstant('{app}') + '\bin\fgcom.exe', NET_FW_IP_PROTOCOL_ALL, '', '', NET_FW_RULE_DIR_OUT);
AddAdvancedFirewallException('FlightGear', 'Allows FlightGear to send and receive data over the multiplayer network and to get METARs.', ExpandConstant('{app}') + '\bin\fgfs.exe', NET_FW_IP_PROTOCOL_ALL, '', '', NET_FW_RULE_DIR_IN);
AddAdvancedFirewallException('FlightGear', 'Allows FlightGear to send and receive data over the multiplayer network and to get METARs.', ExpandConstant('{app}') + '\bin\fgfs.exe', NET_FW_IP_PROTOCOL_ALL, '', '', NET_FW_RULE_DIR_OUT);
AddAdvancedFirewallException('FlightGear FGCom', 'Allows FGCom to establish a connection to FlightGear and the VoIP server for voice ATC communication.', ExpandConstant('{app}') + '\bin\fgcom.exe', NET_FW_IP_PROTOCOL_ALL, '', '', NET_FW_RULE_DIR_IN);
AddAdvancedFirewallException('FlightGear FGCom', 'Allows FGCom to establish a connection to FlightGear and the VoIP server for voice ATC communication.', ExpandConstant('{app}') + '\bin\fgcom.exe', NET_FW_IP_PROTOCOL_ALL, '', '', NET_FW_RULE_DIR_OUT);
end
else if (Version.Major = 5) and (((Version.Minor = 1) and (Version.ServicePackMajor >= 2)) or ((Version.Minor = 2) and (Version.ServicePackMajor >= 1))) then
begin

View File

@@ -15,7 +15,7 @@
<key>CFBundleExecutable</key>
<string>fgfs</string>
<key>CFBundleIdentifier</key>
<string><%= fgBundleIdentifier %></string>
<string>org.flightgear.FlightGear</string>
<key>CFBundleVersion</key>
<string><%= fgVersion %></string>
<key>CFBundleShortVersionString</key>

View File

@@ -1,123 +1,96 @@
# Nasa2FGearthview
A bash-script to convert NASA satellite images to ready-to-use
textures for FG's EarthView using ImageMagick and normalmap
textures for FG's EarthView using ImageMagick.
You can get "normalmap" there:
https://github.com/planrich/normalmap
For info about FGearthview, see the forum thread:\
For info about FGearthview, see the forum thread:
https://forum.flightgear.org/viewtopic.php?f=6&t=15754
or this FG-wiki-page:\
or this FG-wiki-page:
http://wiki.flightgear.org/Earthview
### Caution!
Don't use this script on a server! It will most likely cause
Denial-of-service (DoS). When working on these huge images, the
harddisk throughput will cease occasionally and CPU / RAM usage will
spike tremendously! So, only use this script on your home desktop
computer, or if you don't mind several long server-outages...
------------------------------------
## About:
About:
This script runs on Linux (maybe Mac also?) in a Bash
(Bourne Again Shell) - Windows is not supported (by the nature of the
script). Maybe it works on windows as well, I don't know, feel free
to try, and please let me know! :)
This will download the raw images from http://visibleearth.nasa.gov -
their server is not very fast, so I provide an alternative download
location: https://musicchris.de/download/FG/EarthView/raw-data-NASA.7z
This one is much quicker! If you really want the images directly from
NASA, then provide "nasa" to the script (see below)
In the end you will have 8 world-textures in .png and .dds format.
Generally .dds is better in performance, but it won't work on some
graphics cards. If this is the case for you, then try the .png files.
For further information see:\
For further information see:
http://wiki.flightgear.org/index.php?title=DDS_Textures_in_FlightGear&redirect=no
If you also converted the clouds and the height maps, then you'll also
find 8 cloud- and 8 height textures (as well as their conversion to
normal maps) in the format .png. Because the .dds-format has trouble
with rendering heavy alpha images, which is because of it's
compression algorythm [1], I think it's useless to also build faulty
files. However, this is not entirely true! It is possible to switch
off the .dds/DXT compression. But this results in huge files and is
rather heavy on the GPU's RAM.
If you also converted the clouds, then you'll also find 8 cloud-
textures in the format .png. Because the .dds-format has trouble with
rendering heavy alpha images, which is because of it's compression
algorythm [1], I think it's useless to also build faulty files.
However, this is not entirely true! It is possible to switch off the
.dds/DXT compression. But this results in huge files and is rather
heavy on the GPU's RAM.
Buckaroo has created a nice overview on dds-compression:
[1] http://www.buckarooshangar.com/flightgear/tut_dds.html
------------------------------------
## Installation and usage:
Installation and usage:
Simply copy "convert.sh" into a folder of your liking and run it:
```shell
./convert.sh
```
$ ./convert.sh
This will show a help text, since you didn't specify any target(s).
Possible targets are:
* world
* clouds
* heights
* all
Additionally, there are some options you could specify (further
explained below):
* 1k | 2k | 4k | 8k | 16k
* download | no-download
* world
* clouds
* heights
* nasa
* no-download
* cleanup
* rebuild
* check
So your call could look sth like this:
```shell
./convert.sh world download alt cleanup 8k
```
$ ./convert.sh world no-download cleanup 8k
------------------------------------
## Requirements:
Requirements:
WARNING!
This script uses a *lot* disk space! In my last test run, which
generated all maps in all resolutions, the disk usage was about 330GB!
Beware!\
Also, I wouldn't recommend doing this on a SSD! While SSDs are
generally faster, they also get more wear-and-tear when write such
huge files. So this script might cause your SSD to die earlier as it
should. Generally speaking, this won't kill your SSD, but it might
cause it to die earlier. HDDs are much more robust in that respect.
This script uses a *lot* disk space! Make sure you have at least 90GB
available!
Also, this script will run for a *very long* time! It might be best to
let it run over night - your computer might become unresponsive from
time to time, due to the heavy CPU and memory load, which tends to
occur, when converting 54000x27000 images. ;-)
I also recommend to deactivate swapping!
```shell
sudo swapoff -a
```
$ sudo swapoff -a
To reactivate swapping do:
```shell
$ sudo swapon -a
```
This script relies on wget, ImageMagick and, for converting the height
maps to normal maps, on "normalmap". Some of these programs are easily
installed by your systems package-management-system.\ (On
Debian/Ubuntu this is "apt-get").
This script relies on wget and imagemagick. Both are easily installed
by your systems package-management-system.
(On Debian/Ubuntu this is "apt-get")
So, on Debian for instance, you only need to put the following into
the console:
```shell
sudo apt-get install wget imagemagick
```
$ sudo apt-get install wget imagemagick
Depending on your distro, the package names might differ slightly! Use
a search engine of your choice to find out, how the packages are named
@@ -125,92 +98,70 @@ in your distro!
You may want to check:
```shell
apt search imagemagick
```
$ apt search imagemagick
### IMPORTANT!
Check out your ```/etc/ImageMagick-6/policy.xml```
On some distros, there are limits set, which will cause IM to abort
the conversion of images larger than
[rediculously small images](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=860763).
Edit and set to our needs:
* width: at least 55000
* height: at least 55000
* area: less than your free RAM
### Normalmap
For normalmap, you can download and compile it from
https://github.com/planrich/normalmap
You can install the binary into your system, or just copy it next to
convert.sh - both should work.
------------------------------------
## Targets:
Targets:
**world**\
Generates the world tiles, needed to run FG with EarthView.
You will find the results in output/[$resolution]/\*. Copy
these into $FGDATA/Models/Astro/\*. More about the installation
of these textures can be found here:
http://wiki.flightgear.org/Earthview#Customization
world
Generates the world tiles, needed to run FG with EarthView.
You will find the results in output/[$resolution]/*. Copy
these into $FGDATA/Models/Astro/*. More about the installation
of these textures can be found here:
http://wiki.flightgear.org/Earthview#Customization
**clouds**\
Generates the cloud tiles, needed to run FG with EarthView.
The locations are the same as the other textures mentioned
above. Note that clouds are only available with up to 8k
resolution, due to the available data at NASA.
clouds
Generates the cloud tiles, needed to run FG with EarthView.
The locations are the same as the other textures mentioned
above. Note that clouds are only available with up to 8k
resolution, due to the available data at NASA.
**heights**\
Generates the height tiles, which are then converted to the
normal maps needed to run FG with EarthView. The locations are
the same as the other textures mentioned above. Note that
heights are only available with up to 8k resolution, due to the
available data at NASA.
**all**\
Converts everything needed for a full-blown earthview texture
set. Does the same as:
```./convert.sh world clouds heights```
all
Converts everything needed for a full-blown earthview texture
set. Does the same as:
$ ./convert.sh world clouds
## Options:
Options:
**1k | 2k | 4k | 8k | 16k**\
Lets you specify a desired resolution of the textures.
Possible values are 1k, 2k, 4k, 8k and 16k. If nothing is
specified, the script will generate all of the resolutions.
16k is recommended only for earth textures, it will induce
oversampling from clouds and height maps.
1k | 2k | 4k | 8k | 16k
Lets you specify a desired resolution of the textures.
Possible values are 1k, 2k, 4k, 8k and 16k. If nothing is
specified, the script will generate all of the resolutions.
16k is only available for earth textures.
**download**\
Causes the script to download the needed data, this is the
default behavior (and can be omitted).
nasa
Causes the script to download directly from
http://visibleearth.nasa.gov . If omitted the script will
download from
https://musicchris.de/download/FG/EarthView/raw-data-NASA.7z
which is much faster!
Uses wget either way.
**no-download**\
Causes the script to skip the download function. If you
already have the source images, then you don't need to
re-download them. (About 2.4GB!)
If omitted, the script will download the source images from
the default location.
no-download
Causes the script to skip the download function. If you
already have the source images, then you don't need to
re-download them. (About 2.4GB!)
If omitted, the script will download the source images from
https://musicchris.de/download/FG/EarthView/raw-data-NASA.7z
**cleanup**\
Deletes the temporary files created during texture generation.
These can be found in tmp/
Note: if for some reason you later want some other resolution,
then it's good to have the data there. So only do this, when
you're quite sure that you're done.
Frees up a lot of disk-space! Which would have to be
regenerated if needed again.
cleanup
Deletes the temporary files created during texture generation.
These can be found in tmp/
Note: if for some reason you later want some other resolution,
then it's good to have the data there. So only do this, when
you're quite sure that you're done.
Frees up a lot of disk-space! Which would have to be
regenerated if needed again.
**rebuild**\
Deletes only the temporary files of the given target. So if
you call ```./convert.sh rebuild world``` the script will delete
all corresponding temp-files of the target world, which will
trigger a complete regeneration of the relevant (instead of
skipping existing files)
rebuild
Deletes only the temporary files of the given target. So if
you call './convert.sh rebuild world' the script will delete
all corresponding temp-files of the target world, which will
trigger a complete regeneration of the relevant (instead of
skipping existing files)
**check**\
Creates mosaics of the tiles, so you can look at them and see
if all went well.
check
Creates mosaics of the tiles, so you can look at them and see
if all went well.

File diff suppressed because it is too large Load Diff

View File

@@ -1,167 +0,0 @@
#!/bin/bash
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# builds Appimage on Centos 7 using linuxdeployqt from continuous build
# expects to work in $WORKSPACE, uses the contents of dist/{bin,share,lib64} copied into an appdir
# missing qt plugins are copied in manually, as are osgPlugins
# libcurl in SIMGEAR needs a setting to find the tls certificate, and OSG needs LD_LIBRARY_PATH so it can find osgPlugins
# currently not including FGDATA, but this could be done easily once FG is updated to change Nav database checks from path to some kind of checksum
#
# issues/errors:
# can't find qt translations - missing something in my build?
#
# errors/comments to enrogue@gmail.com
#clean up any previous build
rm -rf appdir
#create basic structure
mkdir -p appdir/usr/bin
mkdir -p appdir/usr/lib
mkdir -p appdir/usr/share
mkdir -p appdir/usr/qml
mkdir -p appdir/usr/ssl
#copy everything we need in
cp dist/bin/* appdir/usr/bin
cp -d dist/lib64/* appdir/usr/lib
# OSG 3.6 uses lib, not lib64
cp -d dist/lib/* appdir/usr/lib
cp -a dist/lib/osgPlugins-3.6.5 appdir/usr/lib
# adjust the rpath on the copied plugins, so they don't
# require LD_LIBRARY_PATH to be set to load their dependencies
# correctly
patchelf --set-rpath \$ORIGIN/../ appdir/usr/lib/osgPlugins-3.6.5/*.so
cp -r dist/share appdir/usr
# FIXME : only copy the QML plugins we actually need
#cp -a /usr/lib64/qt5/qml/QtQuick* appdir/usr/qml
#cp -a /usr/lib64/qt5/qml/QtQml* appdir/usr/qml
cp /usr/lib64/libsoftokn3.* appdir/usr/lib
cp /usr/lib64/libnsspem.so appdir/usr/lib
cp /usr/lib64/libfreebl* appdir/usr/lib
cp -a /usr/lib64/liblzma* appdir/usr/lib
cp /etc/pki/tls/certs/ca-bundle.crt appdir/usr/ssl/cacert.pem
# HarfBuzz is in /lib64 on CentOS, but still copy it: see
# https://sourceforge.net/p/flightgear/codetickets/2590/
cp -a /lib64/libharfbuzz.so* appdir/usr/lib
# as we are copying over libharfbuzz we need the older libfontconfig,
# libfreetype & libpng15 as 2.11 breaks compatibility: see
# https://sourceforge.net/p/flightgear/codetickets/2651/
cp -a /usr/lib64/libfontconfig.so* appdir/usr/lib
cp -a /usr/lib64/libfreetype.so* appdir/usr/lib
cp -a /usr/lib64/libpng15.so* appdir/usr/lib
patchelf --set-rpath \$ORIGIN appdir/usr/lib/libfontconfig.so*
patchelf --set-rpath \$ORIGIN appdir/usr/lib/libfreetype.so*
patchelf --set-rpath \$ORIGIN appdir/usr/lib/libharfbuzz.so*
#modify the desktop file so that linuxdeployqt doesn't barf (version to 1.0, add semicolon to end of certain line types)
sed -i 's/^Categor.*/&;/ ; s/^Keyword.*/&;/ ; s/1\.1/1\.0/' appdir/usr/share/applications/org.flightgear.FlightGear.desktop
#generate AppRun script
cat << 'EOF' > appdir/AppRun
#!/bin/bash
HERE="$(dirname "$(readlink -f "${0}")")"
BIN_DIR="${HERE}/usr/bin"
EXEC_OPT="--exec-app"
export SIMGEAR_TLS_CERT_PATH=$HERE/usr/ssl/cacert.pem
export OSG_LIBRARY_PATH=${HERE}/usr/lib
export LD_LIBRARY_PATH=${HERE}/usr/lib
# Run launcher directly if no parameters are passed
if [[ "$#" -eq "0" ]]; then
echo "Started with no arguments; assuming --launcher"
exec "${HERE}/usr/bin/fgfs" --launcher
exit "$?"
fi
# Check for special argument "--exec-app=" and execute selected application
if [[ "$1" == ${EXEC_OPT}=* ]] || [[ "$1" == "${EXEC_OPT}" ]]; then
OPT_VAL="${1#*=}"
APP_PATH="${BIN_DIR}/${OPT_VAL}"
# Call without arguments
if [[ "$1" == "${EXEC_OPT}" ]] || [[ -z "${OPT_VAL}" ]]; then
ERROR="1"
# Make sure executable name does not contain any "/"
elif [[ "${OPT_VAL}" == */* ]]; then
echo "Error: path separator \"/\" was used in application name!"
ERROR="1"
# Check if resulting file exists and is executable
elif [[ -z "$(find "${APP_PATH}" -type f \( \( -perm -00005 -a ! -user "$(id -u)" -a ! -group "$(id -g)" \) -o \( -perm -00500 -a -user "$(id -u)" \) -o \( -perm -00050 -a -group "$(id -g)" \) \) 2>/dev/null)" ]]; then
echo "Error: \"${OPT_VAL}\" is not a valid application name or cannot be executed by current user!"
ERROR="1"
fi
# In case of error or no arguments show help
if [[ ! -z "${ERROR}" ]]; then
# Determine AppImage's filename
IMAGE_FILE_NAME="$(basename "${APPIMAGE}" 2>/dev/null)"
if [[ -z "${IMAGE_FILE_NAME}" ]]; then
IMAGE_FILE_NAME="FlightGear.AppImage"
fi
# Print help
echo "Usage: ./${IMAGE_FILE_NAME} ${EXEC_OPT}=<application>"
echo "Pass ${EXEC_OPT} as first positional argument."
echo "Additional arguments are passed to the called application."
echo "Valid values for <application> are:"
while IFS= read -r -d $'\0' bin_exe; do
echo " $(basename "${bin_exe}")"
done < <( find "${BIN_DIR}/" -maxdepth 1 -type f \( \( -perm -00005 -a ! -user "$(id -u)" -a ! -group "$(id -g)" \) -o \( -perm -00500 -a -user "$(id -u)" \) -o \( -perm -00050 -a -group "$(id -g)" \) \) -exec printf "%s\0" "{}" \; )
# We have to use these odd find conditions since "find -executable" also lists non-executables when AppImage is executed. The reason is most likely the way it is mounted.
exit 1
fi
# Execute selected application and pass remaining parameters
# "pop" the first argument
shift
exec "${APP_PATH}" "$@"
else
exec "${HERE}/usr/bin/fgfs" "$@"
fi
EOF
chmod +x appdir/AppRun
#grab continuous linuxdeployqt
wget -c https://github.com/probonopd/linuxdeployqt/releases/download/7/linuxdeployqt-7-x86_64.AppImage
#wget -c https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage
chmod +x linuxdeployqt-7-x86_64.AppImage
#set VERSION for AppImage creation
export VERSION=`cat flightgear/flightgear-version`
# Add all executable binaries as additional binaries to AppImage and use special quoted array expansion
ADDITIONAL_EXES=()
while IFS= read -r -d $'\0' bin_exe; do
ADDITIONAL_EXES+=("-executable=${bin_exe}")
done < <( find "appdir/usr/bin/" -maxdepth 1 -type f \( \( -perm -00500 -o -perm -00050 -o -perm -00005 \) -a ! -name "fgfs" \) -exec printf "%s\0" "{}" \; )
# This find statement filters for all files with at least one executability bit set
./linuxdeployqt-7-x86_64.AppImage appdir/usr/share/applications/org.flightgear.FlightGear.desktop -appimage -qmldir=flightgear/src/GUI/qml/ "${ADDITIONAL_EXES[@]}"

View File

@@ -5,7 +5,7 @@ if [ "$WORKSPACE" == "" ]; then
exit 1
fi
VERSION=`cat flightgear/flightgear-version`
VERSION=`cat flightgear/version`
#####################################################################################
# ensure fgrcc can run when linked against libSimGearCore, for example
@@ -22,38 +22,44 @@ rm -rf output/*
#####################################################################################
echo "Starting on SimGear"
cd sgBuild
cmake -G Ninja -DCMAKE_INSTALL_PREFIX:PATH=$WORKSPACE/dist -DENABLE_DNS:BOOL="ON" -DSIMGEAR_SHARED:BOOL="ON" -DCMAKE_BUILD_TYPE=RelWithDebInfo ../simgear
cmake -DCMAKE_INSTALL_PREFIX:PATH=$WORKSPACE/dist -DENABLE_DNS:BOOL="ON" -DSIMGEAR_SHARED:BOOL="ON" ../simgear
# compile
ninja
make
if [ $? -ne '0' ]; then
echo "make simgear failed"
exit 1
fi
ninja install
make install
# build source package and copy to output
ninja package_source
make package_source
cp simgear-*.tar.bz2 ../output/.
#####################################################################################
echo "Starting on FlightGear"
cd ../fgBuild
cmake -G Ninja -DCMAKE_INSTALL_PREFIX:PATH=$WORKSPACE/dist -DSIMGEAR_SHARED:BOOL="ON" -DENABLE_SWIFT:BOOL=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DFG_BUILD_TYPE=Release ../flightgear
cmake -DCMAKE_INSTALL_PREFIX:PATH=$WORKSPACE/dist -DSIMGEAR_SHARED:BOOL="ON" -DFG_BUILD_TYPE=Release ../flightgear
# compile
ninja
make
if [ $? -ne '0' ]; then
echo "make flightgear failed"
exit 1
fi
ninja install
make install
# build source package and copy to output
ninja package_source
make package_source
cp flightgear-*.tar.bz2 ../output/.
#####################################################################################
echo "Assembling base package"
cd $WORKSPACE
tar cjf output/FlightGear-$VERSION-data.tar.bz2 fgdata/

View File

@@ -14,42 +14,63 @@ REM SET QT5SDK32=C:\Qt\5.6\msvc2015
REM SET QT5SDK64=C:\Qt\5.6\msvc2015_64
REM SET IS_NIGHTLY_BUILD=1
SET OSG32=%WORKSPACE%\install\msvc140\OpenSceneGraph
SET OSG64=%WORKSPACE%\install\msvc140-64\OpenSceneGraph
SET VSGEN="Visual Studio 16 2019"
REM 32bits
md build-sg32
md build-fg32
cd build-sg32
cmake ..\simgear -G "Visual Studio 14" ^
-DMSVC_3RDPARTY_ROOT=%WORKSPACE%/windows-3rd-party/msvc140 ^
-DBOOST_ROOT=%WORKSPACE%/windows-3rd-party ^
-DOSG_FSTREAM_EXPORT_FIXED=1 ^
-DCMAKE_PREFIX_PATH:PATH=%OSG32% ^
-DCMAKE_INSTALL_PREFIX:PATH=%WORKSPACE%/install/msvc140
cmake --build . --config RelWithDebInfo --target INSTALL
cd ..\build-fg32
cmake ..\flightgear -G "Visual Studio 14" ^
-DMSVC_3RDPARTY_ROOT=%WORKSPACE%/windows-3rd-party/msvc140 ^
-DCMAKE_INSTALL_PREFIX:PATH=%WORKSPACE%/install/msvc140 ^
-DCMAKE_PREFIX_PATH:PATH=%WORKSPACE%/install/msvc140/OpenSceneGraph ^
-DBOOST_ROOT=%WORKSPACE%/windows-3rd-party ^
-DOSG_FSTREAM_EXPORT_FIXED=1 ^
-DCMAKE_PREFIX_PATH=%QT5SDK32%;%OSG32% ^
-DFG_BUILD_TYPE=%FGBUILDTYPE%
cmake --build . --config RelWithDebInfo --target INSTALL
cd ..
REM 64 bits
md build-sg64
md build-fg64
cd build-sg64
cmake ..\SimGear -G %VSGEN% -A x64 ^
cmake ..\SimGear -G "Visual Studio 14 Win64" ^
-DMSVC_3RDPARTY_ROOT=%WORKSPACE%/windows-3rd-party/msvc140 ^
-DBOOST_ROOT=%WORKSPACE%/windows-3rd-party ^
-DOSG_FSTREAM_EXPORT_FIXED=1 ^
-DCMAKE_PREFIX_PATH:PATH=%OSG64% ^
-DCMAKE_INSTALL_PREFIX:PATH=%WORKSPACE%/install/msvc140-64
cmake --build . --config RelWithDebInfo --target INSTALL
cd ..\build-fg64
cmake ..\flightgear -G %VSGEN% -A x64 ^
cmake ..\flightgear -G "Visual Studio 14 Win64" ^
-DMSVC_3RDPARTY_ROOT=%WORKSPACE%/windows-3rd-party/msvc140 ^
-DBOOST_ROOT=%WORKSPACE%/windows-3rd-party ^
-DCMAKE_INSTALL_PREFIX:PATH=%WORKSPACE%/install/msvc140-64 ^
-DCMAKE_PREFIX_PATH=%QT5SDK64%;%OSG64% ^
-DOSG_FSTREAM_EXPORT_FIXED=1 ^
-DFG_BUILD_TYPE=%FGBUILDTYPE% ^
-DENABLE_SWIFT:BOOL=ON
-DFG_BUILD_TYPE=%FGBUILDTYPE%
cmake --build . --config RelWithDebInfo --target INSTALL
cd ..
REM Qt5 deployment
SET QMLDIR=%WORKSPACE%/flightgear/src/GUI/qml
REM Don't copy the compiler runtime libs, since it includes potentially older UCrtbase.
%QT5SDK64%\bin\windeployqt --release --no-compiler-runtime --qmldir %QMLDIR% %WORKSPACE%/install/msvc140-64/bin/fgfs.exe
%QT5SDK32%\bin\windeployqt --release --list target --qmldir %QMLDIR% %WORKSPACE%/install/msvc140/bin/fgfs.exe
%QT5SDK64%\bin\windeployqt --release --list target --qmldir %QMLDIR% %WORKSPACE%/install/msvc140-64/bin/fgfs.exe
REM build setup
ECHO Packaging root is %WORKSPACE%
@@ -60,31 +81,26 @@ subst X: %WORKSPACE%.
REM ensure output dir is clean since we upload the entirety of it
rmdir /S /Q output
SET CRASHFIX_UPLOAD_URL=http://crashes.flightgear.org/index.php/debugInfo/uploadExternal
SET FGFS_PDB=src\Main\RelWithDebInfo\fgfs.pdb
ECHO Uploading PDB files to %CRASHFIX_UPLOAD_URL%
upload -v -u %CRASHFIX_UPLOAD_URL% FlightGear %WORKSPACE%\build-fg32\%FGFS_PDB% %WORKSPACE%\build-fg64\%FGFS_PDB%
SET SENTRY_ORG=flightgear
SET SENTRY_PROJECT=flightgear
REM ensure SENTRY_AUTH_TOKEN is set in the environment
sentry-cli upload-dif --include-sources %WORKSPACE%\build-fg64\%FGFS_PDB%
REM also save the PDB to Output\ so they get uploaded
copy %WORKSPACE%\build-fg64\%FGFS_PDB% %WORKSPACE%\Output\fgfs_64.pdb
copy %WORKSPACE%\build-fg32\%FGFS_PDB% %WORKSPACE%\Output\fgfs_32.pdb
REM indirect way to get command output into an environment variable
set PATH=%OSG64%\bin;%PATH%
set PATH=%OSG32%\bin;%PATH%
osgversion --so-number > %TEMP%\osg-so-number.txt
osgversion --version-number > %TEMP%\osg-version.txt
osgversion --openthreads-soversion-number > %TEMP%\openthreads-so-number.txt
SET /P FLIGHTGEAR_VERSION=<flightgear\flightgear-version
SET /P FLIGHTGEAR_VERSION=<flightgear\version
SET /P OSG_VERSION=<%TEMP%\osg-version.txt
SET /P OSG_SO_NUMBER=<%TEMP%\osg-so-number.txt
SET /P OT_SO_NUMBER=<%TEMP%\openthreads-so-number.txt
for /F "tokens=1,2,3 delims=." %%a in ("%FLIGHTGEAR_VERSION%") do (
set FLIGHTGEAR_VERSION_MAJOR=%%a
set FLIGHTGEAR_VERSION_MINOR=%%b
set FLIGHTGEAR_VERSION_PATCH=%%c
)
IF %IS_NIGHTLY_BUILD% EQU 1 (
REM FlightGear nightly: with fgdata, output filename would be "FlightGear-x.x.x-nightly-full.exe"
CALL :writeBaseConfig
@@ -104,9 +120,7 @@ IF %IS_NIGHTLY_BUILD% EQU 1 (
GOTO End
:writeBaseConfig
ECHO #define FGHarnessPath "x:" > InstallConfig.iss
ECHO #define FGVersion "%FLIGHTGEAR_VERSION%" >> InstallConfig.iss
ECHO #define FGVersionGroup "%FLIGHTGEAR_VERSION_MAJOR%.%FLIGHTGEAR_VERSION_MINOR%" >> InstallConfig.iss
ECHO #define FGVersion "%FLIGHTGEAR_VERSION%" > InstallConfig.iss
ECHO #define OSGVersion "%OSG_VERSION%" >> InstallConfig.iss
ECHO #define OSGSoNumber "%OSG_SO_NUMBER%" >> InstallConfig.iss
ECHO #define OTSoNumber "%OT_SO_NUMBER%" >> InstallConfig.iss

View File

@@ -1,66 +0,0 @@
Introduction
============
This is the directory containing the script for updating aircraft, or other
craft, catalogs. It will create the `catalog.xml` file used to add a hangar to
FlightGear, as well as the zip archives of each craft in the hangar and the
md5sums, thumbnails, and previews of these. It consists of the script:
* update-catalog.py
It uses Python modules located under `python3-flightgear/flightgear/meta/`:
* aircraft_catalogs/catalog.py
* aircraft_catalogs/catalogTags.py
* sgprops.py
Usage
=====
The script can be run directly from this directory, or the script and its
modules can be copied together and run from any location. The steps to use
these are:
* Have something like `export PYTHONPATH="/path/to/fgmeta/python3-flightgear"`
in your shell setup or use a .pth file (see `python3-flightgear/README.md`
for more details).
* Create an output directory where the catalog and zip files will be located.
* Copy the configuration files `catalog.config.xml`, `template.xml`, and
`zip-excludes.lst` from one of the `*catalog*` example directories into the
output directory.
* Modify these files as required.
Then run the script with:
`$ $FGMETA/catalog/update-catalog.py dir`
where `dir` is the output directory. The script will create the following
files:
* `md5sum.xml`: A file containing checksums of all craft zip archives in the
base output directory.
* `ftp/catalog.xml`: The XML catalog to upload to a server and advertise to
FlightGear users.
* `ftp/*.zip`: The zip archives of each craft in the hangar.
* `ftp/previews/*_Splashs/`: A directory per craft containing the splash screen
graphics.
* `ftp/thumbnails/`: The collection of thumbnail graphics for the hangar.
The `ftp` directory is to be uploaded to a server which can be configured via
the `catalog.config.xml` file.
Examples
========
A number of example configuration files are located in this directory. These
include:
* `fgaddon-catalog/`: The configuration files used for the [official FGAddon
hangar](http://wiki.flightgear.org/FGAddon).
* `stable-2018-catalog/': The configuration files used for the 2018 long term
stability release.
* `single-craft-catalog-test/`: Configuration files used for testing the
catalog and zip archive creation for a single craft. These are for content
developers to test their craft.

View File

@@ -1,31 +1,18 @@
# -*- coding: utf-8 -*-
#!/usr/bin/python
import argparse
import datetime
from fnmatch import fnmatch, translate
import lxml.etree as ET
import xml.etree.cElementTree as ET
import os
from os.path import exists, join, relpath
from os import F_OK, access, walk
import re
import sgprops
import sys
import zipfile
from flightgear.meta import sgprops, strutils
from . import catalogTags
import catalogTags
CATALOG_VERSION = 4
quiet = False
verbose = False
# The Python version.
PY_VERSION = sys.version_info[0]
# Python 2 and 3 compatibility.
if PY_VERSION == 3:
long = int
def warning(msg):
if not quiet:
print(msg)
@@ -113,13 +100,9 @@ def scan_set_file(aircraft_dir, set_file, includes):
if sim_node.hasChild('minimum-fg-version'):
variant['minimum-fg-version'] = sim_node.getValue('minimum-fg-version', None)
if sim_node.hasChild('localized'):
variant['localized'] = extract_localized_strings(sim_node.getChild('localized'))
#print(" %s" % variant)
#print ' ', variant
return variant
def extract_previews(previews_node, aircraft_dir):
result = []
for node in previews_node.getChildren("preview"):
@@ -135,7 +118,6 @@ def extract_previews(previews_node, aircraft_dir):
return result
def extract_tags(tags_node, set_path):
result = []
for node in tags_node.getChildren("tag"):
@@ -147,28 +129,6 @@ def extract_tags(tags_node, set_path):
return result
def extract_localized_strings(localized_node):
result = {}
# iterate langauges below <localized>
for lang in localized_node.getChildren():
strings = {}
# iterate strings below <de> etc
for s in lang.getChildren():
# fix up the name/description confusion here
if s.name == 'description':
strings['name'] = strutils.simplify(s.value)
elif s.name == 'long-description':
strings['description'] = strutils.simplify(s.value)
else:
strings[s.name] = strutils.simplify(s.value)
if strings:
result[lang.name] = strings
return result
# scan all the -set.xml files in an aircraft directory. Returns a
# package dict and a list of variants.
def scan_aircraft_dir(aircraft_dir, includes):
@@ -179,13 +139,13 @@ def scan_aircraft_dir(aircraft_dir, includes):
files = os.listdir(aircraft_dir)
for file in sorted(files, key=lambda s: s.lower()):
if file.endswith('-set.xml'):
# print('trying: %s' % file)
# print 'trying:', file
try:
d = scan_set_file(aircraft_dir, file, includes)
if d == None:
continue
except:
print("Skipping set file since couldn't be parsed: %s %s" % os.path.join(aircraft_dir, file), sys.exc_info()[0])
print "Skipping set file since couldn't be parsed:", os.path.join(aircraft_dir, file), sys.exc_info()[0]
continue
setDicts.append(d)
@@ -195,13 +155,13 @@ def scan_aircraft_dir(aircraft_dir, includes):
elif d['variant-of'] == None:
primaryAircraft.append(d)
# print(setDicts)
# print setDicts
if len(setDicts) == 0:
return None, None
# use the first one
if len(primaryAircraft) == 0:
print("Aircraft has no primary aircraft at all: %s" % aircraft_dir)
print "Aircraft has no primary aircraft at all:", aircraft_dir
primaryAircraft = [setDicts[0]]
package = primaryAircraft[0]
@@ -226,7 +186,6 @@ def make_xml_leaf(name, text):
leaf.text = ''
return leaf
def append_preview_nodes(node, variant, download_base, package_name):
if not 'previews' in variant:
return
@@ -239,7 +198,6 @@ def append_preview_nodes(node, variant, download_base, package_name):
preview_node.append( make_xml_leaf('path', preview['path']) )
node.append(preview_node)
def append_tag_nodes(node, variant):
if not 'tags' in variant:
return
@@ -247,7 +205,6 @@ def append_tag_nodes(node, variant):
for tag in variant['tags']:
node.append(make_xml_leaf('tag', tag))
def append_author_nodes(node, info):
if 'authors' in info:
node.append(info['authors']._createXMLElement())
@@ -255,25 +212,9 @@ def append_author_nodes(node, info):
# traditional single author string
node.append( make_xml_leaf('author', info['author']) )
def append_localized_strings(node, variant):
if not 'localized' in variant:
return
localized_node = ET.Element('localized')
for lang, v in variant['localized'].items():
lang_node = ET.Element(lang)
for skey, s in v.items():
lang_node.append(make_xml_leaf(skey, s))
localized_node.append(lang_node)
node.append(localized_node)
def make_aircraft_node(aircraftDirName, package, variants, downloadBase, mirrors):
#print("package: %s" % package)
#print("variants: %s" % variants)
def make_aircraft_node(aircraftDirName, package, variants, downloadBase):
#print "package:", package
#print "variants:", variants
package_node = ET.Element('package')
package_node.append( make_xml_leaf('name', package['name']) )
package_node.append( make_xml_leaf('status', package['status']) )
@@ -317,19 +258,12 @@ def make_aircraft_node(aircraftDirName, package, variants, downloadBase, mirrors
append_preview_nodes(variant_node, variant, downloadBase, aircraftDirName)
append_tag_nodes(variant_node, variant)
append_author_nodes(variant_node, variant)
append_localized_strings(variant_node, variant)
package_node.append( make_xml_leaf('dir', aircraftDirName) )
# primary URL is first
download_url = downloadBase + aircraftDirName + '.zip'
package_node.append( make_xml_leaf('url', download_url) )
for m in mirrors:
mu = m + aircraftDirName + '.zip'
package_node.append( make_xml_leaf('url', mu) )
if 'thumbnail' in package:
thumbnail_url = downloadBase + 'thumbnails/' + aircraftDirName + '_' + package['thumbnail']
package_node.append( make_xml_leaf('thumbnail', thumbnail_url) )
@@ -337,7 +271,6 @@ def make_aircraft_node(aircraftDirName, package, variants, downloadBase, mirrors
append_preview_nodes(package_node, package, downloadBase, aircraftDirName)
append_tag_nodes(package_node, package)
append_localized_strings(package_node, package)
if 'maintainers' in package:
package_node.append(package['maintainers']._createXMLElement())
@@ -346,134 +279,3 @@ def make_aircraft_node(aircraftDirName, package, variants, downloadBase, mirrors
package_node.append(package['urls']._createXMLElement())
return package_node
def make_aircraft_zip(repo_path, craft_name, zip_file, global_zip_excludes, verbose=True):
"""Create a zip archive of the given aircraft."""
# Printout.
if verbose:
print("Zip file creation: %s.zip" % craft_name)
# Go to the directory of crafts to catalog.
savedir = os.getcwd()
os.chdir(repo_path)
# Clear out the old file.
if exists(zip_file):
os.remove(zip_file)
# Use the Python zipfile module to create the zip file.
zip_handle = zipfile.ZipFile(zip_file, 'w', zipfile.ZIP_DEFLATED)
# Find a per-craft exclude list.
craft_path = join(repo_path, craft_name)
exclude_file = join(craft_path, 'zip-excludes.lst')
if exists(exclude_file):
if verbose:
print("Found the craft specific exclusion list '%s'" % exclude_file)
# Otherwise use the catalog default exclusion list.
else:
exclude_file = global_zip_excludes
# Process the exclusion list and find all matching file names.
blacklist = fetch_zip_exclude_list(craft_name, craft_path, exclude_file)
# Walk over all craft files.
print_format = " %-30s '%s'"
for root, dirs, files in walk(craft_path):
# Loop over the files.
for file in files:
# The directory and relative and absolute paths.
dir = relpath(root, start=repo_path)
full_path = join(root, file)
rel_path = relpath(full_path, start=repo_path)
# Skip blacklist files or directories.
skip = False
if file == 'zip-excludes.lst':
if verbose:
print(print_format % ("Skipping the file:", join(dir, 'zip-excludes.lst')))
skip = True
if dir in blacklist:
if verbose:
print(print_format % ("Skipping the file:", join(dir, file)))
skip = True
for name in blacklist:
if fnmatch(rel_path, name):
if verbose:
print(print_format % ("Skipping the file:", rel_path))
skip = True
break
if skip:
continue
# Otherwise add the file.
zip_handle.write(rel_path)
# Clean up.
os.chdir(savedir)
zip_handle.close()
def fetch_zip_exclude_list(name, path, exclude_path):
"""Use Unix style path regular expression to find all files to exclude."""
# Init.
blacklist = []
file = open(exclude_path)
exclude_list = file.readlines()
file.close()
old_path = os.getcwd()
os.chdir(path)
# Process each exclusion path or regular expression, converting to Python RE objects.
reobj_list = []
for i in range(len(exclude_list)):
reobj_list.append(re.compile(translate(exclude_list[i].strip())))
# Recursively loop over all files, finding the ones to exclude.
for root, dirs, files in walk(path):
for file in files:
full_path = join(root, file)
rel_path = join(name, relpath(full_path, start=path))
# Skip Unix shell-style wildcard matches
for i in range(len(reobj_list)):
if reobj_list[i].match(rel_path):
blacklist.append(rel_path)
break
# Return to the original path.
os.chdir(old_path)
# Return the list.
return blacklist
def parse_config_file(parser=None, file_name=None):
"""Test and parse the catalog configuration file."""
# Check for the file.
if not access(file_name, F_OK):
print("CatalogError: The catalog configuration file '%s' cannot be found." % file_name)
sys.exit(1)
# Parse the XML and return the root node.
config = ET.parse(file_name, parser)
return config.getroot()
def parse_template_file(parser=None, file_name=None):
"""Test and parse the catalog configuration file."""
# Check for the file.
if not access(file_name, F_OK):
print("CatalogError: The catalog template file '%s' cannot be found." % file_name)
sys.exit(1)
# Parse the XML and return the template node.
template = ET.parse(file_name, parser)
template_root = template.getroot()
return template_root.find('template')

View File

@@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
aircraftTypeTags = [
"aerobatic",
"airship",
@@ -13,16 +11,12 @@ aircraftTypeTags = [
"glider",
"groundvehicle",
"helicopter",
"interceptor",
"passenger",
"racer",
"spaceship",
"tanker",
"trainer",
"transport",
"ultralight",
"unpowered",
"uav",
"reconnaissance",
"seacraft",
"crop-duster",
@@ -32,10 +26,8 @@ aircraftTypeTags = [
manufacturerTags = [
"airbus",
"antonov",
"arado",
"atr",
"avro",
"bae",
"bell",
"bleriot",
"boeing",
@@ -61,7 +53,6 @@ manufacturerTags = [
"heinkel",
"ilyushin",
"junkers",
"kawasaki",
"lockheed",
"mc-donnell-douglas",
"messerschmitt",
@@ -73,7 +64,6 @@ manufacturerTags = [
"piper",
"republic",
"robin",
"rockwell",
"saab",
"short",
"sopwith",
@@ -83,7 +73,6 @@ manufacturerTags = [
"tupolev",
"vickers",
"vought",
"wright",
"yakovlev"
]
@@ -116,7 +105,6 @@ featureTags = [
"biplane",
"canard",
"castering-wheel",
"combat",
"delta",
"etops",
"experimental",
@@ -124,14 +112,10 @@ featureTags = [
"fixed-gear",
"floats",
"glass-cockpit",
"low-wing",
"mid-wing",
"high-wing",
"h-tail",
"hud",
"ifr",
"lifting-body",
"pressurised",
"prototype",
"refuel",
"retractable-gear",
@@ -139,18 +123,15 @@ featureTags = [
"skis",
"stol",
"supersonic",
"supercharger",
"t-tail",
"tail-dragger",
"tricycle",
"tail-hook",
"triplane",
"twin-boom",
"v-tail",
"variable-geometry",
"vtol",
"wing-fold"
"water-drop"
]
propulsionTags = [
@@ -166,7 +147,6 @@ propulsionTags = [
"supercharged",
"turboprop",
"twin-engine",
"four-engine",
"variable-pitch",
"fixed-pitch"
]
@@ -178,8 +158,7 @@ simFeatureTags = [
"wildfire"
]
tags = (aircraftTypeTags + manufacturerTags + eraTags + simFeatureTags +
propulsionTags + featureTags)
tags = aircraftTypeTags + manufacturerTags + eraTags + simFeatureTags + propulsionTags + featureTags
def isValidTag(maybeTag):
return maybeTag in tags

View File

@@ -1,10 +1,8 @@
#! /usr/bin/env python3
#!/usr/bin/python
import argparse
import os
from flightgear.meta import sgprops
import sgprops
def check_meta_data(aircraft_dir, set_file, includes):
base_file = os.path.basename(set_file)
@@ -15,46 +13,44 @@ def check_meta_data(aircraft_dir, set_file, includes):
root_node = sgprops.readProps(set_path, includePaths = includes)
if not root_node.hasChild("sim"):
print("-set.xml has no <sim> node:", set_path)
print "-set.xml has no <sim> node:", set_path
return
sim_node = root_node.getChild("sim")
if not sim_node.hasChild('description'):
print("-set.xml missing <description>:", set_path)
print "-set.xml missing <description>:", set_path
if not sim_node.hasChild('long-description'):
print("-set.xml missing <long-description>:", set_path)
print "-set.xml missing <long-description>:", set_path
if not sim_node.hasChild('authors'):
print("-set.xml is missing structured <authors> data:", set_path)
print "-set.xml is missing structured <authors> data:", set_path
if not sim_node.hasChild('tags'):
print("-set.xml does not define any tags", set_path)
print "-set.xml does not define any tags", set_path
# check for non-standard tags
if not sim_node.hasChild('thumbnail'):
print("-set.xml does not define a thumbnail", set_path)
print "-set.xml does not define a thumbnail", set_path
# check thumbnail size and format
if not sim_node.hasChild('rating'):
print("-set.xml does not define any ratings", set_path)
print "-set.xml does not define any ratings", set_path
if not sim_node.hasChild('minimum-fg-version'):
print("-set.xml does not define a minimum FG version", set_path)
print "-set.xml does not define a minimum FG version", set_path
# check all the -set.xml files in an aircraft directory.
# check all the -set.xml files in an aircraft directory.
def check_aircraft_dir(d, includes):
if not os.path.isdir(d):
return
files = os.listdir(d)
for f in sorted(files, key=lambda s: s.lower()):
if f.endswith('-set.xml'):
check_meta_data(d, f, includes)
for file in sorted(files, key=lambda s: s.lower()):
if file.endswith('-set.xml'):
check_meta_data(d, file, includes)
parser = argparse.ArgumentParser()
parser.add_argument("--include", help="Include directory to validate -set.xml parsing",
@@ -64,7 +60,7 @@ args = parser.parse_args()
for d in args.dir:
if not os.path.isdir(d):
print("Skipping missing directory:", d)
print "Skipping missing directory:", d
names = os.listdir(d)
for name in sorted(names, key=lambda s: s.lower()):
@@ -74,3 +70,4 @@ for d in args.dir:
acftDir = os.path.join(d, name)
check_aircraft_dir(acftDir, args.include)

View File

@@ -1,33 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<PropertyList>
<local-output>/home/fgaddon/output/Aircraft-trunk</local-output>
<download-url n="0">http://mirrors.ibiblio.org/flightgear/ftp/Aircraft-trunk/</download-url>
<download-url n="1">http://ukmirror.flightgear.org/fgaddon/Aircraft-trunk/</download-url>
<download-url n="2">https://cdn.merspieler.tk/fgaddon/Aircraft-trunk/</download-url>
<thumbnail-url n="0">http://mirrors.ibiblio.org/flightgear/ftp/Aircraft-trunk/thumbnails</thumbnail-url>
<thumbnail-url n="1">http://ukmirror.flightgear.org/fgaddon/Aircraft-trunk/thumbnails</thumbnail-url>
<thumbnail-url n="2">https://cdn.merspieler.tk/fgaddon/Aircraft-trunk/thumbnails</thumbnail-url>
<scm>
<type>svn</type>
<path>/home/fgaddon/fgaddon-trunk/Aircraft</path>
<skip>NTPS</skip>
<skip>c172</skip>
<skip>tu134</skip>
</scm>
<include-dir>/home/fgaddon/fgdata</include-dir>
<include-dir>/home/fgaddon/fgaddon-trunk</include-dir>
<!-- <scm>
<type>git</type>
<update type="bool">false</update>
<path>/Users/jmt/FGFS/fgdata</path>
<url>git://git.code.sf.net/p/flightgear/fgdata</url>
</scm> -->
<upload n="0">
<enabled type="bool">true</enabled>
<type>rsync-ssh</type>
<remote>ibiblio:/public/mirrors/flightgear/ftp/Aircraft</remote>
</upload>
</PropertyList>

View File

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<PropertyList>
<template>
<!-- if we break trunk compat in a substantial way, consider removing these -->
<version n="2">2020.4.*</version>
<version n="3">2021.*</version>
<id>org.flightgear.fgaddon.trunk</id>
<license>GPL</license>
<url>http://mirrors.ibiblio.org/flightgear/ftp/Aircraft-trunk/catalog.xml</url>
<name>FlightGear aircraft distribution from fgaddon</name>
<description>This hangar provides aircraft officially supported and maintained by the FlightGear project,
under a free-software license. It tracks latest aircraft developments in the FGaddon repository.</description>
<!-- <de>
<description>Auf Deutsch</description>
</de>
<fr>
<description>En Francais</description>
</fr> -->
</template>
</PropertyList>

View File

@@ -1,11 +0,0 @@
*/.svn/*
*.xcf*
*.XCF*
*.blend*
*.psd
*~
*/dev/*
*/Dev/*
*/development/*
*/src/*
*/Resources/*

View File

@@ -1,11 +1,5 @@
*/.svn/*
*.xcf*
*.XCF*
*.blend*
*.xcf
*.blend
*.psd
*~
*/dev/*
*/Dev/*
*/development/*
*/src/*
*/Resources/*

View File

@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<PropertyList>
<local-output>/home/fgaddon/output/Aircraft</local-output>
<download-url n="0">http://mirrors.ibiblio.org/flightgear/ftp/Aircraft/</download-url>
<download-url n="1">http://ukmirror.flightgear.org/fgaddon/Aircraft/</download-url>
<thumbnail-url n="0">http://mirrors.ibiblio.org/flightgear/ftp/Aircraft/thumbnails</thumbnail-url>
<thumbnail-url n="1">http://ukmirror.flightgear.org/fgaddon/Aircraft/thumbnails</thumbnail-url>
<scm>
<type>svn</type>
<path>/home/fgaddon/fgaddon-legacy/Aircraft</path>
<skip>NTPS</skip>
<skip>c172</skip>
<skip>tu134</skip>
</scm>
<include-dir>/home/fgaddon/fgdata-legacy</include-dir>
<include-dir>/home/fgaddon/fgaddon-legacy</include-dir>
<upload n="0">
<enabled type="bool">true</enabled>
<type>rsync-ssh</type>
<remote>ibiblio:/public/mirrors/flightgear/ftp/Aircraft-legacy</remote>
</upload>
</PropertyList>

View File

@@ -1,38 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<PropertyList>
<template>
<version n="0">3.4.*</version>
<version n="1">3.5.*</version>
<version n="2">3.6.*</version>
<version n="3">3.7.*</version>
<version n="5">2016.*.*</version>
<version n="6">2017.*.*</version>
<version n="7">2018.*.*</version>
<!-- the legacy catalog has to have this ID, becuase this is what older FG
clients expect -->
<id>org.flightgear.fgaddon</id>
<license>GPL</license>
<url>http://mirrors.ibiblio.org/flightgear/ftp/Aircraft/catalog.xml</url>
<name>FlightGear aircraft(legacy support)</name>
<description>This hangar provides aircraft officially supported and maintained by the
FlightGear project, under a free-software license. Aircraft are intended for
use with FlightGear versions 2018.2 and older.</description>
<!-- <alternate-version>
<version>2019.*</version>
<version>2018.4.*</version>
<url>http://mirrors.ibiblio.org/flightgear/ftp/Aircraft-trunk/catalog.xml</url>
<id>org.flightgear.fgaddon.trunk</id>
</alternate-version>
<alternate-version>
<version>2018.3.*</version>
<url>http://mirrors.ibiblio.org/flightgear/ftp/Aircraft-2018/catalog.xml</url>
<id>org.flightgear.fgaddon.stable_2018</id>
</alternate-version>
-->
</template>
</PropertyList>

View File

@@ -1,5 +0,0 @@
*/.svn/*
*.xcf
*.blend
*.psd
*~

View File

@@ -2,8 +2,7 @@
from xml.sax import make_parser, handler, expatreader
# ElementTree for writing
#import xml.etree.cElementTree as ET
import lxml.etree as ET
import xml.etree.cElementTree as ET
import re, os
@@ -119,7 +118,7 @@ class Node(object):
# value and type specification
try:
if self._value is not None:
if isinstance(self._value, str):
if isinstance(self._value, basestring):
# don't call str() on strings, breaks the
# encoding
n.text = self._value
@@ -133,9 +132,9 @@ class Node(object):
elif isinstance(self._value, bool):
n.set('type', "bool")
except UnicodeEncodeError:
print("Encoding error with %s %s" % (self._value, type(self._value)))
print "Encoding error with", self._value, type(self._value)
except:
print("Unexpected exception in sgprops._createXMLElement():", sys.exc_info()[0])
print "Some other exceptiong in sgprops._createXMLElement()"
# index in parent
if (self.index != 0):
@@ -194,7 +193,7 @@ class PropsHandler(handler.ContentHandler):
try:
index = int(attrs['n'])
except:
print("Invalid index at line: %s of %s" % (self._locator.getLineNumber(), self._path))
print "Invalid index at line:", self._locator.getLineNumber(), "of", self._path
raise IndexError("Invalid index at line:", self._locator.getLineNumber(), "of", self._path)
currentState.recordExplicitIndex(name, index)
@@ -251,7 +250,7 @@ class PropsHandler(handler.ContentHandler):
self._content = self._content[:-1]
self._current.value = float(self._content)
except:
print("Parse error for value: %s at line: %s of: %s" % (self._content, self._locator.getLineNumber(), self._path))
print "Parse error for value:", self._content, "at line:", self._locator.getLineNumber(), "of:", self._path
self._current = self._current.parent
self._content = None

View File

@@ -1,6 +0,0 @@
Configuration files for testing the catalog updating script on a single aircraft. This is useful for seeing what will be packed into the zip archive. To use these:
* Copy all *.xml and *.lst files into a local testing directory X.
* Modify the *.xml files:
* Replace all instances of '/data/fgaddon_catalog_p51d/' with the directory X.
* Update any other tags as necessary.

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--Template catalog - copy and modify for your site as required-->
<PropertyList>
<local-output>/data/fgaddon-catalog_p51d/ftp</local-output>
<download-url n="0">/data/fgaddon-catalog_p51d/ftp/Aircraft/</download-url>
<scm>
<type>svn</type>
<update type="bool">false</update>
<path>/flightgear/flightgear-fgaddon/Aircraft</path>
<include>p51d</include>
</scm>
</PropertyList>

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--Template catalog - copy and modify for your site as required-->
<PropertyList>
<template>
<version n="0">HEAD</version>
<id>localhost</id>
<license>GPL</license>
<url>/data/fgaddon-catalog_p51d/ftp/Aircraft/catalog.xml</url>
<name>p51d FGAddon aircraft test</name>
<description>This is a test of the catalog updating script to allow aircraft authors to see what will be present in the zip archive of their aircraft.</description>
</template>
</PropertyList>

View File

@@ -1,11 +0,0 @@
*/.svn/*
*.xcf*
*.XCF*
*.blend*
*.psd
*~
*/dev/*
*/Dev/*
*/development/*
*/src/*
*/Resources/*

View File

@@ -1,34 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--Template catalog - copy and modify for your site as required-->
<PropertyList>
<local-output>/home/fgaddon/output/Aircraft-2018</local-output>
<download-url n="0">http://mirrors.ibiblio.org/flightgear/ftp/Aircraft-2018/</download-url>
<download-url n="1">http://ukmirror.flightgear.org/fgaddon/Aircraft-2018/</download-url>
<download-url n="2">https://cdn.merspieler.tk/fgaddon/Aircraft-2018/</download-url>
<thumbnail-url n="0">http://mirrors.ibiblio.org/flightgear/ftp/Aircraft-2018/thumbnails</thumbnail-url>
<thumbnail-url n="1">http://ukmirror.flightgear.org/official/Aircraft-2018/thumbnails</thumbnail-url>
<thumbnail-url n="2">https://cdn.merspieler.tk/fgaddon/Aircraft-2018/thumbnails</thumbnail-url>
<!-- share zips with the trunk catalog where possible -->
<share-output>/home/fgaddon/output/Aircraft</share-output>
<share-md5-sums>/home/fgaddon/fgmeta/catalog/fgaddon-catalog-ukmirror/md5sum.xml</share-md5-sums>
<scm>
<type>svn</type>
<path>/home/fgaddon/fgaddon-release-2018.3/Aircraft</path>
<skip>NTPS</skip>
<skip>c172</skip>
<skip>tu134</skip>
</scm>
<include-dir>/home/fgaddon/fgdata-release_2018.3</include-dir>
<include-dir>/home/fgaddon/fgaddon-release-2018.3</include-dir>
<upload n="0">
<enabled type="bool">true</enabled>
<type>rsync-ssh</type>
<remote>ibiblio:/public/mirrors/flightgear/ftp/Aircraft-2018</remote>
</upload>
</PropertyList>

View File

@@ -1,21 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<PropertyList>
<template>
<version n="0">2018.*</version>
<id>org.flightgear.fgaddon.stable_2018</id>
<license>GPL</license>
<url>http://mirrors.ibiblio.org/flightgear/ftp/Aircraft-2018/catalog.xml</url>
<name>FlightGear aircraft distribution for 2018.x versions</name>
<description>This hangar provides aircraft officially supported and maintained
by the FlightGear project, under a free-software license. These aircraft
are compatible with FlightGear versions from 2018.</description>
<!-- migration to new stable catalog for 2020.3 release -->
<alternate-version>
<version>2020.3.*</version>
<id>org.flightgear.fgaddon.stable_2020</id>
<url>http://mirrors.ibiblio.org/flightgear/ftp/Aircraft-2020/catalog.xml</url>
</alternate-version>
</template>
</PropertyList>

View File

@@ -1,5 +0,0 @@
*/.svn/*
*.xcf
*.blend
*.psd
*~

View File

@@ -1,34 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--Template catalog - copy and modify for your site as required-->
<PropertyList>
<local-output>/home/fgaddon/output/Aircraft-2020</local-output>
<download-url n="0">http://mirrors.ibiblio.org/flightgear/ftp/Aircraft-2020/</download-url>
<download-url n="1">http://ukmirror.flightgear.org/fgaddon/Aircraft-2020/</download-url>
<download-url n="2">https://cdn.merspieler.tk/fgaddon/Aircraft-2020/</download-url>
<thumbnail-url n="0">http://mirrors.ibiblio.org/flightgear/ftp/Aircraft-2020/thumbnails</thumbnail-url>
<thumbnail-url n="1">http://ukmirror.flightgear.org/official/Aircraft-2020/thumbnails</thumbnail-url>
<thumbnail-url n="2">https://cdn.merspieler.tk/fgaddon/Aircraft-2020/thumbnails</thumbnail-url>
<!-- share zips with the trunk catalog where possible -->
<share-output>/home/fgaddon/output/Aircraft</share-output>
<share-md5-sums>/home/fgaddon/fgmeta/catalog/fgaddon-catalog-ukmirror/md5sum.xml</share-md5-sums>
<scm>
<type>svn</type>
<path>/home/fgaddon/fgaddon-release-2020.3/Aircraft</path>
<skip>NTPS</skip>
<skip>c172</skip>
<skip>tu134</skip>
</scm>
<include-dir>/home/fgaddon/fgdata-release_2020.2</include-dir>
<include-dir>/home/fgaddon/fgaddon-release-2020.3</include-dir>
<upload n="0">
<enabled type="bool">true</enabled>
<type>rsync-ssh</type>
<remote>ibiblio:/public/mirrors/flightgear/ftp/Aircraft-2020</remote>
</upload>
</PropertyList>

View File

@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<PropertyList>
<template>
<version n="0">2020.3.*</version>
<id>org.flightgear.fgaddon.stable_2020</id>
<license>GPL</license>
<url>http://mirrors.ibiblio.org/flightgear/ftp/Aircraft-2020/catalog.xml</url>
<name>FlightGear aircraft distribution for 2020.x versions</name>
<description>This hangar provides aircraft officially supported and maintained
by the FlightGear project, under a free-software license. These aircraft
are compatible with FlightGear versions from 2020.</description>
</template>
</PropertyList>

View File

@@ -1,5 +0,0 @@
*/.svn/*
*.xcf
*.blend
*.psd
*~

View File

@@ -7,17 +7,6 @@
<primary-set type="bool">true</primary-set>
<localized>
<de>
<long-description>Describe the F16-A in German</long-description>
</de>
<fr>
<long-description>Describe the F16-A in French</long-description>
</fr>
</localized>
<rating>
<FDM type="int">3</FDM>
<systems type="int">1</systems>

View File

@@ -6,16 +6,6 @@
<long-description>The F16-B is an upgraded version of the F16A.</long-description>
<variant-of>f16a</variant-of>
<localized>
<de>
<long-description>Describe the F16-B in German</long-description>
</de>
<fr>
<long-description>Describe the F16-B in French</long-description>
</fr>
</localized>
<authors n="0">
<author n="0">
<name>James T Kirk</name>

View File

@@ -1,32 +1,16 @@
#! /usr/bin/env python3
#!/usr/bin/python
import unittest
import sgprops
import os
from os.path import join
import lxml.etree as ET
from shutil import rmtree
from tempfile import mkdtemp
import zipfile
from flightgear.meta import sgprops
from flightgear.meta.aircraft_catalogs import catalog
baseDir = os.path.dirname(__file__)
def testData(*args):
return join(baseDir, "testData", *args)
# This is the file from this directory (tests)
fgaddon_catalog_zip_excludes = join(baseDir, "fgaddon-catalog",
"zip-excludes.lst")
import catalog
import xml.etree.cElementTree as ET
catalog.quiet = True
class UpdateCatalogTests(unittest.TestCase):
def test_scan_set(self):
info = catalog.scan_set_file(testData("Aircraft", "f16"),
"f16a-set.xml", [testData("OtherDir")])
info = catalog.scan_set_file("testData/Aircraft/f16", "f16a-set.xml", ["testData/OtherDir"])
self.assertEqual(info['id'], 'f16a')
self.assertEqual(info['name'], 'F16-A')
self.assertEqual(info['primary-set'], True)
@@ -50,13 +34,9 @@ class UpdateCatalogTests(unittest.TestCase):
self.assertEqual(authors.getValue('author[0]/email'), 'ww@wright.com')
self.assertEqual(authors.getValue('author[1]/name'), 'Orville Wright')
locDe = info['localized']['de']
self.assertEqual(locDe["description"], "Describe the F16-A in German")
def test_scan_dir(self):
(pkg, variants) = catalog.scan_aircraft_dir(
testData("Aircraft", "f16"), [testData("OtherDir")])
(pkg, variants) = catalog.scan_aircraft_dir("testData/Aircraft/f16", ["testData/OtherDir"])
self.assertEqual(pkg['id'], 'f16a')
f16trainer = next(v for v in variants if v['id'] == 'f16-trainer')
@@ -74,9 +54,6 @@ class UpdateCatalogTests(unittest.TestCase):
self.assertEqual(f16b['variant-of'], 'f16a')
self.assertEqual(f16b['primary-set'], False)
locFr = f16b['localized']['fr']
self.assertEqual(locFr["description"], "Describe the F16-B in French")
authorsArray = f16b['authors']
self.assertNotIn('author', f16b)
@@ -93,15 +70,13 @@ class UpdateCatalogTests(unittest.TestCase):
# test some older constructs for compat
def test_scan_dir_legacy(self):
(pkg, variants) = catalog.scan_aircraft_dir(
testData("Aircraft", "c172"), [])
(pkg, variants) = catalog.scan_aircraft_dir("testData/Aircraft/c172", [])
self.assertEqual(pkg['id'], 'c172')
self.assertEqual(pkg['author'], 'Wilbur Wright')
def test_extract_previews(self):
info = catalog.scan_set_file(testData("Aircraft", "f16"),
"f16a-set.xml", [testData("OtherDir")])
info = catalog.scan_set_file("testData/Aircraft/f16", "f16a-set.xml", ["testData/OtherDir"])
previews = info['previews']
self.assertEqual(len(previews), 3)
self.assertEqual(2, len([p for p in previews if p['type'] == 'exterior']))
@@ -109,18 +84,16 @@ class UpdateCatalogTests(unittest.TestCase):
self.assertEqual(1, len([p for p in previews if p['path'] == 'Previews/exterior-1.png']))
def test_extract_tags(self):
info = catalog.scan_set_file(testData("Aircraft", "f16"),
"f16a-set.xml", [testData("OtherDir")])
info = catalog.scan_set_file("testData/Aircraft/f16", "f16a-set.xml", ["testData/OtherDir"])
tags = info['tags']
def test_node_creation(self):
(pkg, variants) = catalog.scan_aircraft_dir(testData("Aircraft", "f16"),
[testData("OtherDir")])
(pkg, variants) = catalog.scan_aircraft_dir("testData/Aircraft/f16", ["testData/OtherDir"])
catalog_node = ET.Element('PropertyList')
catalog_root = ET.ElementTree(catalog_node)
pkgNode = catalog.make_aircraft_node('f16', pkg, variants, "http://foo.com/testOutput/", [])
pkgNode = catalog.make_aircraft_node('f16', pkg, variants, "http://foo.com/testOutput/")
catalog_node.append(pkgNode)
# write out so we can parse using sgprops
@@ -129,7 +102,7 @@ class UpdateCatalogTests(unittest.TestCase):
if not os.path.isdir("testOutput"):
os.mkdir("testOutput")
cat_file = join("testOutput", "catalog_fragment.xml")
cat_file = os.path.join("testOutput", 'catalog_fragment.xml')
catalog_root.write(cat_file, encoding='utf-8', xml_declaration=True)
parsed = sgprops.readProps(cat_file)
@@ -156,9 +129,8 @@ class UpdateCatalogTests(unittest.TestCase):
self.assertEqual(parsedPkgNode.getValue('rating/cockpit'), 2)
self.assertEqual(parsedPkgNode.getValue('rating/model'), 5)
self.assertEqual(parsedPkgNode.getValue('localized/de/description'), "Describe the F16-A in German")
# author data verification
# author data verification
self.assertFalse(parsedPkgNode.hasChild('author'));
parsedAuthors = parsedPkgNode.getChild("authors").getChildren('author')
@@ -194,23 +166,19 @@ class UpdateCatalogTests(unittest.TestCase):
self.assertEqual(author1.getValue("email"), "shatner@enterprise.com")
self.assertEqual(author1.getValue("description"), "Everything")
self.assertEqual(pv.getValue('localized/de/description'), "Describe the F16-B in German")
def test_node_creation2(self):
(pkg, variants) = catalog.scan_aircraft_dir(testData("Aircraft", "dc3"),
[testData("OtherDir")])
(pkg, variants) = catalog.scan_aircraft_dir("testData/Aircraft/dc3", ["testData/OtherDir"])
catalog_node = ET.Element('PropertyList')
catalog_root = ET.ElementTree(catalog_node)
pkgNode = catalog.make_aircraft_node('dc3', pkg, variants, "http://foo.com/testOutput/", [])
pkgNode = catalog.make_aircraft_node('dc3', pkg, variants, "http://foo.com/testOutput/")
catalog_node.append(pkgNode)
if not os.path.isdir("testOutput"):
os.mkdir("testOutput")
cat_file = join("testOutput", "catalog_fragment2.xml")
cat_file = os.path.join("testOutput", 'catalog_fragment2.xml')
catalog_root.write(cat_file, encoding='utf-8', xml_declaration=True)
parsed = sgprops.readProps(cat_file)
@@ -221,7 +189,7 @@ class UpdateCatalogTests(unittest.TestCase):
self.assertEqual(parsedPkgNode.getValue('id'), pkg['id']);
self.assertEqual(parsedPkgNode.getValue('dir'), 'dc3');
self.assertEqual(parsedPkgNode.getValue('url'), 'http://foo.com/testOutput/dc3.zip');
self.assertEqual(parsedPkgNode.getValue('author'), 'Donald Douglas');
parsedAuthors = parsedPkgNode.getChild("authors").getChildren('author')
@@ -237,19 +205,18 @@ class UpdateCatalogTests(unittest.TestCase):
def test_minimalAircraft(self):
# test an aircraft with a deliberately spartan -set.xml file with
# most interesting data missing
(pkg, variants) = catalog.scan_aircraft_dir(
testData("Aircraft", "c150"), [testData("OtherDir")])
(pkg, variants) = catalog.scan_aircraft_dir("testData/Aircraft/c150", ["testData/OtherDir"])
catalog_node = ET.Element('PropertyList')
catalog_root = ET.ElementTree(catalog_node)
pkgNode = catalog.make_aircraft_node('c150', pkg, variants, "http://foo.com/testOutput/", [])
pkgNode = catalog.make_aircraft_node('c150', pkg, variants, "http://foo.com/testOutput/")
catalog_node.append(pkgNode)
if not os.path.isdir("testOutput2"):
os.mkdir("testOutput2")
cat_file = join("testOutput2", "catalog_fragment.xml")
cat_file = os.path.join("testOutput2", 'catalog_fragment.xml')
catalog_root.write(cat_file, encoding='utf-8', xml_declaration=True)
parsed = sgprops.readProps(cat_file)
@@ -267,92 +234,5 @@ class UpdateCatalogTests(unittest.TestCase):
self.assertFalse(parsedPkgNode.hasChild('minimum-fg-version'));
self.assertFalse(parsedPkgNode.hasChild('variant'));
class ZipTests(unittest.TestCase):
"""Specific craft zip file creation tests."""
def check_zip(self, file_name, expected_content=None):
"""General checks for the zip file."""
# Check for file existence.
self.assertTrue(os.access(file_name, os.F_OK))
# Check the contents.
file = zipfile.ZipFile(file_name)
zip_contents = file.namelist()
if len(zip_contents) != len(expected_content):
print("Zip contents:\n %s" % zip_contents)
print("Expected contents:\n %s" % expected_content)
self.assertEqual(len(zip_contents), len(expected_content))
for i in range(len(zip_contents)):
self.assertEqual(zip_contents[i], expected_content[i])
def setUp(self):
"""Common set up for these system tests."""
# Store the current directory.
self._cwd = os.getcwd()
# Create a temporary directory for dumping files.
self.tmpdir = mkdtemp()
def tearDown(self):
"""Delete temp files."""
# Force return to the correct directory.
os.chdir(self._cwd)
# Remove temporary file (if there is a deletion failure, continue to allow the test suite to survive).
try:
rmtree(self.tmpdir)
except:
pass
# Remove the variable.
del self.tmpdir
def test_zip_creation(self):
"""Test the creation of a basic craft zip archive."""
# Create a basic zip file.
name = "c172"
catalog.make_aircraft_zip(testData("Aircraft"), name,
join(self.tmpdir, name + '.zip'),
fgaddon_catalog_zip_excludes, verbose=False)
# Checks.
self.check_zip(join(self.tmpdir, name+'.zip'), expected_content=['c172/c172-set.xml'])
def test_zip_exclusion_global(self):
"""Test file exclusion in a craft zip archive using the global catalog exclusion list."""
# Create a basic zip file.
name = "dc3"
catalog.make_aircraft_zip(testData("Aircraft"), name,
join(self.tmpdir, name + '.zip'),
fgaddon_catalog_zip_excludes, verbose=False)
# Checks.
self.check_zip(join(self.tmpdir, name+'.zip'), expected_content=['dc3/dc3-set.xml'])
def test_zip_exclusion_local(self):
"""Test file exclusion in a craft zip archive using a local catalog exclusion list."""
# Create a basic zip file.
name = "c150"
catalog.make_aircraft_zip(testData("Aircraft"), name,
join(self.tmpdir, name + '.zip'),
testData("Aircraft", "c150",
"zip-excludes.lst"),
verbose=False)
# Checks.
self.check_zip(join(self.tmpdir, name+'.zip'), expected_content=['c150/c150-set.xml', 'c150/Resources/crazy_20Gb_file'])
if __name__ == '__main__':
unittest.main()

View File

@@ -1,31 +1,22 @@
#! /usr/bin/env python3
import os
import unittest
from flightgear.meta import sgprops
baseDir = os.path.dirname(__file__)
def testData(*args):
return os.path.join(baseDir, "testData", *args)
import types
import sgprops
class SGProps(unittest.TestCase):
def test_parse(self):
parsed = sgprops.readProps(testData("props1.xml"))
parsed = sgprops.readProps("testData/props1.xml")
self.assertEqual(parsed.getValue("value"), 42)
self.assertEqual(type(parsed.getValue("value")), int)
self.assertEqual(type(parsed.getValue("value")), types.IntType)
valNode = parsed.getChild("value")
self.assertEqual(valNode.parent, parsed)
self.assertEqual(valNode.name, "value")
self.assertEqual(valNode.value, 42)
self.assertEqual(type(valNode.value), int)
self.assertEqual(type(valNode.value), types.IntType)
with self.assertRaises(IndexError):
missingNode = parsed.getChild("missing")
@@ -47,10 +38,10 @@ class SGProps(unittest.TestCase):
def test_invalidIndex(self):
with self.assertRaises(IndexError):
parsed = sgprops.readProps(testData("bad-index.xml"))
parsed = sgprops.readProps("testData/bad-index.xml")
def test_include(self):
parsed = sgprops.readProps(testData("props2.xml"))
parsed = sgprops.readProps("testData/props2.xml")
# test that value in main file over-rides the one in the include
self.assertEqual(parsed.getValue("value"), 33)

View File

@@ -1,4 +1,4 @@
#! /usr/bin/env python3
#!/usr/bin/python
import argparse
import datetime
@@ -8,21 +8,14 @@ import os
import re
import shutil
import subprocess
import sys
import time
from flightgear.meta import sgprops
from flightgear.meta.aircraft_catalogs import catalogTags
from flightgear.meta.aircraft_catalogs import catalog
from flightgear.meta.aircraft_catalogs.catalog import make_aircraft_node, \
make_aircraft_zip, parse_config_file, parse_template_file
import sgprops
import sys
import catalogTags
import catalog
CATALOG_VERSION = 4
# The Python version.
PY_VERSION = sys.version_info[0]
parser = argparse.ArgumentParser()
parser.add_argument("--update", help="Update/pull SCM source",
action="store_true")
@@ -31,13 +24,10 @@ parser.add_argument("--no-update",
action="store_true")
parser.add_argument("--clean", help="Force regeneration of all zip files",
action="store_true")
parser.add_argument("--quiet", help="Only print warnings and errors",
action="store_true")
parser.add_argument("dir", help="Catalog directory")
args = parser.parse_args()
includes = []
mirrors = [] # mirror base URLs
# xml node (robust) get text helper
def get_xml_text(e):
@@ -50,11 +40,6 @@ def get_xml_text(e):
def last_change_date_svn(dir):
command = [ 'svn', 'info', dir ]
result = subprocess.check_output( command )
# Python 3 compatibility.
if PY_VERSION == 3:
result = result.decode('utf8')
match = re.search('Last Changed Date: (\d+)\-(\d+)\-(\d+)', result)
if match:
rev_str = match.group(1) + match.group(2) + match.group(3)
@@ -78,9 +63,23 @@ def scan_dir_for_change_date_mtime(path):
maxsec = mtime
return maxsec
def make_aircraft_zip(repo_path, name, zip_file):
print "Updating:", name + '.zip'
savedir = os.getcwd()
os.chdir(repo_path)
if os.path.exists(zip_file):
os.remove(zip_file)
command = ['zip', '-rq', '-9']
if os.path.exists(zip_excludes):
command += ['-x@' + zip_excludes]
else:
print "warning: no zip-excludes.lst file provided", zip_excludes
command += [zip_file, name]
subprocess.call(command)
os.chdir(savedir)
def get_md5sum(file):
f = open(file, 'rb')
f = open(file, 'r')
md5sum = hashlib.md5(f.read()).hexdigest()
f.close()
return md5sum
@@ -92,7 +91,7 @@ def copy_previews_for_variant(variant, package_name, package_dir, previews_dir):
for preview in variant['previews']:
preview_src = os.path.join(package_dir, preview['path'])
preview_dst = os.path.join(previews_dir, package_name + '_' + preview['path'])
#print(preview_src, preview_dst, preview['path'])
#print preview_src, preview_dst, preview['path']
dir = os.path.dirname(preview_dst)
if not os.path.isdir(dir):
os.makedirs(dir)
@@ -130,7 +129,6 @@ def process_aircraft_dir(name, repo_path):
global output_dir
global valid_zips
global previews_dir
global mirrors
aircraft_dir = os.path.join(repo_path, name)
if not os.path.isdir(aircraft_dir):
@@ -138,14 +136,12 @@ def process_aircraft_dir(name, repo_path):
(package, variants) = catalog.scan_aircraft_dir(aircraft_dir, includes)
if package == None:
if not args.quiet:
print("skipping: %s (no -set.xml files)" % name)
print "skipping:", name, "(no -set.xml files)"
return
if not args.quiet:
print("%s:" % name)
print "%s:" % name,
package_node = make_aircraft_node(name, package, variants, download_base, mirrors)
package_node = catalog.make_aircraft_node(name, package, variants, download_base)
download_url = download_base + name + '.zip'
if 'thumbnail' in package:
@@ -164,21 +160,19 @@ def process_aircraft_dir(name, repo_path):
d = datetime.datetime.utcfromtimestamp(dir_mtime)
rev = d.strftime("%Y%m%d")
package_node.append( catalog.make_xml_leaf('revision', rev) )
#print("rev: %s" % rev)
#print("dir mtime: %s" % dir_mtime)
#print "rev:", rev
#print "dir mtime:", dir_mtime
zipfile = os.path.join( output_dir, name + '.zip' )
valid_zips.append(name + '.zip')
if not os.path.exists(zipfile) \
or dir_mtime > os.path.getmtime(zipfile) \
or args.clean:
# rebuild zip file
if not args.quiet:
print("updating: %s" % zipfile)
make_aircraft_zip(repo_path, name, zipfile, zip_excludes, verbose=not args.quiet)
print "updating:", zipfile
make_aircraft_zip(repo_path, name, zipfile)
md5sum = get_md5sum(zipfile)
else:
if not args.quiet:
print("(no change)")
print "(no change)"
if md5sum == "":
md5sum = get_md5sum(zipfile)
filesize = os.path.getsize(zipfile)
@@ -192,18 +186,6 @@ def process_aircraft_dir(name, repo_path):
else:
md5sum_root.append( catalog.make_xml_leaf('aircraft_' + name, md5sum) )
# handle sharing
if share_md5sum_root != None:
sharedNode = share_md5sum_root.find(str('aircraft_' + name))
if node != None:
shared_md5 = get_xml_text(sharedNode)
if shared_md5 == md5sum:
if not args.quiet:
print("Sharing zip with share catalog for: %s" % name)
os.remove(zipfile)
os.symlink(os.path.join( share_output_dir, name + '.zip' ), zipfile)
# handle thumbnails
copy_thumbnails_for_package(package, variants, name, aircraft_dir, thumbnail_dir)
@@ -220,12 +202,19 @@ def process_aircraft_dir(name, repo_path):
# return (md5, file_size)
if not os.path.isdir(args.dir):
print("A valid catalog directory must be provided")
print "A valid catalog directory must be provided"
exit(0)
parser = ET.XMLParser(remove_blank_text=True)
config_node = parse_config_file(parser=parser, file_name=os.path.join(args.dir, 'catalog.config.xml'))
template_node = parse_template_file(parser=parser, file_name=os.path.join(args.dir, 'template.xml'))
config_file = os.path.join(args.dir, 'catalog.config.xml')
config = ET.parse(config_file, parser)
config_node = config.getroot()
template_file = os.path.join(args.dir, 'template.xml')
template = ET.parse(template_file, parser)
template_root = template.getroot()
template_node = template_root.find('template')
md5sum_file = os.path.join(args.dir, 'md5sum.xml')
if os.path.exists(md5sum_file):
@@ -235,31 +224,11 @@ else:
md5sum_root = ET.Element('PropertyList')
md5sum_tree = ET.ElementTree(md5sum_root)
# share .zip files with other output dirs
share_output_dir = get_xml_text(config_node.find('share-output'))
share_md5_file = get_xml_text(config_node.find('share-md5-sums'))
if share_output_dir != '' and share_md5_file != '':
print("Output shared with: %s" % share_output_dir)
share_md5sum_tree = ET.parse(share_md5_file, parser)
share_md5sum_root = share_md5sum_tree.getroot()
else:
share_md5sum_root = None
# SCM providers
scm_list = config_node.findall('scm')
upload_node = config_node.find('upload')
download_base = None
for i in config_node.findall("download-url"):
url = get_xml_text(i)
if not url.endswith('/'):
url += '/'
if download_base == None:
# download_base is the first entry
download_base = url
else:
mirrors.append(url)
download_base = get_xml_text(config_node.find('download-url'))
if not download_base.endswith('/'):
download_base += '/'
output_dir = get_xml_text(config_node.find('local-output'))
if output_dir == '':
@@ -281,37 +250,31 @@ zip_excludes = os.path.realpath(tmp)
for i in config_node.findall("include-dir"):
path = get_xml_text(i)
if not os.path.exists(path):
print("Skipping missing include path: %s" % path)
print "Skipping missing include path:", path
continue
includes.append(path)
# freshen repositories
if args.no_update:
print('Skipping repository updates.')
print 'Skipping repository updates.'
else:
cwd = os.getcwd()
for scm in scm_list:
# XML mandated skip, with command line override.
if not args.update:
skip = get_xml_text(scm.find('update'))
if skip == 'false':
continue
repo_type = get_xml_text(scm.find('type'))
repo_path = get_xml_text(scm.find('path'))
includes.append(repo_path)
if repo_type == 'svn':
print("SVN update: %s" % repo_path)
print 'SVN update:', repo_path
subprocess.call(['svn', 'update', repo_path])
elif repo_type == 'git':
print("GIT pull: %s" % repo_path)
print 'GIT pull:', repo_path
os.chdir(repo_path)
subprocess.call(['git','pull'])
elif repo_type == 'no-scm':
print("No update of unmannaged files: %s" % repo_path)
print "No update of unmannaged files:", repo_path
else:
print("Unknown scm type: %s %s" % (scm, repo_path))
print "Unknown scm type:", scm, repo_path
os.chdir(cwd)
# names of zip files we want (so we can identify/remove orphans)
@@ -333,27 +296,15 @@ for scm in scm_list:
skip_list = []
for s in skip_nodes:
skip_list.append(get_xml_text(s))
# Selective list of craft to include, overriding the skip list.
include_nodes = scm.findall('include')
include_list = []
for node in include_nodes:
include_list.append(get_xml_text(node))
if len(include_list):
skip_list = []
print("Skip list: %s" % skip_list)
print("Include list: %s" % include_list)
print 'skip list:', skip_list
names = os.listdir(repo_path)
for name in sorted(names, key=lambda s: s.lower()):
if name in skip_list or (len(include_list) and name not in include_list):
if not args.quiet:
print("Skipping: %s" % name)
if name in skip_list:
print "skipping:", name
continue
# process each aircraft in turn
# print("%s %s" % (name, repo_path))
# print name, repo_path
process_aircraft_dir(name, repo_path)
# write out the master catalog file
@@ -361,11 +312,11 @@ cat_file = os.path.join(output_dir, 'catalog.xml')
catalog_root.write(cat_file, encoding='utf-8', xml_declaration=True, pretty_print=True)
# write out the md5sum cache file
print(md5sum_file)
print md5sum_file
md5sum_tree.write(md5sum_file, encoding='utf-8', xml_declaration=True, pretty_print=True)
# look for orphaned zip files
files = os.listdir(output_dir)
for file in files:
if file.endswith('.zip')and not file in valid_zips:
print("orphaned zip: %s" % file)
print "orphaned zip:", file

View File

@@ -1,51 +0,0 @@
#!/bin/bash
# can't rely on $HOME in cron scripts
script_home=/home/fgaddon
# we assume fgmeta is checked out to $script_home/fgmeta
# add the scripts to the path
catalog_dir=$script_home/fgmeta/catalog
local_www_dir=/var/www/uk-mirror/fgaddon
output_dir=$script_home/output
rsync_args="-avz"
# this assumes there is an 'ibiblio' entry setup in $HOME/.ssh/config with the appropriate
# credentials
ibiblio_prefix=ibiblio:/public/mirrors/flightgear/ftp/
alias python=python3
export PATH=$PATH:$catalog_dir
export PYTHONPATH=$script_home/fgmeta/python3-flightgear
echo "Generating trunk catalog"
update-catalog.py --quiet --update $catalog_dir/fgaddon-catalog-ukmirror
# at some point, we can disable updating the 2018 catalog
echo "Generating stable catalog 2018"
update-catalog.py --quiet --update $catalog_dir/stable-2018-catalog
echo "Generating stable catalog 2020"
update-catalog.py --quiet --update $catalog_dir/stable-2020-catalog
echo "Coping to WWW dir"
rsync -avz $output_dir/Aircraft-trunk $local_www_dir/
rsync -avz $output_dir/Aircraft-2018 $local_www_dir/
rsync -avz $output_dir/Aircraft-2020 $local_www_dir/
# temporarily disabled
echo "Syncing to Ibiblio"
rsync $rsync_args $output_dir/Aircraft-trunk $ibiblio_prefix
rsync $rsync_args $output_dir/Aircraft-2018 $ibiblio_prefix
rsync $rsync_args $output_dir/Aircraft-2020 $ibiblio_prefix
echo "All done"

View File

@@ -1,345 +0,0 @@
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# git-date.py --- Find Git commits around some date in one or more repositories.
# Copyright (c) 2021, Florent Rougon
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# The views and conclusions contained in the software and documentation are
# those of the authors and should not be interpreted as representing official
# policies, either expressed or implied, of the FlightGear project.
# The idea and some Git-fu of this script are from Edward d'Auvergne:
# <https://sourceforge.net/p/flightgear/mailman/message/37004175/>.
import argparse
import locale
import os
import platform
import re
import subprocess
import sys
from collections import namedtuple, OrderedDict
PROGNAME = os.path.basename(sys.argv[0])
PROGVERSION = "0.2"
COPYRIGHT = "Copyright (c) 2021, Florent Rougon"
LICENSE_SUMMARY = """\
This program is free software. It comes without any warranty, to
the extent permitted by applicable law. See the top of {progname}
for more details on the licensing conditions.""".format(progname=PROGNAME)
# Very simple Repository type
Repository = namedtuple('Repository', ['label', 'path'])
class CommitFinder:
def __init__(self, branch, date):
self.branch = branch
self.date = date
def findCommit(self, repo_path):
"""Return a commit ID that belongs to 'repo_path'."""
args = ["git", "rev-list", "--max-count=1",
"--before={}".format(self.date), self.branch]
p = subprocess.run(args, cwd=repo_path, capture_output=True,
check=True, encoding="utf-8")
return p.stdout.strip()
def action(self, repositories):
"""Act on one or more repositories.
'repositories' should be an OrderedDict whose keys are
repository labels and values Repository objects.
"""
for label, repo in repositories.items():
commitId = self.findCommit(repo.path)
if params.let_me_breathe: self.print("-" * 78)
if not params.checkout: # the output would be redundant
if params.only_label:
# Useful with --show-commits
# --show-commits-option='--no-patch'
# --show-commits-option='--format=oneline'
self.print("{}: ".format(label), end='')
else:
self.print("{}: {}".format(label, commitId))
if params.let_me_breathe: self.print()
if params.show_commits:
args = ["git", "-c", "pager.show=false", "show"] + \
params.show_commits_options + [commitId]
subprocess.run(args, cwd=repo.path, check=True)
if params.checkout:
args = ["git", "checkout", commitId]
self.print("{}: checking out commit {}...".format(label,
commitId))
subprocess.run(args, cwd=repo.path, check=True)
if params.let_me_breathe: self.print()
def print(self, *args, **kwargs):
"""Wrapper for print() that defaults to flushing the output stream.
This is particularly useful when stdout is fully buffered (e.g.,
when piping the output of the script through a pager). Without
this 'flush=True' setting, output from Git commands would bypass
the high-level buffering layer in sys.stdout and could come out
before the output of some *later* non-flushed print()
statements.
"""
print(*args, flush=True, **kwargs)
def parseConfigFile(cfgFile, configFileOptSpecified, recognizedParams):
namespace = argparse.Namespace()
l = {}
if configFileOptSpecified or os.path.exists(cfgFile):
# Read the configuration file (i.e., execute it)
with open(cfgFile, "r") as f:
exec(f.read(), {"OrderedDict": OrderedDict}, l)
for p in recognizedParams:
if p in l:
setattr(namespace, p, l[p])
return namespace
def processCommandLineAndConfigFile():
if platform.system() == "Windows":
defaultCfgFile = os.path.join(os.getenv("APPDATA", "C:/"), PROGNAME,
"config.py")
else:
defaultCfgFile = os.path.join(os.getenv('HOME'), ".config", PROGNAME,
"config.py")
parser = argparse.ArgumentParser(
usage="""\
%(prog)s [OPTION ...] DATE [REPOSITORY...]
Find Git commits before DATE in one or more repositories.""",
description="""\
Print information about, and possibly check out the most recent commit
before DATE in each of the specified repositories. By default, commits
are searched for in the 'next' branch, however this can be changed using
the --branch option or the 'branch' variable in the configuration file.
DATE can be in any date format accepted by Git (see the examples below).
If option --repo-args-are-just-paths has been given, each REPOSITORY
argument is literally treated as a path to a repository. Otherwise, each
REPOSITORY argument that has the form LABEL=PATH defines a repository
rooted at PATH with associated LABEL (using this special syntax is not
mandatory, but allows {progname} to refer to your repositories using the
provided labels, which is more user-friendly in general).
Examples (the backslashes just introduce continuation lines):
# One output line per repository (terse)
{progname} "2021-02-28 23:12:00" SG=/path/to/SG \\
FG=/path/to/FG FGData=/path/to/FGData
# Ditto without providing the repository labels
{progname} "2021-02-28 23:12:00" /path/to/SG \\
/path/to/FG /path/to/FGData
# Run 'git show' with the specified options for each commit found.
{progname} --let-me-breathe --show-commits \\
--show-commits-option='--no-patch' \\
--show-commits-option='--format=medium' \\
'2021-02-28 23:12:00' SG=/path/to/SG \\
FG=/path/to/FG FGData=/path/to/FGData
# Run 'git checkout' for each commit found.
{progname} --checkout --let-me-breathe "2021-01-01" SG=/path/to/SG \\
FG=/path/to/FG FGData=/path/to/FGData
# For each repository, print the label, commit ID and one-line description.
{progname} --only-label --show-commits \\
--show-commits-option='--no-patch' \\
--show-commits-option='--format=oneline' \\
"2021-02-28" SG=/path/to/SG \\
FG=/path/to/FG FGData=/path/to/FGData
Note: --show-commits and --show-commits-option may be used in conjunction with
--checkout if so desired.
If $HOME/.config/{progname}/config.py exists or if the --config-file option
has been given, a configuration file is read. This file is executed by
the Python interpreter and must therefore adhere to Python 3 syntax.
Here is a sample configuration file:
------------------------------------------------------------------------------
branch = 'release/2020.3'
# checkout = True
# show_commits = True
# show_commits_options = ['--no-patch', '--format=medium']
# let_me_breathe = True
# only_label = True
# repo_args_are_just_paths = True
# collections.OrderedDict is available for use here:
repositories = OrderedDict(
SimGear = "/path/to/simgear",
FlightGear = "/path/to/flightgear",
FGData = "/path/to/fgdata")
# Same list of repositories but without user-defined labels:
# repositories = [
# "/path/to/simgear",
# "/path/to/flightgear",
# "/path/to/fgdata"]
------------------------------------------------------------------------------
Command-line options take precedence over their counterparts found in
the configuration file. On the other hand, REPOSITORY arguments *extend*
the list of repositories that may be defined in the configuration file
using the 'repositories' variable.""".format(progname=PROGNAME),
formatter_class=argparse.RawDescriptionHelpFormatter,
# I want --help but not -h (it might be useful for something else)
add_help=False)
# This option is actually handled by configFileOptParser because we want to
# treat it before all other options.
parser.add_argument('--config-file', metavar="FILE", default=defaultCfgFile,
help="""\
load configuration from FILE (default: %(default)s)""")
parser.add_argument('-b', '--branch', default="next", help="""\
search the history of BRANCH (default: %(default)s)""")
parser.add_argument('-c', '--checkout', action='store_true', help="""\
run 'git checkout' for the commit found in each repository""")
parser.add_argument('-s', '--show-commits', action='store_true', help="""\
run 'git show' for the commit found in each repository""")
parser.add_argument('-S', '--show-commits-option', action='append',
dest='show_commits_options', help="""\
option passed to 'git show' when --show-commits is used (may be
specified multiple times, as in: --show-commits-option='--no-patch'
--show-commits-option='--format=medium')""")
parser.add_argument('--repo-args-are-just-paths',
action='store_true', help="""\
don't try to recognize and special-case the LABEL=PATH syntax for
repository arguments; treat them literally as paths and simply assign
labels 'Repo 1', 'Repo 2', etc., to the specified repositories""")
parser.add_argument('--let-me-breathe', action='store_true', help="""\
add blank lines and other separators to make the output hopefully more
readable when Git prints a lot of things""")
parser.add_argument('--only-label', action='store_true', help="""\
don't print the commit ID after the repository label (this is useful
when the Git output that comes next already contains the commit ID)""")
parser.add_argument('date', metavar="DATE", help="""\
find commits before this date (any format accepted by Git can be used)""")
parser.add_argument('cmdRepos', metavar="REPOSITORY", nargs='*',
help="""\
path to a repository to act on (actually, each REPOSITORY argument may be
of the form LABEL=PATH in order to assign a label to the repository).
There can be an arbitrary number of such arguments.""")
parser.add_argument('--help', action="help",
help="display this message and exit")
parser.add_argument('--version', action='version',
version="{name} version {version}\n{copyright}\n\n"
"{license}".format(
name=PROGNAME, version=PROGVERSION,
copyright=COPYRIGHT,
license=LICENSE_SUMMARY))
# Find which config file to read and note whether the --config-file option
# was given.
configFileOptParser = argparse.ArgumentParser(add_help=False)
configFileOptParser.add_argument('--config-file')
ns, remaining = configFileOptParser.parse_known_args()
if ns.config_file is not None:
configFileOptSpecified = True
else:
configFileOptSpecified = False
ns.config_file = defaultCfgFile
recognizedParams = ("repo_args_are_just_paths", "branch", "checkout",
"show_commits", "show_commits_options",
"let_me_breathe", "only_label", "repositories")
# Read the config file into 'params' (an argparse.Namespace object)
params = parseConfigFile(ns.config_file, configFileOptSpecified,
recognizedParams)
# Process the rest of the command-line
parser.parse_args(namespace=params)
if "repositories" not in params:
params.repositories = []
# Prepare the list of repositories based on the config file and the command
# line arguments.
params.repositories = initListOfRepositories(
params.repositories, params.cmdRepos, params.repo_args_are_just_paths)
if not params.repositories:
sys.exit(f"{PROGNAME}: no repository was specified, neither in the "
"configuration file\nnor on the command line; exiting.")
return params
# Returns an OrderedDict whose keys are repository labels and values Repository
# objects.
def initListOfRepositories(reposFromCfgFile, reposFromCmdLineArgs,
repoArgsAreJustPaths):
res = OrderedDict()
reposLeftToAdd = []
if isinstance(reposFromCfgFile, OrderedDict):
for label, path in reposFromCfgFile.items():
res[label] = Repository(label, path)
elif isinstance(reposFromCfgFile, list):
reposLeftToAdd.extend(reposFromCfgFile)
else:
sys.exit(f"{PROGNAME}: in the configuration file, 'repositories' must "
"be either an\nOrderedDict or a list.")
repoNum = len(res)
for elt in reposLeftToAdd + reposFromCmdLineArgs:
repoNum += 1
mo = re.match(r"^(?P<label>\w+)=(?P<path>.*)", elt)
if mo is None or repoArgsAreJustPaths:
label = "Repo {}".format(repoNum)
path = elt
else:
label, path = mo.group("label", "path")
res[label] = Repository(label, path)
return res
def main():
global params
locale.setlocale(locale.LC_ALL, '')
# Require Python 3.6 or later because we rely on the retained order for
# keyword arguments passed to the OrderedDict constructor.
if sys.hexversion < 0x030600F0:
sys.exit(f"{PROGNAME}: exiting because Python >= 3.6 is required.")
params = processCommandLineAndConfigFile()
commitFinder = CommitFinder(params.branch, params.date)
commitFinder.action(params.repositories)
sys.exit(0)
if __name__ == "__main__": main()

File diff suppressed because it is too large Load Diff

View File

@@ -1,2 +0,0 @@
scratch-*/
vcpkg-git/

View File

@@ -1,40 +1,41 @@
## fg-from-scratch
Windows utility to download, compile, and stage TerraGear and its dependencies
Copyright (C) 2018-2019 Scott Giese (xDraconian) scttgs0@gmail.com
Copyright (C) 2018 Scott Giese (xDraconian) scttgs0@gmail.com
### Purpose:
Simplify the process of producing a working version of the OSG, SimGear, FlightGear, and TerraGear for Windows users.
Simplify the process of producing a working version of the TerraGear tools for Windows users.
If you find this script useful, or not useful, please share your experience with me via a brief email.
### Approach:
Rather than leveraging the popular Win.3rdParty download, this script compiles all dependencies
on your hardware. This eliminates many of the problems associated with mixed compilation in which
your compiled binary comes into conflict with 3rd-party binaries.
your compiled binary become in conflict with 3rd-party binaries.
vcpkg is leveraged to download and compile all the dependencies required.
vcpkg is leveraged to download and compile all the dependencies required by TerraGear.
This script could be expanded to include compiling FlightGear and/or any of the other FlightGear
submodules (FGCom, Atlas, OpenRadar, etc.)
### Supported Platform:
Windows 10
### Prerequisites:
Visual Studio Community 2017 +
Visual Studio Community 2017
https://www.visualstudio.com/downloads/
Include the C++ package which includes the MSVC 19.14 compiler
CMake 3.11.3 +
CMake 3.11.3
https://cmake.org/download/
The script assumes the installation folder is c:\Program Files\.
Qt 5.10.1 +
Qt 5.10.1
https://www.qt.io/download/
The script assumes the installation folder is C:\Qt\.
Git 2.17.1 +
Git 2.17.1
https://git-scm.com/download/win/
The script assumes the installation folder is reflected on your PATH.
Author's configuration: Visual Studio Community 2019, CMake 3.15.3, Qt 5.13.1, Git 2.18.0
### Recommended:
Before running the script for the first time, set this environment variable:
@@ -46,29 +47,23 @@ You can execute the above command via a Command Terminal or via Powershell Admin
### Usage:
The script is intended to be run multiple times. During the first execution, all the packages are downloaded and compiled. Any time the script is executed afterward, the packages will update themselves.
<i>Note: Because failures can occur, the script will continue to download packages even after the first execution.</i>
<i>Note: Because failures can sometimes occur, the script will download packages after the first execution. Once you confirm that all packages have successfully been downloaded, you can optimize the script by adding <b>REM</b> at the beginning of the line. Refer to the comments within the script.</i>
Run the command script interactively. No log is produced.
fg-from-scratch.cmd
Run the command script and routes STDOUT and STDERR to a log file.
Runs the command script and routes STDOUT and STDERR to a log file. **The prompts have been removed, so it is no longer necessary to monitor the log while it is running.**
fg-from-scratch.cmd > scratch.log 2>&1
**Fix for the "White Text" issue** - pass either -wt or - -whitetext as an argument:
fg-from-scratch.cmd -wt > scratch.log 2>&1
The above command will force the usage of James' customized OSG source repo to leverage his workaround.
Options for monitoring the log file while the script is running:
Start the script and then
- Load the log file into Notepad++ (https://notepad-plus-plus.org/).
- Turn on feature "Monitor" via Notepad++
- **[Preferred]** Load the log file into WinTail (http://www.baremetalsoft.com/wintail/)
### TerraGear Example Project
### Example Project
Refer to CustomSceneryProjects/Test folder for an example of scenery generation.
generate.cmd > generate.log 2>&1

View File

@@ -1,4 +1,4 @@
@echo OFF
@ECHO OFF
REM fg-from-scratch - Windows utility to download, compile, and stage TerraGear and its dependencies
REM Copyright (C) 2018 Scott Giese (xDraconian) scttgs0@gmail.com
@@ -17,382 +17,193 @@ REM You should have received a copy of the GNU General Public License
REM along with this program; if not, write to the Free Software
REM Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
REM Defaults
set ROOT_DIR=%CD%
set WHITE_TEXT_FIX=0
set OSG_SOURCE_PATH=scratch-source/openscenegraph-3.6-git
set OSG_BUILD_PATH=scratch-build/openscenegraph-3.6
set WT_GDAL_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include
set WT_GDAL_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/gdal.lib
set WT_GDAL_LIBRARY_DEBUG=%ROOT_DIR%/vcpkg-git/installed/x64-windows/debug/lib/gdald.lib
SET ROOT_DIR=%CD%
SET PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/bin;%PATH%
SET CMAKE_TOOLCHAIN="Visual Studio 15 2017 Win64"
SET QT5x64=C:/Qt/5.10.1/msvc2017_64
REM Process arguments
:parse
if "%~1"=="" goto endparse
if "%~1"=="-wt" (
set WHITE_TEXT_FIX=1
set OSG_SOURCE_PATH=scratch-source/openscenegraph-fix-git
set OSG_BUILD_PATH=scratch-build/openscenegraph-fix
set WT_GDAL_INCLUDE_DIR=
set WT_GDAL_LIBRARY=
set WT_GDAL_LIBRARY_DEBUG=
)
if "%~1"=="--whitetext" (
set WHITE_TEXT_FIX=1
set OSG_SOURCE_PATH=scratch-source/openscenegraph-fix-git
set OSG_BUILD_PATH=scratch-build/openscenegraph-fix
set WT_GDAL_INCLUDE_DIR=
set WT_GDAL_LIBRARY=
set WT_GDAL_LIBRARY_DEBUG=
)
SHIFT
goto parse
:endparse
echo White Text Fix: %WHITE_TEXT_FIX%
echo %OSG_SOURCE_PATH%
echo %OSG_BUILD_PATH%
set PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/bin;%ROOT_DIR%/vcpkg-git/installed/x64-windows/include;%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib;%PATH%
REM Determine location of Qt5
set QT_SELECT=qt5
for /f %%i in ('"qtpaths.exe --install-prefix"') do set QT5x64=%%i
set QT5x64_LIB=%QT5x64%/lib
set QT5x64_CMAKE=%QT5x64_LIB%/cmake
echo QT Folder: %QT5x64%
REM Determine CMake toolchain
set CMAKE_TOOLCHAIN=Visual Studio 14 2015 Win64
for /f %%v in ('"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere" -latest -property catalog_productlineversion') do set VSx64=%%v
if %VSx64%==2019 (set CMAKE_TOOLCHAIN="Visual Studio 16 2019")
if %VSx64%==2017 (set CMAKE_TOOLCHAIN="Visual Studio 15 2017 Win64")
if %VSx64%==2015 (set CMAKE_TOOLCHAIN="Visual Studio 14 2015 Win64")
echo CMake Toolchain: %CMAKE_TOOLCHAIN%
if not exist vcpkg-git/NUL (
IF NOT EXIST vcpkg-git/NUL (
echo Preparing to install external libraries via vcpkg . . .
git clone https://github.com/Microsoft/vcpkg.git vcpkg-git
echo Compiling vcpkg
cd vcpkg-git
call .\bootstrap-vcpkg
call ./bootstrap-vcpkg
echo Compiling external libraries . . .
vcpkg install --triplet x64-windows boost cgal curl freeglut freetype gdal glew jasper libpng libxml2 mpfr openal-soft openjpeg openssl plib sdl2 tiff zlib
) else (
vcpkg install --triplet x64-windows boost cgal curl freeglut freetype gdal glew jasper libxml2 openal-soft openjpeg openssl plib sdl2 tiff zlib
) ELSE (
echo Updating vcpkg . . .
cd vcpkg-git
git pull
REM for /f "delims=" %%G in ('"git pull"') do if not %%G == "Already up to date." (
echo Compiling vcpkg
call .\bootstrap-vcpkg
REM break
REM )
echo Updating external libraries . . .
vcpkg update
vcpkg upgrade --triplet x64-windows --no-dry-run
echo Compiling external libraries . . .
vcpkg install --triplet x64-windows boost cgal curl freeglut freetype gdal glew jasper libxml2 libpng mpfr openal-soft openjpeg openssl plib sdl2 tiff zlib
REM Okay to comment out this line once all the packages have been confirmed to have been installed
vcpkg install --triplet x64-windows boost cgal curl freeglut freetype gdal glew jasper libxml2 openal-soft openjpeg openssl plib sdl2 tiff zlib
)
cd %ROOT_DIR%
if not exist scratch-source/NUL (
mkdir scratch-source
)
if not exist scratch-build/NUL (
mkdir scratch-build
)
if not exist scratch-install/NUL (
mkdir scratch-install
)
if %WHITE_TEXT_FIX%==1 (
if not exist scratch-build/openscenegraph-fix/NUL (
mkdir scratch-build\openscenegraph-fix
)
if not exist scratch-source/openscenegraph-fix-git/NUL (
echo Downloading OpenSceneGraph . . .
git clone -b fgfs-342-1 https://github.com/zakalawe/osg.git scratch-source/openscenegraph-fix-git
) else (
echo Updating OpenSceneGraph . . .
cd scratch-source/openscenegraph-fix-git
git pull
)
) else (
if not exist scratch-build/openscenegraph-3.6/NUL (
mkdir scratch-build\openscenegraph-3.6
)
if not exist scratch-source/openscenegraph-3.6-git/NUL (
echo Downloading OpenSceneGraph . . .
git clone -b OpenSceneGraph-3.6 https://github.com/openscenegraph/OpenSceneGraph.git scratch-source/openscenegraph-3.6-git
) else (
echo Updating OpenSceneGraph . . .
cd scratch-source/openscenegraph-3.6-git
git pull
)
IF NOT EXIST openscenegraph-3.4-git/NUL (
mkdir openscenegraph-3.4-build
echo Downloading OpenSceneGraph . . .
git clone -b OpenSceneGraph-3.4 https://github.com/openscenegraph/OpenSceneGraph.git openscenegraph-3.4-git
) ELSE (
echo Updating OpenSceneGraph . . .
cd openscenegraph-3.4-git
git pull
)
cd %ROOT_DIR%
if not exist scratch-build/simgear/NUL (
mkdir scratch-build\simgear
)
if not exist scratch-source/simgear-git/NUL (
IF NOT EXIST simgear-git/NUL (
mkdir simgear-build
echo Downloading SimGear . . .
git clone -b next https://git.code.sf.net/p/flightgear/simgear scratch-source/simgear-git
) else (
git clone -b next https://git.code.sf.net/p/flightgear/simgear simgear-git
) ELSE (
echo Updating SimGear . . .
cd scratch-source/simgear-git
cd simgear-git
git pull
)
cd %ROOT_DIR%
if not exist scratch-build/flightgear/NUL (
mkdir scratch-build\flightgear
)
if not exist scratch-source/flightgear-git/NUL (
IF NOT EXIST flightgear-git/NUL (
mkdir flightgear-build
echo Downloading FlightGear . . .
git clone -b next https://git.code.sf.net/p/flightgear/flightgear scratch-source/flightgear-git
) else (
git clone -b next https://git.code.sf.net/p/flightgear/flightgear flightgear-git
) ELSE (
echo Updating FlightGear . . .
cd scratch-source/flightgear-git
cd flightgear-git
git pull
)
cd %ROOT_DIR%
if not exist scratch-build/terragear/NUL (
mkdir scratch-build\terragear
)
if not exist scratch-source/terragear-git/NUL (
IF NOT EXIST terragear-git/NUL (
mkdir terragear-build
echo Downloading TerraGear . . .
git clone -b next https://git.code.sf.net/p/flightgear/terragear scratch-source/terragear-git
) else (
git clone -b next https://git.code.sf.net/p/flightgear/terragear terragear-git
) ELSE (
echo Updating TerraGear . . .
cd scratch-source/terragear-git
cd terragear-git
git pull
)
cd %ROOT_DIR%
REM -DQt5Core_DIR=%QT5x64_CMAKE%/Qt5Core ^
REM -DQt5Gui_DIR=%QT5x64_CMAKE%/Qt5Gui ^
REM -DQt5OpenGL_DIR=%QT5x64_CMAKE%/Qt5OpenGL ^
REM -DQt5Widgets_DIR=%QT5x64_CMAKE%/Qt5Widgets ^
echo Compiling OpenSceneGraph . . .
cd %OSG_BUILD_PATH%
cmake ..\..\%OSG_SOURCE_PATH% -G %CMAKE_TOOLCHAIN% ^
-DCMAKE_CONFIGURATION_TYPES:STRING=Debug;Release ^
-DCMAKE_BUILD_TYPE:STRING=Release ^
-DCMAKE_INSTALL_PREFIX:PATH=%ROOT_DIR%/scratch-install ^
-DCMAKE_PREFIX_PATH:STRING=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib;%ROOT_DIR%/vcpkg-git/installed/x64-windows/debug/lib ^
ECHO Compiling OpenSceneGraph . . .
cd openscenegraph-3.4-build
cmake ..\openscenegraph-3.4-git -G %CMAKE_TOOLCHAIN% ^
-DACTUAL_3RDPARTY_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows ^
-DCMAKE_CONFIGURATION_TYPES=Debug;Release ^
-DCMAKE_INSTALL_PREFIX:PATH=%ROOT_DIR%/Stage ^
-DOSG_USE_UTF8_FILENAME:BOOL=1 ^
-DWIN32_USE_MP:BOOL=1 ^
-DCURL_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DCURL_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/libcurl.lib ^
-DCURL_LIBRARY_DEBUG:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/debug/lib/libcurl.lib ^
-DFREETYPE_INCLUDE_DIR_ft2build:PATH=%ROOT_DIR%/vcpkg-git/packages/freetype_x64-windows/include ^
-DFREETYPE_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/freetype.lib ^
-DFREETYPE_LIBRARY_DEBUG:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/debug/lib/freetyped.lib ^
-DGDAL_INCLUDE_DIR:PATH=%WT_GDAL_INCLUDE_DIR% ^
-DGDAL_LIBRARY:FILEPATH=%WT_GDAL_LIBRARY% ^
-DGDAL_LIBRARY_DEBUG:FILEPATH=%WT_GDAL_LIBRARY_DEBUG% ^
-DGLUT_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DGLUT_LIBRARY:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/freeglut.lib ^
-DGLUT_LIBRARY_DEBUG:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/debug/lib/freeglut.lib ^
-DJPEG_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DJPEG_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/jpeg.lib ^
-DJPEG_LIBRARY_DEBUG:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/debug/lib/jpeg.lib ^
-DLIBXML2_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DLIBXML2_LIBRARY:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/libxml2.lib ^
-DLIBXML2_LIBRARY_DEBUG:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/debug/lib/libxml2.lib ^
-DPNG_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DPNG_LIBRARY:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/libpng16.lib ^
-DPNG_LIBRARY_DEBUG:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/debug/lib/libpng16d.lib ^
-DSDL2_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DSDL2_LIBRARY:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/SDL2.lib ^
-DSDL2MAIN_LIBRARY:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/manual-link/SDL2main.lib ^
-DTIFF_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DTIFF_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/tiff.lib ^
-DTIFF_LIBRARY_DEBUG:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/debug/lib/tiffd.lib ^
-DZLIB_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DZLIB_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/zlib.lib ^
-DZLIB_LIBRARY_DEBUG:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/debug/lib/zlibd.lib
-DCURL_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DCURL_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/libcurl.lib ^
-DFREETYPE_INCLUDE_DIR_ft2build=%ROOT_DIR%/vcpkg-git/packages/freetype_x64-windows/include ^
-DFREETYPE_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DFREETPE_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/freetype.lib ^
-DGDAL_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DGDAL_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/gdal.lib ^
-DGLUT_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DGLUT_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/freeglut.lib ^
-DJPEG_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DJPEG_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/jpeg.lib ^
-DLIBXML2_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DLIBXML2_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/libxml2.lib ^
-DPNG_PNG_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DPNG_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/libpng16.lib ^
-DSDL2_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DSDL2_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/SDL2.lib ^
-DSDL2MAIN_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/manual-link/SDL2main.lib ^
-DTIFF_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DTIFF_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/tiff.lib ^
-DZLIB_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DZLIB_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/zlib.lib
cmake --build . --config Release --target INSTALL
cd %ROOT_DIR%
echo Compiling SimGear . . .
cd scratch-build\simgear
cmake ..\..\scratch-source\simgear-git -G %CMAKE_TOOLCHAIN% ^
-DCMAKE_CONFIGURATION_TYPES:STRING=Debug;Release ^
-DCMAKE_BUILD_TYPE:STRING=Release ^
-DMSVC_3RDPARTY_ROOT:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows ^
-DCMAKE_PREFIX_PATH:STRING=%ROOT_DIR%/scratch-install/lib;%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib ^
-DCMAKE_INCLUDE_PATH:STRING=%ROOT_DIR%/scratch-install/include;%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DCMAKE_INSTALL_PREFIX:PATH=%ROOT_DIR%/scratch-install ^
ECHO Compiling SimGear . . .
cd simgear-build
cmake ..\simgear-git -G %CMAKE_TOOLCHAIN% ^
-DCMAKE_BUILD_TYPE=Release ^
-DMSVC_3RDPARTY_ROOT=%ROOT_DIR%/vcpkg-git/installed/x64-windows ^
-DCMAKE_PREFIX_PATH:PATH=%ROOT_DIR%/Stage/lib;%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib ^
-DCMAKE_CONFIGURATION_TYPES=Debug;Release ^
-DCMAKE_INSTALL_PREFIX:PATH=%ROOT_DIR%/Stage ^
-DOSG_FSTREAM_EXPORT_FIXED:BOOL=1 ^
-DENABLE_GDAL:BOOL=1 ^
-DENABLE_OPENMP:BOOL=1 ^
-DUSE_AEONWAVE:BOOL=0 ^
-DBoost_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DBoost_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows ^
-DCURL_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DCURL_LIBRARY_DEBUG:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/debug/lib/libcurl.lib ^
-DCURL_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/libcurl.lib ^
-DGDAL_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DGDAL_LIBRARY:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/gdal.lib ^
-DOPENAL_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DOPENAL_LIBRARY:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/OpenAL32.lib ^
-DOPENTHREADS_INCLUDE_DIR:PATH=%ROOT_DIR%/scratch-install/include ^
-DOPENTHREADS_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/scratch-install/lib/OpenThreads.lib ^
-DOPENTHREADS_LIBRARY_DEBUG:FILEPATH= ^
-DOSGDB_INCLUDE_DIR:PATH=%ROOT_DIR%/scratch-install/include ^
-DOSGDB_LIBRARY_DEBUG:FILEPATH= ^
-DOSGDB_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/scratch-install/lib/osgDB.lib ^
-DOSGGA_INCLUDE_DIR:PATH=%ROOT_DIR%/scratch-install/include ^
-DOSGGA_LIBRARY_DEBUG:FILEPATH= ^
-DOSGGA_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/scratch-install/lib/osgGA.lib ^
-DOSGPARTICLE_INCLUDE_DIR:PATH=%ROOT_DIR%/scratch-install/include ^
-DOSGPARTICLE_LIBRARY_DEBUG:FILEPATH= ^
-DOSGPARTICLE_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/scratch-install/lib/osgParticle.lib ^
-DOSGSIM_INCLUDE_DIR:PATH=%ROOT_DIR%/scratch-install/include ^
-DOSGSIM_LIBRARY_DEBUG:FILEPATH= ^
-DOSGSIM_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/scratch-install/lib/osgSim.lib ^
-DOSGTEXT_INCLUDE_DIR:PATH=%ROOT_DIR%/scratch-install/include ^
-DOSGTEXT_LIBRARY_DEBUG:FILEPATH= ^
-DOSGTEXT_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/scratch-install/lib/osgText.lib ^
-DOSGUTIL_INCLUDE_DIR:PATH=%ROOT_DIR%/scratch-install/include ^
-DOSGUTIL_LIBRARY_DEBUG:FILEPATH= ^
-DOSGUTIL_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/scratch-install/lib/osgUtil.lib ^
-DOSGVIEWER_INCLUDE_DIR:PATH=%ROOT_DIR%/scratch-install/include ^
-DOSGVIEWER_LIBRARY_DEBUG:FILEPATH= ^
-DOSGVIEWER_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/scratch-install/lib/osgViewer.lib ^
-DOSG_INCLUDE_DIR:PATH=%ROOT_DIR%/scratch-install/include ^
-DOSG_LIBRARY_DEBUG:FILEPATH= ^
-DOSG_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/scratch-install/lib/osg.lib ^
-DZLIB_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DZLIB_LIBRARY_DEBUG:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/debug/lib/zlibd.lib ^
-DZLIB_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/zlib.lib
-DBOOST_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DBOOST_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows ^
-DCURL_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DCURL_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/libcurl.lib ^
-DGDAL_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DGDAL_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/gdal.lib ^
-DOPENAL_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DOPENAL_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/OpenAL32.lib ^
-DZLIB_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DZLIB_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/zlib.lib
cmake --build . --config Release --target INSTALL
cd %ROOT_DIR%
REM -DENABLE_GDAL:BOOL=1 ^
REM -DENABLE_OPENMP:BOOL=1 ^
REM -DUSE_AEONWAVE:BOOL=0 ^
echo Compiling FlightGear . . .
cd scratch-build\flightgear
cmake ..\..\scratch-source\flightgear-git -G %CMAKE_TOOLCHAIN% ^
-DCMAKE_CONFIGURATION_TYPES:STRING=Debug;Release ^
-DCMAKE_BUILD_TYPE:STRING=Release ^
-DMSVC_3RDPARTY_ROOT:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows ^
-DCMAKE_PREFIX_PATH:STRING=%ROOT_DIR%/scratch-install/lib;%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib;%QT5x64_LIB% ^
-DCMAKE_INCLUDE_PATH:STRING=%ROOT_DIR%/scratch-install/include;%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DCMAKE_INSTALL_PREFIX:PATH=%ROOT_DIR%/scratch-install ^
-DSimGear_DIR:PATH=%ROOT_DIR%/scratch-install/lib/cmake/SimGear ^
ECHO Compiling FlightGear . . .
cd flightgear-build
cmake ..\flightgear-git -G %CMAKE_TOOLCHAIN% ^
-DMSVC_3RDPARTY_ROOT=%ROOT_DIR%/vcpkg-git/installed/x64-windows ^
-DCMAKE_PREFIX_PATH:PATH=%ROOT_DIR%/Stage/lib;%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib;%QT5x64% ^
-DCMAKE_CONFIGURATION_TYPES=Debug;Release ^
-DCMAKE_INSTALL_PREFIX:PATH=%ROOT_DIR%/Stage ^
-DOSG_FSTREAM_EXPORT_FIXED:BOOL=1 ^
-DENABLE_GDAL:BOOL=1 ^
-DENABLE_OPENMP:BOOL=1 ^
-DENABLE_JSBSIM:BOOL=1 ^
-DENABLE_GPSSMOOTH:BOOL=1 ^
-DENABLE_FGVIEWER:BOOL=0 ^
-DENABLE_FGELEV:BOOL=0 ^
-DENABLE_FGVIEWER:BOOL=1 ^
-DENABLE_STGMERGE:BOOL=0 ^
-DWITH_FGPANEL:BOOL=0 ^
-DUSE_AEONWAVE:BOOL=0 ^
-DHAVE_CONFIG_H:BOOL=0 ^
-DBoost_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DBoost_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows ^
-DFREETYPE_INCLUDE_DIR_ft2build:PATH=%ROOT_DIR%/vcpkg-git/packages/freetype_x64-windows/include ^
-DFREETYPE_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/freetype.lib ^
-DFREETYPE_LIBRARY_DEBUG:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/debug/lib/freetyped.lib ^
-DGDAL_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DGDAL_LIBRARY:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/gdal.lib ^
-DOPENAL_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DOPENAL_LIBRARY:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/OpenAL32.lib ^
-DOPENTHREADS_INCLUDE_DIR:PATH=%ROOT_DIR%/scratch-install/include ^
-DOPENTHREADS_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/scratch-install/lib/OpenThreads.lib ^
-DOPENTHREADS_LIBRARY_DEBUG:FILEPATH= ^
-DOSGDB_INCLUDE_DIR:PATH=%ROOT_DIR%/scratch-install/include ^
-DOSGDB_LIBRARY_DEBUG:FILEPATH= ^
-DOSGDB_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/scratch-install/lib/osgDB.lib ^
-DOSGFX_INCLUDE_DIR:PATH=%ROOT_DIR%/scratch-install/include ^
-DOSGFX_LIBRARY_DEBUG:FILEPATH= ^
-DOSGFX_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/scratch-install/lib/osgFX.lib ^
-DOSGGA_INCLUDE_DIR:PATH=%ROOT_DIR%/scratch-install/include ^
-DOSGGA_LIBRARY_DEBUG:FILEPATH= ^
-DOSGGA_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/scratch-install/lib/osgGA.lib ^
-DOSGPARTICLE_INCLUDE_DIR:PATH=%ROOT_DIR%/scratch-install/include ^
-DOSGPARTICLE_LIBRARY_DEBUG:FILEPATH= ^
-DOSGPARTICLE_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/scratch-install/lib/osgParticle.lib ^
-DOSGSIM_INCLUDE_DIR:PATH=%ROOT_DIR%/scratch-install/include ^
-DOSGSIM_LIBRARY_DEBUG:FILEPATH= ^
-DOSGSIM_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/scratch-install/lib/osgSim.lib ^
-DOSGTEXT_INCLUDE_DIR:PATH=%ROOT_DIR%/scratch-install/include ^
-DOSGTEXT_LIBRARY_DEBUG:FILEPATH= ^
-DOSGTEXT_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/scratch-install/lib/osgText.lib ^
-DOSGUTIL_INCLUDE_DIR:PATH=%ROOT_DIR%/scratch-install/include ^
-DOSGUTIL_LIBRARY_DEBUG:FILEPATH= ^
-DOSGUTIL_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/scratch-install/lib/osgUtil.lib ^
-DOSGVIEWER_INCLUDE_DIR:PATH=%ROOT_DIR%/scratch-install/include ^
-DOSGVIEWER_LIBRARY_DEBUG:FILEPATH= ^
-DOSGVIEWER_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/scratch-install/lib/osgViewer.lib ^
-DOSG_INCLUDE_DIR:PATH=%ROOT_DIR%/scratch-install/include ^
-DOSG_LIBRARY_DEBUG:FILEPATH= ^
-DOSG_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/scratch-install/lib/osg.lib ^
-DPLIB_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DPLIB_FNT_LIBRARY_DEBUG:FILEPATH= ^
-DPLIB_FNT_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/plib_fnt.lib ^
-DPLIB_PUAUX_LIBRARY_DEBUG:FILEPATH= ^
-DPLIB_PUAUX_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/plib_puAux.lib ^
-DPLIB_PUI_LIBRARY_DEBUG:FILEPATH= ^
-DPLIB_PUI_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/plib_pui.lib ^
-DPLIB_SG_LIBRARY_DEBUG:FILEPATH= ^
-DPLIB_SG_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/plib_sg.lib ^
-DPLIB_UL_LIBRARY_DEBUG:FILEPATH= ^
-DPLIB_UL_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/plib_ul.lib ^
-DPNG_PNG_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DPNG_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/libpng16.lib ^
-DZLIB_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DZLIB_LIBRARY_DEBUG:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/debug/lib/zlibd.lib ^
-DZLIB_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/zlib.lib
-DFREETYPE_INCLUDE_DIR_ft2build=%ROOT_DIR%/vcpkg-git/packages/freetype_x64-windows/include ^
-DGDAL_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DGDAL_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/gdal.lib ^
-DOPENAL_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DOPENAL_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/OpenAL32.lib ^
-DPLIB_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DPNG_PNG_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DPNG_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/libpng16.lib ^
-DZLIB_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DZLIB_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/zlib.lib
cmake --build . --config Release --target INSTALL
cd %ROOT_DIR%
echo Compiling TerraGear . . .
cd scratch-build\terragear
cmake ..\..\scratch-source\terragear-git -G %CMAKE_TOOLCHAIN% ^
-DCMAKE_CONFIGURATION_TYPES:STRING=Debug;Release ^
-DCMAKE_BUILD_TYPE:STRING=Release ^
-DCMAKE_PREFIX_PATH:STRING=%ROOT_DIR%/scratch-install/lib;%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib;%QT5x64_LIB% ^
-DCMAKE_INCLUDE_PATH:STRING=%ROOT_DIR%/scratch-install/include;%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DCMAKE_INSTALL_PREFIX:PATH=%ROOT_DIR%/scratch-install ^
-DMSVC_3RDPARTY_ROOT:PATH= ^
-DBoost_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DBoost_LIBRARY_DIR_RELEASE:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib ^
-DCGAL_DIR:PATH=%ROOT_DIR%/vcpkg-git/buildtrees/cgal/x64-windows-rel ^
-DGDAL_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DGDAL_LIBRARY:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/gdal.lib ^
-DGMP_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DGMP_LIBRARIES_DIR:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib ^
-DJPEG_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DJPEG_LIBRARY_DEBUG:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/debug/lib/jpeg.lib ^
-DJPEG_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/jpeg.lib ^
-DMPFR_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DMPFR_LIBRARIES_DIR:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib ^
-DTIFF_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DTIFF_LIBRARY_DEBUG:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/debug/lib/tiffd.lib ^
-DTIFF_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/tiff.lib ^
-DZLIB_INCLUDE_DIR:PATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DZLIB_LIBRARY_DEBUG:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/debug/lib/zlibd.lib ^
-DZLIB_LIBRARY_RELEASE:FILEPATH=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/zlib.lib ^
-DSIMGEAR_INCLUDE_DIR:PATH=%ROOT_DIR%/scratch-install/include ^
-DSIMGEAR_CORE_LIBRARY_RELEASE=%ROOT_DIR%/scratch-install/lib/SimGearCore.lib ^
-DSIMGEAR_SCENE_LIBRARY_RELEASE=%ROOT_DIR%/scratch-install/lib/SimGearScene.lib
ECHO Compiling TerraGear . . .
cd terragear-build
cmake ..\terragear-git -G %CMAKE_TOOLCHAIN% ^
-DCMAKE_PREFIX_PATH:PATH=%ROOT_DIR%/Stage/lib;%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib;%QT5x64% ^
-DCMAKE_CONFIGURATION_TYPES=Debug;Release ^
-DCMAKE_INSTALL_PREFIX:PATH=%ROOT_DIR%/Stage ^
-DMSVC-3RDPARTY_ROOT= ^
-DBoost_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DBoost_LIBRARY_DIR_DEBUG=%ROOT_DIR%/vcpkg-git/installed/x64-windows/debug/lib ^
-DBoost_LIBRARY_DIR_RELEASE=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib ^
-DCGAL_DIR=%ROOT_DIR%/vcpkg-git/buildtrees/cgal/x64-windows-rel ^
-DGDAL_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DGDAL_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/gdal.lib ^
-DJPEG_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DJPEG_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/jpeg.lib ^
-DTIFF_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DTIFF_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/tiff.lib ^
-DZLIB_INCLUDE_DIR=%ROOT_DIR%/vcpkg-git/installed/x64-windows/include ^
-DZLIB_LIBRARY=%ROOT_DIR%/vcpkg-git/installed/x64-windows/lib/zlib.lib ^
-DSIMGEAR_INCLUDE_DIR=%ROOT_DIR%/Stage/include ^
-DSIMGEAR_CORE_LIBRARY=%ROOT_DIR%/Stage/lib/SimGearCore.lib ^
-DSIMGEAR_SCENE_LIBRARY=%ROOT_DIR%/Stage/lib/SimGearScene.lib
cmake --build . --config Release --target INSTALL
cd %ROOT_DIR%
REM TerraGear is expecting proj.dll instead of proj_4_9.dll, clone it so TG may find it.
for %%i in (vcpkg-git\installed\x64-windows\bin\proj*.dll) do copy /Y %%i scratch-install\bin\proj.dll
for %%i in (vcpkg-git\installed\x64-windows\bin\proj*.dll) do copy /Y %%i Stage\bin\proj.dll
echo All done!
ECHO All done!

View File

@@ -1,202 +0,0 @@
#!/bin/bash
# fg-from-scratch - Linux utility to download, compile, and stage TerraGear and its dependencies
# Copyright (C) 2018 Scott Giese (xDraconian) scttgs0@gmail.com
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
QT_SELECT=qt5
ROOT_DIR=${PWD}
PATH=${ROOT_DIR}/vcpkg-git/installed/x64-linux/bin:${PATH}
CMAKE_TOOLCHAIN="Ninja"
CHIPSET=$(gcc -march=native -Q --help=target | grep -- '-march=' | cut -f3)
QT5x64=$(qtpaths --install-prefix)
QT5x64_LIB=${QT5x64}/lib
QT5x64_CMAKE=${QT5x64_LIB}/cmake
QT5x64_PKGCONFIG=${QT5x64_LIB}/pkgconfig
export PKG_CONFIG_PATH=${ROOT_DIR}/scratch-install/lib64/pkgconfig:${ROOT_DIR}/vcpkg-git/installed/x64-linux/lib/pkgconfig:${QT5x64_PKGCONFIG}
echo ${QT5x64}
if [ ! -d "vcpkg-git" ]
then
echo Preparing to install external libraries via vcpkg . . .
git clone https://github.com/Microsoft/vcpkg.git vcpkg-git
echo Compiling vcpkg
cd vcpkg-git
./bootstrap-vcpkg.sh
echo Compiling external libraries . . .
./vcpkg install --triplet x64-linux boost cgal curl freeglut freetype glew jasper libxml2 openal-soft openssl plib sdl2 tiff zlib
else
echo Updating vcpkg . . .
cd vcpkg-git
PULL_RESULT=$(git pull)
if [ "${PULL_RESULT}" != "Already up to date." ]
then
echo Compiling vcpkg
./bootstrap-vcpkg.sh
fi
echo Updating external libraries . . .
./vcpkg update
./vcpkg upgrade --triplet x64-linux --no-dry-run
echo Compiling external libraries . . .
./vcpkg install --triplet x64-linux boost cgal curl freeglut freetype glew jasper libxml2 openal-soft openssl plib sdl2 tiff zlib
fi
cd ${ROOT_DIR}
if [ ! -d "scratch-source" ]
then
mkdir scratch-source
fi
if [ ! -d "scratch-build" ]
then
mkdir scratch-build
fi
if [ ! -d "scratch-install" ]
then
mkdir scratch-install
fi
if [ ! -d "scratch-build/openscenegraph-3.4" ]
then
mkdir scratch-build/openscenegraph-3.4
fi
if [ ! -d "scratch-source/openscenegraph-3.4-git" ]
then
echo Downloading OpenSceneGraph . . .
git clone -b OpenSceneGraph-3.4 https://github.com/openscenegraph/OpenSceneGraph.git scratch-source/openscenegraph-3.4-git
else
echo Updating OpenSceneGraph . . .
cd scratch-source/openscenegraph-3.4-git
git pull
fi
cd ${ROOT_DIR}
if [ ! -d "scratch-build/simgear" ]
then
mkdir scratch-build/simgear
fi
if [ ! -d "scratch-source/simgear-git" ]
then
echo Downloading SimGear . . .
git clone -b next https://git.code.sf.net/p/flightgear/simgear scratch-source/simgear-git
else
echo Updating SimGear . . .
cd scratch-source/simgear-git
git pull
fi
cd ${ROOT_DIR}
if [ ! -d "scratch-build/flightgear" ]
then
mkdir scratch-build/flightgear
fi
if [ ! -d "scratch-source/flightgear-git" ]
then
echo Downloading FlightGear . . .
git clone -b next https://git.code.sf.net/p/flightgear/flightgear scratch-source/flightgear-git
else
echo Updating FlightGear . . .
cd scratch-source/flightgear-git
git pull
fi
cd ${ROOT_DIR}
if [ ! -d "scratch-build/terragear" ]
then
mkdir scratch-build/terragear
fi
if [ ! -d "scratch-source/terragear-git" ]
then
echo Downloading TerraGear . . .
git clone -b next https://git.code.sf.net/p/flightgear/terragear scratch-source/terragear-git
else
echo Updating TerraGear . . .
cd scratch-source/terragear-git
git pull
fi
cd ${ROOT_DIR}
echo Compiling OpenSceneGraph . . .
cd scratch-build/openscenegraph-3.4
cmake ../../scratch-source/openscenegraph-3.4-git -G ${CMAKE_TOOLCHAIN} \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=${ROOT_DIR}/scratch-install \
-DCMAKE_PREFIX_PATH=${ROOT_DIR}/scratch-install/lib:${ROOT_DIR}/vcpkg-git/installed/x64-linux/lib:${QT5x64_LIB} \
-DCMAKE_CXX_FLAGS="-march=${CHIPSET} -mtune=${CHIPSET}" \
-DCMAKE_C_FLAGS="-march=${CHIPSET} -mtune=${CHIPSET}" \
-DBUILD_DOCUMENTATION:BOOL=1 \
-DBUILD_OSG_APPLICATIONS:BOOL=1 \
-DQt5Core_DIR=${QT5x64_CMAKE}/Qt5Core \
-DQt5Gui_DIR=${QT5x64_CMAKE}/Qt5Gui \
-DQt5OpenGL_DIR=${QT5x64_CMAKE}/Qt5OpenGL \
-DQt5Widgets_DIR=${QT5x64_CMAKE}/Qt5Widgets
cmake --build . --config Release --target install
cd ${ROOT_DIR}
echo Compiling SimGear . . .
cd scratch-build/simgear
cmake ../../scratch-source/simgear-git -G ${CMAKE_TOOLCHAIN} \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=${ROOT_DIR}/scratch-install \
-DCMAKE_PREFIX_PATH=${ROOT_DIR}/scratch-install/lib:${ROOT_DIR}/vcpkg-git/installed/x64-linux/lib:${QT5x64} \
-DCMAKE_CXX_FLAGS="-march=${CHIPSET} -mtune=${CHIPSET}" \
-DCMAKE_C_FLAGS="-march=${CHIPSET} -mtune=${CHIPSET}"
cmake --build . --config Release --target install
cd ${ROOT_DIR}
echo Compiling FlightGear . . .
cd scratch-build/flightgear
cmake ../../scratch-source/flightgear-git -G ${CMAKE_TOOLCHAIN} \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=${ROOT_DIR}/scratch-install \
-DCMAKE_PREFIX_PATH=${ROOT_DIR}/scratch-install/lib:${ROOT_DIR}/vcpkg-git/installed/x64-linux/lib:${QT5x64_LIB} \
-DCMAKE_CXX_FLAGS="-march=${CHIPSET} -mtune=${CHIPSET}" \
-DCMAKE_C_FLAGS="-march=${CHIPSET} -mtune=${CHIPSET}" \
-DOSG_FSTREAM_EXPORT_FIXED:BOOL=1 \
-DENABLE_JSBSIM:BOOL=1 \
-DENABLE_GPSSMOOTH:BOOL=1 \
-DENABLE_FGVIEWER:BOOL=1 \
-DENABLE_STGMERGE:BOOL=0 \
-DQt5Core_DIR=${QT5x64_CMAKE}/Qt5Core \
-DQt5Gui_DIR=${QT5x64_CMAKE}/Qt5Gui \
-DQt5LinguistTools_DIR=${QT5x64_CMAKE}/Qt5LinguistTools \
-DQt5Network_DIR=${QT5x64_CMAKE}/Qt5Network \
-DQt5Qml_DIR=${QT5x64_CMAKE}/Qt5Qml \
-DQt5Quick_DIR=${QT5x64_CMAKE}/Qt5Quick \
-DQt5Svg_DIR=${QT5x64_CMAKE}/Qt5Svg \
-DQt5Widgets_DIR=${QT5x64_CMAKE}/Qt5Widgets \
-DQt5_DIR=${QT5x64_CMAKE}/Qt5
cmake --build . --config Release --target install
cd ${ROOT_DIR}
echo Compiling TerraGear . . .
cd scratch-build/terragear
cmake ../../scratch-source/terragear-git -G ${CMAKE_TOOLCHAIN} \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=${ROOT_DIR}/scratch-install \
-DCMAKE_PREFIX_PATH=${ROOT_DIR}/scratch-install/lib:${ROOT_DIR}/vcpkg-git/installed/x64-linux/lib:${QT5x64_LIB} \
-DCMAKE_CXX_FLAGS="-march=${CHIPSET} -mtune=${CHIPSET}" \
-DCMAKE_C_FLAGS="-march=${CHIPSET} -mtune=${CHIPSET}"
cmake --build . --config Release --target install
cd ${ROOT_DIR}
echo All done!

View File

@@ -1,81 +0,0 @@
#!/usr/bin/env python3
#
# Script to summarize changes to fgaddon Aircraft based on svn activity.
#
# Primarily intended to provide a list of aircraft that have been significantly
# updated since the last release for the change log.
import os, sys
import os.path
import re
from collections import defaultdict
import subprocess
import math
import shlex
extensions = ["*", "xml", "nas", "ac", "png", "jpg"]
new_aircraft_list = []
updated_aircraft_list = []
if (len(sys.argv) != 4):
print("Summarize fgaddon/Aircraft changes in a given branch between two dates.")
print("")
print("Usage: " + sys.argv[0] + " <branch> <from> <to>")
print(" <branch>\tSVN branch to check (e.g trunk, branches/release-2020.3")
print(" <from> \tStart date (e.g. 2020-04-27)")
print(" <to> \tEnd date (e.g. 2020-10-11")
exit(1)
branch = sys.argv[1]
from_date = sys.argv[2]
to_date = sys.argv[3]
# Create a format string listing changes to all the file types above
tableformat = "{:<25}{:>4}"
for ext in extensions:
tableformat = tableformat + "{:>5}"
# Check an individual aircraft for changes since date and output them
def check_aircraft(aircraft):
# This command lists all the changed files since date for a given aircraft
svn_log = "svn log https://svn.code.sf.net/p/flightgear/fgaddon/" + branch + "/Aircraft/" + aircraft + " -r {" + from_date + "}:{" + to_date + "} -v -q"
process = subprocess.Popen(shlex.split(svn_log), stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
stdout, stderr = process.communicate()
# Now collect some data
count = []
for ext in extensions:
regexp = " [AM] .*\." + ext + "$"
count.append(len(re.findall(regexp, stdout, flags=re.MULTILINE)))
# Find completely new aircraft.
regexp = " A /.*/Aircraft/" + aircraft + "$"
new_aircraft = ""
if (re.findall(regexp, stdout, flags=re.MULTILINE)):
new_aircraft = "NEW"
new_aircraft_list.append(aircraft)
elif (count[0] > 100) :
updated_aircraft_list.append(aircraft)
# Only output if we have more than 100 changes or it's a new aircraft
if ((count[0] > 100) or (new_aircraft == "NEW")):
print(tableformat.format(aircraft, new_aircraft, count[0], count[1], count[2], count[3], count[4], count[5]))
svn_list = "svn list https://svn.code.sf.net/p/flightgear/fgaddon/" + branch + "/Aircraft/"
process = subprocess.Popen(shlex.split(svn_list), stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
stdout, stderr = process.communicate()
print(tableformat.format("Aircraft", "New?", extensions[0], extensions[1], extensions[2], extensions[3], extensions[4], extensions[5]))
aircraft_list = re.split("/\n", stdout)
for ac in aircraft_list:
check_aircraft(ac)
separator = ", "
print("\nNew Aircraft " + separator.join(new_aircraft_list))
print("Update Aircraft " + separator.join(updated_aircraft_list))
print("Total: New aircraft: " + str(len(new_aircraft_list)) + " Updated Aircraft: " + str(len(updated_aircraft_list)));

View File

@@ -1,25 +0,0 @@
#!/usr/bin/python
import os, sys, re, fnmatch
import hashlib, glob
def md5(fname):
hash_md5 = hashlib.md5()
with open(fname, "rb") as f:
for chunk in iter(lambda: f.read(4096), b""):
hash_md5.update(chunk)
return hash_md5.hexdigest()
filepath = sys.argv[1]
searchpath = sys.argv[2]
digest = md5(filepath)
print("Checking for " + digest)
wavfiles = glob.glob(searchpath + "/**/*.wav", recursive=True)
for f in wavfiles:
if (md5(f) == digest):
print(f)

2
fgdata

Submodule fgdata updated: 5981eb11fc...87133520e7

View File

@@ -1,35 +0,0 @@
#!/bin/bash
# libEvent uses absolute paths inside the dylibs on macOS. It's been politely
# suggested they switch to a more standard relative rpath scheme, but so far
# the maintainers are not keen, and instead recommend a post-build
# fix-up step using installnametool, so that's what this script does.
#
# see: https://github.com/libevent/libevent/issues/920
echo "Editing libEvent rpaths in: $1"
pushd $1
names="event|event_core|event_extra"
find -E . -type f -depth 1 \
-regex "\\./lib($names)"'-([0-9]+\.[0-9]+\.[0-9]+)\.dylib$' | \
while read filename; do
filename="${filename#./}" # get rid of the './'
# extract the version part using sed, yuck
version=$(printf "%s" "$filename" | sed -Ee 's@.*-([0-9]+\.[0-9]+\.[0-9]+)\.dylib$@\1@')
echo "Found: '$filename'. Version is: $version"
install_name_tool -id "@rpath/${filename}" ${filename}
# change primary and 'core' library references
# if a reference is not found, it's not touched, so we can apply these each time
install_name_tool -change "$PWD/libevent_core-$version.dylib" "@rpath/libevent_core-$version.dylib" ${filename}
install_name_tool -change "$PWD/libevent-$version.dylib" "@rpath/libevent-$version.dylib" ${filename}
done
popd
echo "Done fixing install names for libEvent"

View File

@@ -18,33 +18,21 @@ rm -rf $WORKSPACE/dist/include/simgear $WORKSPACE/dist/libSim* $WORKSPACE/dist/l
PATH=$PATH:$QTPATH
echo "Build path is: $PATH"
# this shoudl not be needed, since this is inside CMAKE_INSTALL_PREFIX, but seemed
# to be necessary all the same
#export PKG_CONFIG_PATH=$WORKSPACE/dist/lib/pkgconfig
cmakeCommonArgs="-G Ninja -DCMAKE_INSTALL_PREFIX:PATH=$WORKSPACE/dist -DCMAKE_BUILD_TYPE=RelWithDebInfo"
###############################################################################
echo "Starting on SimGear"
cmakeSimGearArgs=""
if [ $SG_USE_OPENALSOFT == '1' ]; then
echo "Requested ot build with OpenAL-soft"
cmakeSimGearArgs="-DUSE_OPENALSOFT:BOOL=ON"
fi
pushd sgBuild
cmake ${cmakeCommonArgs} ${cmakeSimGearArgs} ../simgear
cmake -DCMAKE_INSTALL_PREFIX:PATH=$WORKSPACE/dist -DCMAKE_BUILD_TYPE=RelWithDebInfo ../simgear
# compile
cmake --build . --target debug_symbols
cmake --build . --target install
# compile (with out-j for now, it's hitting process limits)
cmake --build .
if [ $? -ne '0' ]; then
echo "make simgear failed"
exit 1
fi
cmake --build . --target install
popd
################################################################################
@@ -57,22 +45,22 @@ else
FGBUILDTYPE=Nightly
fi
cmake -DFG_BUILD_TYPE=$FGBUILDTYPE -DENABLE_SWIFT:BOOL=ON ${cmakeCommonArgs} ../flightgear
cmake -DFG_BUILD_TYPE=$FGBUILDTYPE -DCMAKE_INSTALL_PREFIX:PATH=$WORKSPACE/dist -DCMAKE_BUILD_TYPE=RelWithDebInfo ../flightgear
cmake --build . --target debug_symbols
cmake --build . --target install
# compile (with out-j for now, it's hitting process limits)
cmake --build .
if [ $? -ne '0' ]; then
echo "make flightgear failed"
exit 1
fi
cmake --build . --target install
popd
chmod +x $WORKSPACE/dist/bin/osgversion
echo "Running symbol upload script"
./sentry-dSYM-upload-mac.sh
################################################################################

View File

@@ -4,7 +4,7 @@ require 'ERB'
require 'fileutils' #I know, no underscore is not ruby-like
include FileUtils
$osgLibs = ['osgFX', 'osgParticle', 'osg', 'osgGA', 'osgText', 'osgUtil', 'osgSim', 'osgViewer', 'osgDB', 'osgTerrain']
$osgLibs = ['osgFX', 'osgParticle', 'osg', 'osgGA', 'osgText', 'osgUtil', 'osgSim', 'osgViewer', 'osgDB']
$osgPlugins = ['ac', 'osg', 'freetype', 'imageio', 'rgb', 'txf', 'mdl', '3ds', 'dds']
# from http://drawingablank.me/blog/ruby-boolean-typecasting.html
@@ -43,6 +43,7 @@ $prefixDir=Dir.pwd + "/dist"
dmgDir=Dir.pwd + "/image"
srcDir=Dir.pwd + "/flightgear"
qmlDir=srcDir + "/src/GUI/qml"
puts "Erasing previous image dir"
`rm -rf #{dmgDir}`
@@ -68,9 +69,8 @@ osgPluginsDir=contents+"/PlugIns/osgPlugins"
# for writing copyright year to Info.plist
t = Time.new
fgCurrentYear = t.year
fgBundleIdentifier = "org.flightgear.mac"
fgVersion = File.read("#{srcDir}/flightgear-version").strip
fgVersion = File.read("#{srcDir}/version").strip
volName="\"FlightGear #{fgVersion}\""
if $isRelease
@@ -79,7 +79,6 @@ if $isRelease
else
dmgPath = Dir.pwd + "/output/FlightGear-#{fgVersion}-nightly.dmg"
dmgFullPath = Dir.pwd + "/output/FlightGear-#{fgVersion}-nightly-full.dmg"
fgBundleIdentifier = "org.flightgear.mac-nightly"
end
puts "Creating directory structure"
@@ -100,7 +99,7 @@ bins.each do |b|
`cp #{$prefixDir}/bin/#{b} #{outPath}`
end
puts "Copying OSG libraries"
puts "copying libraries"
$osgLibs.each do |l|
libFile = "lib#{l}.#{$osgSoVersion}.dylib"
`cp #{$prefixDir}/lib/#{libFile} #{$frameworksDir}`
@@ -110,24 +109,6 @@ end
libFile = "libOpenThreads.#{$openThreadsSoVersion}.dylib"
`cp #{$prefixDir}/lib/#{libFile} #{$frameworksDir}`
# DBus and libEvent needed for SWIFT
# Sentry is crash reporting
otherLibs = ['dbus-1.3', 'event_core-2.1.7','event-2.1.7', 'sentry']
otherLibs.each do |l|
`cp #{$prefixDir}/lib/lib#{l}.dylib #{$frameworksDir}`
end
# copy OpenAL, but ensure we use the correct dest name for the @rpath value
# this could be nicer but Jenkins 'archive artefacts' doesn't want to
# archive the symlink so we only get the fully versioned .dylib
# in the artefacts
`cp #{$prefixDir}/lib/libopenal.1.*.dylib #{$frameworksDir}/libopenal.1.dylib`
# copy LibLZMA from Homebrew XZ
`cp /usr/local/lib/liblzma.dylib #{$frameworksDir}`
$osgPlugins.each do |p|
pluginFile = "osgdb_#{p}.dylib"
`cp #{$prefixDir}/lib/osgPlugins/#{pluginFile} #{osgPluginsDir}`
@@ -172,20 +153,18 @@ if !$isRelease
puts "Notarizing DMG #{dmgPath}"
`xcrun altool --notarize-app \
--primary-bundle-id "#{fgBundleIdentifier}" \
--primary-bundle-id "org.flightgear.mac" \
--username "zakalawe@mac.com" \
--password "@keychain:FlightGearAppStoreConnectUserName" \
--file #{dmgPath}`
end
puts "Creating full image with data"
`rsync -a fgdata/ #{resourcesDir}/data`
# sign the entire bundle
puts "Signing full app: #{bundle}"
# re-sign the entire bundle
puts "Re-signing full app: #{bundle}"
`codesign --force #{codeSignArgs} --keychain #{$keychain} -s "#{$codeSignIdentity}" #{bundle}`
`rm -f #{dmgFullPath}`
@@ -194,11 +173,10 @@ puts "Signing full app: #{bundle}"
puts "Notarizing DMG #{dmgFullPath}"
`xcrun altool --notarize-app \
--primary-bundle-id "#{fgBundleIdentifier}" \
--primary-bundle-id "org.flightgear.mac" \
--username "zakalawe@mac.com" \
--password "@keychain:FlightGearAppStoreConnectUserName" \
--file #{dmgFullPath}`
puts "Packaging complete"

View File

@@ -1,129 +0,0 @@
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright (C) 2020 James Turner
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
import argparse
import locale
import os
import re
import sys
import textwrap
import lxml.etree as ET
import flightgear.meta.strutils as strutils
from flightgear.meta import sgprops
PROGNAME = os.path.basename(sys.argv[0])
def processCommandLine():
params = argparse.Namespace()
parser = argparse.ArgumentParser(
usage="""\
%(prog)s [OPTION ...] FGDATA
Copy weather scenario descriptions to the default translation XML""",
description="""\
""",
formatter_class=argparse.RawDescriptionHelpFormatter,
# I want --help but not -h (it might be useful for something else)
add_help=False)
parser.add_argument("fgdata", metavar="FGDATA",
help="""\
location of FGData""")
parser.add_argument("--help", action="help",
help="display this message and exit")
return parser.parse_args(namespace=params)
def insertInitialComment(root_elt, rel_input_path):
"""Insert an XML comment before element 'root_elt'."""
s = textwrap.dedent("""\
This file was automatically generated from {input_file} using the
{progname} script from FGMeta. Modifications should be done either in
{input_file} or in that script.""".format(
progname=PROGNAME,
input_file=os.path.join("$FG_ROOT", rel_input_path)))
filled_paragraph = textwrap.fill(s, width=79)
comment_pseudo_element = ET.Comment(
" !!! Don't modify this file manually. !!!\n" + filled_paragraph + " ")
root_elt.addprevious(comment_pseudo_element)
def stringifyChildValue(node, child):
# The 'or ""' is needed because an empty node is returned as None!
return strutils.simplify(node.getValue(child, "") or "")
def makeXmlLeaf(name, text):
"""Create an XML element with text contents."""
leaf = ET.Element(name)
leaf.text = '' if text is None else str(text)
return leaf
def copyWeatherScenarios(fgdata):
rel_input_path = os.path.join("Environment", "environment.xml")
environment_node = sgprops.readProps(os.path.join(fgdata, rel_input_path))
scenarios = environment_node.getChild('weather-scenarios')
root = ET.Element("PropertyList")
insertInitialComment(root, rel_input_path)
for scen_idx, scen_node in enumerate(scenarios.getChildren("scenario")):
scenarioId = scen_node.getValue("id", None)
if (not scenarioId) or scenarioId != strutils.simplify(scenarioId):
sys.exit(
"{prg}: 'scenario' element number {i} has a missing, empty "
"or suspiciously-formatted 'id' child; aborting.".format(
prg=PROGNAME, i=scen_idx+1))
name = stringifyChildValue(scen_node, "name")
desc = stringifyChildValue(scen_node, "description")
if not (name and desc):
sys.exit(
"{prg}: scenario '{scen}' has an empty or missing name or "
"description after string simplification; aborting.".format(
prg=PROGNAME, scen=scenarioId))
root.append(makeXmlLeaf(scenarioId + "-name", name))
root.append(makeXmlLeaf(scenarioId + "-desc", desc))
default_trans_file = os.path.join(fgdata, "Translations", "default",
"weather-scenarios.xml")
doc = ET.ElementTree(root)
doc.write(default_trans_file, encoding='utf-8',
xml_declaration=True, pretty_print=True)
def main():
global params
locale.setlocale(locale.LC_ALL, '')
params = processCommandLine()
copyWeatherScenarios(params.fgdata)
sys.exit(0)
if __name__ == "__main__": main()

View File

@@ -7,14 +7,13 @@
import os, sys, re, fnmatch
from subprocess import call
suffixes = ['dmg']
suffix = '.dmg'
release_version = "unknown"
if sys.argv[1] == 'windows':
suffixes = ['exe']
suffix = '.exe'
if sys.argv[1] == 'linux':
suffixes = ['tar.bz2', 'tar.xz', 'txz', 'AppImage']
suffix = '.tar.bz2'
isRelease = False
if len(sys.argv) > 2 and sys.argv[2] == 'release':
@@ -23,45 +22,37 @@ if len(sys.argv) > 2 and sys.argv[2] == 'release':
if len(sys.argv) > 3:
release_version = sys.argv[3]
print "are we doing an RC:" + str(isRelease)
sys.stdout.flush()
allSuffix = '*' + suffix
print "Wildcard pattern is:" + allSuffix
pattern = r'\w+-(?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)([\w-]*)' + suffix
sourceForgeUserHost = "jmturner@frs.sourceforge.net"
sftpCommandFile = "sftp-commands"
symbolDir = "/home/jenkins/symbols"
if isRelease:
publicRoot = "/var/www/downloads/builds/rc"
publicRoot = "/var/www/html/builds/rc"
incomingDir = "/home/jenkins/incoming"
sourceForgePath = "/home/frs/project/f/fl/flightgear/release-" + release_version + "/"
else:
publicRoot = "/var/www/downloads/builds/nightly"
publicRoot = "/var/www/html/builds/nightly"
incomingDir = "/home/jenkins/nightly-incoming"
sourceForgePath = "/home/frs/project/f/fl/flightgear/unstable/"
os.chdir(publicRoot)
def matchVersionWithSuffix(suffix, file):
pattern = r'\w+-(?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)([\w-]*)\.' + suffix
m = re.match(pattern, file)
if (m is None):
return None
return (m.group('major'), m.group('minor'), m.group('patch'))
def findFileVersion(dir):
for file in os.listdir(dir):
for suffix in suffixes:
if file.endswith(suffix):
v = matchVersionWithSuffix(suffix, file)
if v:
return v
if fnmatch.fnmatch(file, allSuffix):
m = re.match(pattern, file)
if (m is not None):
return (m.group('major'), m.group('minor'), m.group('patch'))
return None
incomingVer = findFileVersion(incomingDir)
if incomingVer is None:
print "No incoming files found matching suffixes:" + ', '.join(suffixes)
print "No incoming files found matching " + allSuffix
exit()
existingVer = findFileVersion('.')
@@ -75,40 +66,18 @@ oldFiles = []
incomingFiles = []
newFiles = []
# remove all files matching a suffix in the current director
# record removed files (except symlinks) in global-var
# oldFiles, so we could also remove them from SourceForge
def removeFilesMatching(suffix):
for file in os.listdir('.'):
if not fnmatch.fnmatch(file, '*' + suffix):
continue
if not os.path.islink(file):
oldFiles.append(file)
os.remove(file)
if versionChange:
print "Version number changing"
for suffix in suffixes:
removeFilesMatching(suffix)
if (sys.argv[1] == 'windows'):
removeFilesMatching('.pdb')
for file in os.listdir('.'):
if fnmatch.fnmatch(file, allSuffix):
if not os.path.islink(file):
oldFiles.append(file)
os.remove(file)
# collecting incoming files
for file in os.listdir(incomingDir):
for suffix in suffixes:
if file.endswith(suffix):
incomingFiles.append(file)
if (sys.argv[1] == 'windows') and fnmatch.fnmatch(file, "*.pdb"):
# manually copy PDBs, don't add to incoming files
srcFile = os.path.join(incomingDir, file)
os.rename(srcFile, file)
newFiles.append(file)
print "Incoming files:" + ', '.join(incomingFiles)
if fnmatch.fnmatch(file, allSuffix):
incomingFiles.append(file)
# copy and symlink
for file in incomingFiles:
@@ -116,23 +85,19 @@ for file in incomingFiles:
srcFile = os.path.join(incomingDir, file)
outFile = file
# insert -rc before file extension
if isRelease:
m = re.match(r'(\w+-\d+\.\d+\.\d+[\w-]*)\.(.*)', file)
outFile = m.group(1) + '-rc.' + m.group(2)
print "RC out name is " + outFile
# insert -rc before suffix
#if isRelease:
#m = re.match(r'(\w+-\d+\.\d+\.\d+[\w-]*)' + suffix, file)
#outFile = m.group(1) + '-rc' + suffix
#print "RC out name is " + outFile
os.rename(srcFile, outFile)
newFiles.append(outFile)
if not isRelease:
# symlink for stable web URL
m = re.match(r'(\w+)-\d+\.\d+\.\d+(-[\w-]+)?\.(.*)' , file)
if m.group(2):
latestName = m.group(1) + '-latest' + m.group(2) + '.' + m.group(3)
else:
latestName = m.group(1) + '-latest.' + m.group(3)
m = re.match(r'(\w+)-\d+\.\d+\.\d+-([\w-]+)' + suffix, file)
latestName = m.group(1) + '-latest-' + m.group(2) + suffix
print "Creating symlink from " + file + " to " + latestName
if os.path.exists(latestName):
@@ -140,6 +105,7 @@ for file in incomingFiles:
os.remove(latestName)
os.symlink(file, latestName)
# remove files from SF
#if len(oldFiles) > 0:
# f = open(sftpCommandFile, 'w')
@@ -154,12 +120,14 @@ for file in incomingFiles:
# os.remove(sftpCommandFile)
# upload to SourceForge
# for file in newFiles:
# print "Uploading " + file + " to SourceForge"
# print "Skipped until SF FRS is fixed"
# # sys.stdout.flush()
# # call(["scp", "-v", file, sourceForgeUserHost + ":" + sourceForgePath + file])
# # call(["rsync", "-e", "ssh", file, sourceForgeUserHost + ":" + sourceForgePath + file])
# # print "...Done"
# sys.stdout.flush()
for file in newFiles:
print "Uploading " + file + " to SourceForge"
call(["scp", file, sourceForgeUserHost + ":" + sourceForgePath + file])
if sys.argv[1] == 'windows':
print "Archiving PDB files"
for file in os.listdir(incomingDir):
if fnmatch.fnmatch(file, "*.pdb"):
srcFile = os.path.join(incomingDir, file)
outFile = os.path.join(symbolDir, file)
os.rename(srcFile, outFile)

View File

@@ -36,10 +36,6 @@ localization files in $FG_ROOT/Translations/<language_code>):
fg-update-translation-files --transl-dir="$FG_ROOT/Translations" \
merge-new-master $languages
Note: you may omit $languages in the fg-update-translation-files command if
you want to autodetect the FlightGear-nonQt.xlf files present in
$FG_ROOT/Translations.
Updating XLIFF files to reflect changes in the default translation
------------------------------------------------------------------
@@ -49,9 +45,6 @@ modified or removed, or categories added or removed[3]):
fg-update-translation-files --transl-dir="$FG_ROOT/Translations" \
merge-new-master $languages
Note: you may omit $languages in this command if you want to autodetect the
FlightGear-nonQt.xlf files present in $FG_ROOT/Translations.
Updating XLIFF files to mark or remove obsolete translated strings
------------------------------------------------------------------
@@ -60,14 +53,9 @@ To remove unused translated strings (not to be done too often in my opinion):
fg-update-translation-files --transl-dir="$FG_ROOT/Translations" \
remove-unused $languages
Notes:
- You may omit $languages in this command if you want to autodetect the
FlightGear-nonQt.xlf files present in $FG_ROOT/Translations.
- It is possible to replace 'remove-unused' with 'mark-unused' to just mark
the strings as not-to-be-translated; however, 'merge-new-master' presented
above already does that.
(you may replace 'remove-unused' with 'mark-unused' to just mark the strings
as not-to-be-translated, however 'merge-new-master' presented above already
does that)
Merging contents from an XLIFF file into another one
----------------------------------------------------

View File

@@ -1,48 +0,0 @@
Python code for FlightGear “meta” work
======================================
The `flightgear` directory contains FlightGear-specific Python 3 modules.
These modules are mostly of interest to FlightGear developers.
Telling your Python interpreter how to access the modules
---------------------------------------------------------
In order to run most of the Python scripts in FGMeta, your Python 3
installation must have the `/path/to/fgmeta/python3-flightgear` directory in
its `sys.path`. One way to do this is to use something like the following in
your shell setup:
export PYTHONPATH="/path/to/fgmeta/python3-flightgear"
This example uses Bourne-style syntax; adjust for your particular shell.
Several directories may be added this way using a colon separator on Unix, and
presumably a semicolon on Windows.
An alternative to setting `PYTHONPATH` is to add .pth files in special
directories of your Python installation(s). For instance, you can create a
file, say, `FlightGear-FGMeta.pth`, containing a single line (with no space at
the beginning):
/path/to/fgmeta/python3-flightgear
If you want the modules present in `/path/to/fgmeta/python3-flightgear` to be
accessible to a particular Python interpreter (say, a Python 3.8), simply put
the `.pth` file in `/path/to/python-install-dir/lib/python3.8/site-packages/`.
This can even be a virtual environment if you want. For the system Python
interpreters on Debian, you can put the `.pth` file in, e.g,
`/usr/local/lib/python3.8/dist-packages/`. Note that you may add more lines to
a `.pth` file in case you want to add other paths to the Python interpreter's
`sys.path`.
The scripts
-----------
Once you've done the above setup, the Python 3 scripts in FGMeta should run
fine. This concerns in particular scripts located in the following top-level
directories of FGMeta:
catalog Generation of aircraft catalogs
i18n Management of translations in FlightGear (i18n stands for
“internationalization”)

View File

@@ -27,7 +27,6 @@ import sys
import flightgear.meta.logging
import flightgear.meta.i18n as fg_i18n
from flightgear.meta.i18n import XliffFormatHandler
PROGNAME = os.path.basename(sys.argv[0])
@@ -46,7 +45,7 @@ def processCommandLine():
parser = argparse.ArgumentParser(
usage="""\
%(prog)s [OPTION ...] ACTION [LANGUAGE_CODE]...
%(prog)s [OPTION ...] ACTION LANGUAGE_CODE...
Update FlightGear XLIFF localization files.""",
description="""\
This program performs the following operations (actions) on FlightGear XLIFF
@@ -69,13 +68,6 @@ translation files (*.xlf):
In the XLIFF localization files corresponding to the specified
language(s), remove all translated strings that are marked as unused.
If no LANGUAGE_CODE is provided as an argument, then assuming $transl_dir
represents the value passed to --transl-dir, all directories $d such that a
file named FlightGear-nonQt.xlf is found in $transl_dir/$d will be acted on as
if they had been passed as LANGUAGE_CODE arguments (actually, the directory
$transl_dir/default is not considered as a candidate; it is simply skipped).
Typically, $transl_dir is /path/to/FGData/Translations.
A translated string that is marked as unused is still present in the XLIFF
localization file; it is just presented in a way that tells translators they
don't need to worry about it. On the other hand, when a translated string is
@@ -113,7 +105,7 @@ general on the short or mid-term: they only take some space.
remove those already marked as unused from the XLIFF
files corresponding to each given LANGUAGE_CODE (i.e.,
those that are not in the default translation)""")
parser.add_argument("lang_code", metavar="LANGUAGE_CODE", nargs="*",
parser.add_argument("lang_code", metavar="LANGUAGE_CODE", nargs="+",
help="""\
codes of languages to operate on (e.g., fr, en_GB, it,
es_ES...)""")
@@ -133,19 +125,11 @@ class MarkOrRemoveUnusedAction(enum.Enum):
mark, remove = range(2)
def langCodesToActOn():
"""Return an iterable of all language codes we were told to work on."""
if params.lang_code:
return params.lang_code
else:
return XliffFormatHandler.availableTranslations(params.transl_dir)
def markOrRemoveUnused(l10nResPoolMgr, action):
formatHandler = fg_i18n.XliffFormatHandler()
masterTransl = l10nResPoolMgr.readFgMasterTranslation().transl
for langCode in langCodesToActOn():
for langCode in params.lang_code:
xliffPath = formatHandler.defaultFilePath(params.transl_dir, langCode)
transl = formatHandler.readTranslation(xliffPath)
@@ -164,7 +148,7 @@ def mergeNewMaster(l10nResPoolMgr):
formatHandler = fg_i18n.XliffFormatHandler()
masterTransl = l10nResPoolMgr.readFgMasterTranslation().transl
for langCode in langCodesToActOn():
for langCode in params.lang_code:
xliffPath = formatHandler.defaultFilePath(params.transl_dir, langCode)
transl = formatHandler.readTranslation(xliffPath)
transl.mergeMasterTranslation(masterTransl, logger=logger)

View File

@@ -65,11 +65,7 @@ from .exceptions import FGPyException
dummyLogger = DummyLogger()
# Not including "atc", because it has no translation. Please keep this sorted.
CATEGORIES = ("menu", "options", "sys", "tips", "weather-scenarios")
# BASIC_CATEGORIES lists all categories handled by BasicL10NResourceManager.
# The corresponding master files must have a flat structure where each
# translatable string is found in a direct child of the <PropertyList> element.
BASIC_CATEGORIES = CATEGORIES
CATEGORIES = ("menu", "options", "sys", "tips")
# Directory name for the default (master) translation
DEFAULT_LANG_DIR = "default"
# Root of the base name for the default output files (XLIFF...)
@@ -87,7 +83,6 @@ FORMAT_HANDLERS_NAMES = []
# qttools/src/linguist/shared/numerus.cpp).
PLURAL_FORMS = {
None: ["<master>"], # for the default (= master) translation
"ca": ["singular", "plural"],
"de": ["singular", "plural"],
"en": ["singular", "plural"],
"es": ["singular", "plural"],
@@ -96,9 +91,6 @@ PLURAL_FORMS = {
"nl": ["singular", "plural"],
"pl": ["singular", "paucal", "plural"],
"pt": ["singular", "plural"],
"ru": ["singular", "plural"],
"sk": ["singular", "paucal", "plural"],
"tr": ["universal"],
"zh": ["universal"] # universal form
}
@@ -462,7 +454,7 @@ class TranslationUnit:
def _stringsKey(self):
"""Key used to compare the strings of two TranslationUnit instances."""
return (self.sourceText, self.targetTexts, self.developerComments,
return (self.self.sourceText, self.targetTexts, self.developerComments,
self.translatorComments)
def sameStrings(self, other):
@@ -584,25 +576,10 @@ class Translation:
return ''.join(l)
def __getitem__(self, cat):
"""Get all translations for a given category.
Return a mapping where each key is a tid (instance of a subclass
of AbstractTranslationUnitId) and each value a TranslationUnit
instance.
"""
return self.translations[cat]
def __setitem__(self, cat, mapping):
"""Replace all translations for a given category.
cat: a category name (string such as 'sys', 'options', etc.)
mapping: a mapping where each key is a tid (instance of a
subclass of AbstractTranslationUnitId) and each value a
TranslationUnit instance.
"""
self.translations[cat] = dict(mapping)
def __setitem__(self, cat, translUnit):
self.translations[cat] = translUnit
def __iter__(self):
return iter(self.translations)
@@ -1006,33 +983,6 @@ class AbstractFormatHandler(metaclass=abc.ABCMeta):
baseName = cls.defaultFileBaseName(targetLanguage)
return os.path.join(translationsDir, targetLanguage, baseName)
@classmethod
def availableTranslations(cls, translationsDir):
"""Return a list of all available translations in translationsDir.
This method expects a particular layout for translation files:
the one used in $FG_ROOT/Translations. More precisely, it looks
for all files named LANG_CODE/NAME in translationsDir, where
NAME is cls.defaultFileBaseName(LANG_CODE). The special
directory translationsDir/DEFAULT_LANG_DIR is not explored;
thus, the result cannot contain DEFAULT_LANG_DIR.
Return a list of language codes, sorted with list.sort().
"""
res = []
with os.scandir(translationsDir) as it:
for entry in it:
if (entry.name != DEFAULT_LANG_DIR and entry.is_dir() and
os.path.isfile(
os.path.join(
translationsDir, entry.name,
cls.defaultFileBaseName(entry.name)))):
res.append(entry.name)
res.sort()
return res
@abc.abstractmethod
def writeTranslation(self, transl, filePath):
"""Write a Translation instance to a file."""
@@ -1374,16 +1324,14 @@ class XliffFormatReader:
if sourceText is not None:
raise XliffParseError(
"{file}: several 'source' elements inside the same "
"'trans-unit' element ({id})".format(
file=self.file, id=tid))
"'trans-unit' element".format(file=self.file))
sourceText = self._handleSourceOrTargetNode(subnode, node.tag)
elif subnode.tag == self.qualTagName("target"):
if targetText is not None:
raise XliffParseError(
"{file}: several 'target' elements inside the same "
"'trans-unit' element ({id})".format(
file=self.file, id=tid))
"'trans-unit' element".format(file=self.file))
targetText = self._handleSourceOrTargetNode(subnode, node.tag)
elif subnode.tag == self.qualTagName("note"):
@@ -1395,8 +1343,8 @@ class XliffFormatReader:
if sourceText is None:
raise XliffParseError(
"{file}: invalid 'trans-unit' element ({id}): doesn't contain "
"any 'source' element".format(file=self.file, id=tid))
"{file}: invalid 'trans-unit' element: doesn't contain any "
"'source' element".format(file=self.file))
# The 'else' clause handles two cases: no <target> element, or an empty
# one.
@@ -1409,17 +1357,16 @@ class XliffFormatReader:
if self.insidePluralGroup:
if pluralIndex is None:
raise XliffParseError(
"{file}: invalid plural group for '{id}': the id attribute "
"value for each form must end with the form's plural index "
"inside brackets (an integer)".format(
file=self.file, id=tid))
"{file}: invalid plural group: the id attribute value for "
"each form must end with the form's plural index inside "
"brackets (an integer)".format(file=self.file))
# Related plural forms will be merged into one TranslationUnit when
# the containing <group restype="x-gettext-plurals"> ends.
self.pluralGroupContents.append((tid, pluralIndex, translUnit))
elif tid.cat not in self.transl:
raise XliffParseError(
"{file}: unknown category '{cat}' for '{id}'"
.format(file=self.file, cat=tid.cat, id=tid))
"{file}: unknown category: '{cat}'"
.format(file=self.file, cat=tid.cat))
# Source text empty + inside an x-gettext-msgctxt -> context dev comment
# (this is how Qt Linguist works)
elif (not sourceText and
@@ -1707,8 +1654,10 @@ registerFormatHandler("xliff", XliffFormatHandler)
# Could also be a dict
def L10nResMgrForCat(category):
"""Map from category/resource name to L10NResourceManager class."""
if category in BASIC_CATEGORIES:
if category in ("menu", "options", "tips"):
return BasicL10NResourceManager
elif category == "sys":
return SysL10NResourceManager
else:
assert False, "unexpected category: {!r}".format(category)
@@ -1749,8 +1698,8 @@ class L10NResourcePoolManager:
"""
resMgr = L10nResMgrForCat(cat)
return resMgr.readFgResourceFile(xmlFilePath, None, targetTransl, cat,
None, logger=self.logger)
return resMgr._readFgResourceFile(xmlFilePath, None, targetTransl, cat,
None, logger=self.logger)
def readFgTranslationFile(self, xmlFilePath, masterTransl, targetTransl,
cat, langCode):
@@ -1764,9 +1713,9 @@ class L10NResourcePoolManager:
"""
resMgr = L10nResMgrForCat(cat)
return resMgr.readFgResourceFile(xmlFilePath, masterTransl,
targetTransl, cat, langCode,
logger=self.logger)
return resMgr._readFgResourceFile(xmlFilePath, masterTransl,
targetTransl, cat, langCode,
logger=self.logger)
def readFgMasterTranslation(self):
"""Read the FlightGear default translation.
@@ -1894,7 +1843,7 @@ class L10NResourceManagerBase:
class BasicL10NResourceManager(L10NResourceManagerBase):
"""Resource manager for FG XML i18n files with the simplest structure.
This is suitable for resources (menu, options, tips, etc.) where
This is suitable for resources (menu, options, tips) where
translations are in direct children of the <PropertyList> element,
with no more structure.
@@ -1902,22 +1851,13 @@ class BasicL10NResourceManager(L10NResourceManagerBase):
@classmethod
def _findMainNode(cls, rootNode):
"""
Return the node directly containing the translations in an FG XML file.
This method was added when sys.xml had all its useful contents
inside a 'splash' top-level node, instead of having a flat
structure like the other FG XML i18n files (options.xml,
menu.xml, etc.). At that time, we thus had a
SysL10NResourceManager class derived from this class only to
override this method.
"""
Return the node directly containing the translations in an FG XML file."""
assert rootNode.tag == "PropertyList", rootNode.tag
return rootNode
@classmethod
def readFgResourceFile(cls, xmlFilePath, masterTransl, targetTransl, cat,
langCode, logger=dummyLogger):
def _readFgResourceFile(cls, xmlFilePath, masterTransl, targetTransl, cat,
langCode, logger=dummyLogger):
"""Read a FlightGear XML localization file.
If 'masterTransl' and 'langCode' are None, read the default
@@ -1969,3 +1909,17 @@ class BasicL10NResourceManager(L10NResourceManagerBase):
[text], isPlural=isPlural, logger=logger)
return nbWhitespaceProblems
class SysL10NResourceManager(BasicL10NResourceManager):
@classmethod
def _findMainNode(cls, rootNode):
"""
Return the node directly containing the translations in sys.xml."""
assert rootNode.tag == "PropertyList", rootNode.tag
# In sys.xml, all translations are inside a <splash> element
mainNode = rootNode.find("splash")
assert mainNode is not None
return mainNode

View File

@@ -1,32 +0,0 @@
# -*- coding: utf-8 -*-
# strutils.py --- Convenient string helpers
# Copyright (C) 2020 Florent Rougon
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
import re
_simplifyString_cre = re.compile(r"[ \t\n\r]+")
def simplify(s):
"""Strip and replace every internal run of whitespace with a single space.
In this case, “whitespace” is defined as anything matching the
regular expression '[ \t\n\r]+'.
"""
return _simplifyString_cre.sub(" ", s.strip())

View File

@@ -1,13 +0,0 @@
The tests can be run this way:
cd python3-flightgear
python3 -m unittest
If you want to be more specific:
cd python3-flightgear
python3 -m unittest flightgear.meta.tests.test_catalog
python3 -m unittest flightgear.meta.tests.test_sgprops
python3 -m unittest flightgear.meta.tests.test_catalog.UpdateCatalogTests
python3 -m unittest flightgear.meta.tests.test_catalog.UpdateCatalogTests.test_scan_set
etc.

View File

@@ -1,28 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--Template catalog - copy and modify for your site as required-->
<PropertyList>
<local-output>/home/curt/Projects/FlightGear/ftp/Aircraft</local-output>
<download-url n="0">http://mirrors.ibiblio.org/flightgear/ftp/Aircraft/</download-url>
<thumbnail-url n="0">http://mirrors.ibiblio.org/flightgear/ftp/Aircraft/thumbnails</thumbnail-url>
<scm>
<type>svn</type>
<path>/home/curt/Projects/FlightGear/flightgear-fgaddon/Aircraft</path>
<skip>NTPS</skip>
<skip>c172</skip>
<skip>tu134</skip>
</scm>
<include-dir>/home/curt/Projects/FlightGear/flightgear-fgdata</include-dir>
<include-dir>/home/curt/Projects/FlightGear/flightgear-fgaddon</include-dir>
<!-- <scm>
<type>git</type>
<update type="bool">false</update>
<path>/Users/jmt/FGFS/fgdata</path>
<url>git://git.code.sf.net/p/flightgear/fgdata</url>
</scm> -->
<upload n="0">
<enabled type="bool">true</enabled>
<type>rsync-ssh</type>
<remote>fgfs:/home/fgfs/fgfs.goneabitbursar.com/official</remote>
</upload>
</PropertyList>

View File

@@ -1,516 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<PropertyList>
<aircraft_14bis>8a4ea48a3bb83b608386f942a85100c9</aircraft_14bis>
<aircraft_21>057bfdb3c3fcfba3f8d31723a77df277</aircraft_21>
<aircraft_707>088f6c3850d9c3f8e94ced2bfc2a65db</aircraft_707>
<aircraft_717>abc393890f7ab49f32c6a2adc01b7823</aircraft_717>
<aircraft_727-230>8e93ee83c42f77db9881f9ca0f00cf8b</aircraft_727-230>
<aircraft_737-100>45fc009e9323de75e477b2548c79cb9a</aircraft_737-100>
<aircraft_737-200>3fb8820c373e78bcd52981293e2d46e8</aircraft_737-200>
<aircraft_737-300>c974d9b2e7c5feba195563433a4c5bc2</aircraft_737-300>
<aircraft_737NG>dd9ab7cb3fb27a4acfc7b634fa9ec396</aircraft_737NG>
<aircraft_747>5779ec5bdab4e9405d0db447c5a73df4</aircraft_747>
<aircraft_747-200>e3565e459436a5e4dcdd260a095c28b2</aircraft_747-200>
<aircraft_747-400>ce6c904cb23df6337ed6bdc1dcf6d68e</aircraft_747-400>
<aircraft_747-8i>92161d0ef86048c0c859241abd64ffcd</aircraft_747-8i>
<aircraft_757-200>9f5841317f4ed65fc815517c6770affd</aircraft_757-200>
<aircraft_767-300>89c1b762b8b58fee4772a94d3c9b81d8</aircraft_767-300>
<aircraft_777>693bf6470439f876edced4bd558b69a1</aircraft_777>
<aircraft_787-8>f450b755c5bad640d8c2ef7312b1a6fb</aircraft_787-8>
<aircraft_A-10>4aaca65794466d8cbf8e9ab29ef1b47b</aircraft_A-10>
<aircraft_A-26-Invader>c57f1d877e851f2164f292997508dd36</aircraft_A-26-Invader>
<aircraft_A-6E>86b52be36911fd0ee5d0b93d4b70a087</aircraft_A-6E>
<aircraft_A24-Viking>904f23999e33d323d3f7a09c1807b71a</aircraft_A24-Viking>
<aircraft_A300>3ae04898384a6531fa2edac2fcd508e9</aircraft_A300>
<aircraft_A320-family>c9ec3df5ce80cbbbec9e39a849877ceb</aircraft_A320-family>
<aircraft_A340-600>f015a7d2c8bde1224298261ae34e04c2</aircraft_A340-600>
<aircraft_A380>4951432b9d39c142e891da3209e3ad32</aircraft_A380>
<aircraft_a4>f175e90ccf2c3ae5118cf6eb1a43867e</aircraft_a4>
<aircraft_A6M2>dfb5b7f4f7233d854dca45ae4521e080</aircraft_A6M2>
<aircraft_Aermacchi-MB-339>f6757f3a4f78364c0439fd7d488c4330</aircraft_Aermacchi-MB-339>
<aircraft_Aero-Commander>021be8bd26c7aa03093e5e356d8c7ef2</aircraft_Aero-Commander>
<aircraft_Aerocar>89c4f1663f6b65ca1f70184dd8886f8b</aircraft_Aerocar>
<aircraft_Aerostar-700>9049ec76bddd80abff57a837313771d8</aircraft_Aerostar-700>
<aircraft_AG-14>4f9c9c24e662036de1cd85ed528c3d4e</aircraft_AG-14>
<aircraft_Aichi-D3A>766eb03f38f36190de94422b5481ce4b</aircraft_Aichi-D3A>
<aircraft_Aichi-M6A>14219343b589d8610da96f7a8ec16cdc</aircraft_Aichi-M6A>
<aircraft_Airco-DH2>67689844de14068b7e95e675c0da6c17</aircraft_Airco-DH2>
<aircraft_AirCrane>44fd70dc27b3d36bbde5766ac528d095</aircraft_AirCrane>
<aircraft_Airspeed-Horsa>dae16af174310b492c4412e0c77593e8</aircraft_Airspeed-Horsa>
<aircraft_airwaveXtreme150>64c7f53c6dac1b4da3813661f7455faf</aircraft_airwaveXtreme150>
<aircraft_Albatros-BII>7ccb293d5808ca0b9c48271a6398de94</aircraft_Albatros-BII>
<aircraft_Albatross>61af35090bbc722076353d1496c2d82f</aircraft_Albatross>
<aircraft_Allegro-2000>edae78dee86c3c0cb741bc4ea8793162</aircraft_Allegro-2000>
<aircraft_Alouette-II>94d5008f7bbfb65a56cff0694983d8ff</aircraft_Alouette-II>
<aircraft_Alouette-III>c267be9f90def2460ff53649c6fee2f0</aircraft_Alouette-III>
<aircraft_Alphajet>3fd4701f2363c41de0374c4703b88e83</aircraft_Alphajet>
<aircraft_AN-225>87a1ad2288b56c71559549d55b93cccd</aircraft_AN-225>
<aircraft_an2>37ccf863b017f0b773885619a671f8f7</aircraft_an2>
<aircraft_an24b>3e26ca3bf5296630eebbcd82859d5ac4</aircraft_an24b>
<aircraft_ANT-20>add26dd267eca688d4a88b672749a155</aircraft_ANT-20>
<aircraft_Antoinette>75e69854bf9d09d16cbd5147926ba7fd</aircraft_Antoinette>
<aircraft_Antonov-An-12>457f71d5be8ec8c3e42c6919b226b549</aircraft_Antonov-An-12>
<aircraft_Antonov-An-22>4a27ba4bb53f82bf2a4b325cd3405a89</aircraft_Antonov-An-22>
<aircraft_apache>b7e3e73c98d17006e984e056442c29ce</aircraft_apache>
<aircraft_AR-234>c0c500c55706fc18d93817ebc3b6e83b</aircraft_AR-234>
<aircraft_Arsenal-VG33>c883cde7942cdcfb8cd69c135c4d29f7</aircraft_Arsenal-VG33>
<aircraft_Arup-S2>70db9ed1cb09e1442e22d020a9dc3069</aircraft_Arup-S2>
<aircraft_as332>c62f9ee3f78c98a6342a6a337089fd10</aircraft_as332>
<aircraft_ASK13>264d821437a558cf71c9209f466f6103</aircraft_ASK13>
<aircraft_ASK21>27923bdc9f0f3ae3449f5d7a17744da5</aircraft_ASK21>
<aircraft_ASK21-MI>023bbe168eb0babb4a68963edffc273b</aircraft_ASK21-MI>
<aircraft_asw20>0926a8a021c4e11fa2610cbb5f6f11b3</aircraft_asw20>
<aircraft_ATC>846d8156216e434e789f5d2b7432b68f</aircraft_ATC>
<aircraft_ATC-ML>887c1bc8ab679604031f983ab6c67974</aircraft_ATC-ML>
<aircraft_ATI-Resolution>915cd6323c113bb2a8b57e4c08900f3e</aircraft_ATI-Resolution>
<aircraft_ATR-72-500>c0fe4169db9a338f5beec102f1efe301</aircraft_ATR-72-500>
<aircraft_Avro-Arrow>4b2acc554752df97194e0da1a1c8638c</aircraft_Avro-Arrow>
<aircraft_AVRO-IV-Triplane>9d3c4b4b66a7140628b79c4f142cc0f4</aircraft_AVRO-IV-Triplane>
<aircraft_Avro-Lancaster>611d6172991766b32a43d19bfb06bbb2</aircraft_Avro-Lancaster>
<aircraft_B-17>7cf94e2ee2c76783bf17c845e12e48cb</aircraft_B-17>
<aircraft_B-1B>6407f6fd1bfe031b280639d20dfe100f</aircraft_B-1B>
<aircraft_B-2>04db71541bc7099383524080a2c64012</aircraft_B-2>
<aircraft_B-24-Liberator>2bdd09054c9c92088ff297d6358a05a8</aircraft_B-24-Liberator>
<aircraft_B-25>51c6e9397e1e8fff65eb1d1671d18067</aircraft_B-25>
<aircraft_B-36D-Peacemaker>3d1883d3213d2b5f7d39ec5221cd4eb2</aircraft_B-36D-Peacemaker>
<aircraft_B-52F>d172dc57ce4e2c15f7f550a5c0c734a8</aircraft_B-52F>
<aircraft_b1900d>db7301be7b428db2070e27a5fe7ee06e</aircraft_b1900d>
<aircraft_b26>a71912ae798780eba390f9b27638b139</aircraft_b26>
<aircraft_b29>7dd2ae465a7710921d11c6c18aa0c0e7</aircraft_b29>
<aircraft_BAC-TSR2>6aaa660040bd40facf28fc68220b3cfc</aircraft_BAC-TSR2>
<aircraft_BAe-125>2a3387f97647ad875060bac1284cfcbd</aircraft_BAe-125>
<aircraft_Beagle-Pup>46a6f17c638e177421d1afc559b9d66a</aircraft_Beagle-Pup>
<aircraft_beaufighter>50af4a2d301fafb2a3e13fe96e9215be</aircraft_beaufighter>
<aircraft_beech99>6395fcaf780d6e43b4dd9f215a24e718</aircraft_beech99>
<aircraft_Beechcraft-C18S>5a133a789694642b9f3e611ddf23d3d6</aircraft_Beechcraft-C18S>
<aircraft_Beechcraft-Staggerwing>b668b91e67ef10757839da013faee44b</aircraft_Beechcraft-Staggerwing>
<aircraft_Bell-222X>635dc4a39a43814f2885d59b1dda8a9d</aircraft_Bell-222X>
<aircraft_Bell-P-39>aba5e103f315014925dff3b39bd2d648</aircraft_Bell-P-39>
<aircraft_Bell-P-59>ba6e32553464e03fe6392303a2072631</aircraft_Bell-P-59>
<aircraft_Bell-X1>3c10ccdf2775cad485bb394d5b1e56eb</aircraft_Bell-X1>
<aircraft_Bell-XFL-1>167d03a6eafc1a3780f6fdf733fc7c6e</aircraft_Bell-XFL-1>
<aircraft_Bernard-HV220>0579472d3185c8beba310aef9bf65f5d</aircraft_Bernard-HV220>
<aircraft_bf109>cb732caa641493f07c4cc564018dd481</aircraft_bf109>
<aircraft_Bleriot-125>21b170a0f9dae055d5c1d1af9946515e</aircraft_Bleriot-125>
<aircraft_Bleriot-5190>4fdcfd3aa209318c07c779e408e81df2</aircraft_Bleriot-5190>
<aircraft_Bleriot-SPAD-S.510>aef8c5f5f68349a7ae804df1d6d07e3f</aircraft_Bleriot-SPAD-S.510>
<aircraft_bleriot-XI>e499504fcba1e95e0cca9c4418bfee23</aircraft_bleriot-XI>
<aircraft_bluebird>a9af2d04a1e7bf279d135a4a06b11181</aircraft_bluebird>
<aircraft_bo105>506a63476d00ef552b8adc3260ba1fa4</aircraft_bo105>
<aircraft_bocian>9a3fd12ef60228dca05efa4ff694a882</aircraft_bocian>
<aircraft_Boeing-247>152fcac32e4bb9f7fce5b6894b6da08b</aircraft_Boeing-247>
<aircraft_Boeing-P26>97a640a4f9eddc33ac626f78adfaecb9</aircraft_Boeing-P26>
<aircraft_Boeing314>f00599943616e14682c2baea90e6173a</aircraft_Boeing314>
<aircraft_Bombardier-415>787d13e37c31fbf894d5a25091e4befc</aircraft_Bombardier-415>
<aircraft_Br-761>78d4695d2466f50d3c45e0374809b386</aircraft_Br-761>
<aircraft_Brabazon>6d0e61e40af698ea72e2978ed50e3a49</aircraft_Brabazon>
<aircraft_Breda-B.Z.308>b3e9444c45cc9c445961b726429c0c7e</aircraft_Breda-B.Z.308>
<aircraft_Breguet-XIX>a230231691ebc4df86e7d645f31a0f07</aircraft_Breguet-XIX>
<aircraft_Buccaneer>84362d957e9dae0e5abc70ba4cb9816e</aircraft_Buccaneer>
<aircraft_Bugatti>311a00f90c55c01980688c1d5504df64</aircraft_Bugatti>
<aircraft_Burnelli-CBY-3>cb75a6990af600c666b02398cf77d6d1</aircraft_Burnelli-CBY-3>
<aircraft_BV-141>a191302bdfb1faff1c6f2dd8a5494381</aircraft_BV-141>
<aircraft_BV-170>258b971dd3041a49a816a2150d7e7125</aircraft_BV-170>
<aircraft_C-160-Transall>695ce9bf3221055eecd24be01acb57e2</aircraft_C-160-Transall>
<aircraft_C-2A>3c341ded96ce7c8832738c34c5c115f8</aircraft_C-2A>
<aircraft_C130>c954a3ab900676c0cbabb1bada93754b</aircraft_C130>
<aircraft_c150>270cabd6289080468d29a807f612cb4c</aircraft_c150>
<aircraft_c172r>60bb07c7cefe930145d4b199b63842a7</aircraft_c172r>
<aircraft_c182>fd61954ffdd247b47fec0fc9074aa40b</aircraft_c182>
<aircraft_c182rg>171f7d74d45a50804c8111f5fab29543</aircraft_c182rg>
<aircraft_c310>604cd9887e8f1c9011581348feca1e3c</aircraft_c310>
<aircraft_c310u3a>80756d598e81a6a09217da9025e6284f</aircraft_c310u3a>
<aircraft_C460>b465d263b244c5860ce010371032b5d3</aircraft_C460>
<aircraft_C561>60cb1a6effe4e0023edd1bfdc109aed3</aircraft_C561>
<aircraft_C684>e2881ea7546775db6847bb3890c04a03</aircraft_C684>
<aircraft_Campini-Caproni-N1>68ec43ed98164bef020452e3758ec22f</aircraft_Campini-Caproni-N1>
<aircraft_CanberraBI8>a865e922bec69cf8a6fe1f8d53dbc71b</aircraft_CanberraBI8>
<aircraft_Cap10B>4a7cb6a6f5f6d71d5eb2da025b42d71f</aircraft_Cap10B>
<aircraft_Cap10C>bd103f5fa8a8ac980b8c4ed3a041ff6b</aircraft_Cap10C>
<aircraft_Caproni-C22J>d4eb3933d210d1a8f1deaf8b43a65960</aircraft_Caproni-C22J>
<aircraft_Caproni-Ca3>0ad6cdbf91f37b6c71f94268914d2615</aircraft_Caproni-Ca3>
<aircraft_Caproni-Stipa>d94119914089db0f7b6d43ddf20cb302</aircraft_Caproni-Stipa>
<aircraft_Caravelle>826b017ad5bc1c77c65959367f41415f</aircraft_Caravelle>
<aircraft_Carreidas>4cc78b3c9c421c382b4e197de6589535</aircraft_Carreidas>
<aircraft_Caudron-G3>6c8b251c720301a00276f91db736ee85</aircraft_Caudron-G3>
<aircraft_Caudron-G4>28ebd3b1236a53a0b15bf9c6f5cc79d6</aircraft_Caudron-G4>
<aircraft_Cessna-208-Caravan>edbaa02c5b837b9522ad8d0fd7da81e8</aircraft_Cessna-208-Caravan>
<aircraft_Cessna-421-Golden-Eagle>e16b7b135dbe3fa75539931c950116b6</aircraft_Cessna-421-Golden-Eagle>
<aircraft_Cessna337>bf3b60a808daefd7b7374f934e7b10bf</aircraft_Cessna337>
<aircraft_ch47>d46d6e08cd90412088abffe2dbd03982</aircraft_ch47>
<aircraft_ch53e>55d564ff1b335a723d144e423b9a3c10</aircraft_ch53e>
<aircraft_Cirrus-SR22>a3bbd80a8c11bea16f567eafa898db8f</aircraft_Cirrus-SR22>
<aircraft_Citation>c6f74c5596f959608e1810004abba534</aircraft_Citation>
<aircraft_Citation-Bravo>a6743e193bb01776107fec98595555e4</aircraft_Citation-Bravo>
<aircraft_CitationX>8bf718df53a6af7777f087a302641061</aircraft_CitationX>
<aircraft_Coanda-1910>b66f175629a52396dd1db3f1718d2028</aircraft_Coanda-1910>
<aircraft_colditz>77100ce686eee7ae2b5950df44a38709</aircraft_colditz>
<aircraft_Commonwealth-Ca-12>f132805e11b1c1e60908080b9b6533ad</aircraft_Commonwealth-Ca-12>
<aircraft_ComperSwift>8b227cd83d5f1f3b3b44bb7b46714349</aircraft_ComperSwift>
<aircraft_Concorde>566f1dc35ae741cdeee125111f1e0c20</aircraft_Concorde>
<aircraft_Convair-XFY-1-Pogo>633550eae44633a9b23777ffab527f1b</aircraft_Convair-XFY-1-Pogo>
<aircraft_couzinet70>d8fa7f026fc404ad20b7c7f6a11619ee</aircraft_couzinet70>
<aircraft_cri-cri>bc2267347bc48ba2377926a7a6515274</aircraft_cri-cri>
<aircraft_CRJ-200>0d500b113ae2d633e5f0bf36a1d19fd9</aircraft_CRJ-200>
<aircraft_CRJ700-family>d935f718bed4a71069122fe5214ecd2e</aircraft_CRJ700-family>
<aircraft_Curtiss-Jenny>6062a91295fbf99801e65197a71451c5</aircraft_Curtiss-Jenny>
<aircraft_Curtiss-Model-F>8ca56323ab3db01ec034f231490a7702</aircraft_Curtiss-Model-F>
<aircraft_Curtiss-P40>a0d00a78d80e4a621a1cfb55c0658fe3</aircraft_Curtiss-P40>
<aircraft_D510>8b09cc7658164d311f4e70e36f463cde</aircraft_D510>
<aircraft_D520>b967ca884dd02b37ad9c247d31bdf1c7</aircraft_D520>
<aircraft_DaSH>f9c33778a3805892fbd0e6de35e54e91</aircraft_DaSH>
<aircraft_Dassault-Mystere-IV>387fd1c59b2e5934ffcd888df39b7174</aircraft_Dassault-Mystere-IV>
<aircraft_Dauphin>bdc3b2e695db1588827d000b55bbebda</aircraft_Dauphin>
<aircraft_DC-10-30>1d37211f993a920b0806b95db0f8ea7c</aircraft_DC-10-30>
<aircraft_dc2>77f9e6a9e1647dcd012966af7df1d4be</aircraft_dc2>
<aircraft_dc6>dbfd9548db8318098daa75733171a18e</aircraft_dc6>
<aircraft_dc8-63>70cff7394ced9ab348653ad82ece3c10</aircraft_dc8-63>
<aircraft_dc8-73>26883edc54c7a02e208ce51e7b964e2e</aircraft_dc8-73>
<aircraft_Deperdussin>00fc8120294619b97ccf0e04a6145c1f</aircraft_Deperdussin>
<aircraft_DerKleineUhu>9003650773fd4933b40089d146484045</aircraft_DerKleineUhu>
<aircraft_Deuche>033799e2157ac9ffc6ac04fcdfeafe04</aircraft_Deuche>
<aircraft_DG-101G>02e81c7a33551c2581f8d5767e464518</aircraft_DG-101G>
<aircraft_DH-106>f7ac35642502a83a265f7b6594650279</aircraft_DH-106>
<aircraft_DH-88>be3e5fcef3000c72a2d85fb9eb827793</aircraft_DH-88>
<aircraft_DH-89>c745759b0e259323b20ba2e535284e7d</aircraft_DH-89>
<aircraft_DH-91>8b24f65ff28f7c66e65bcf7025582575</aircraft_DH-91>
<aircraft_dhc1>14b8d09e2debfdfd9cac81b8b67c9498</aircraft_dhc1>
<aircraft_dhc2>ff6f3470289772182d931daa00f6057f</aircraft_dhc2>
<aircraft_dhc3>a0506714e972c2a58f745c6bd7cc4fe2</aircraft_dhc3>
<aircraft_dhc4>4a792858aa65aada7cb91a47a9cf8c5d</aircraft_dhc4>
<aircraft_dhc6>81fb6e7b8ff50d43180bb758d1a56121</aircraft_dhc6>
<aircraft_dhc8>cca58285c8c814dfe923aaec656b1d9c</aircraft_dhc8>
<aircraft_Diamond-Da40>26885d6e6a849ad9dd54829baa26daee</aircraft_Diamond-Da40>
<aircraft_Diamond-Da42>e9992fcecbc66640a932c1c8fb7e71ae</aircraft_Diamond-Da42>
<aircraft_DO-228>8915f9465c563740f9f8f2cf32f1dd74</aircraft_DO-228>
<aircraft_DO-26>80757f34ea04417b6b30d65092ce50ab</aircraft_DO-26>
<aircraft_DO-335>ba8bbc9e04405db298beb9c24c6200c3</aircraft_DO-335>
<aircraft_DO-X>41356deabb2cd689393f36b96123a330</aircraft_DO-X>
<aircraft_Douglas-Dc3>b57c14a1791a20bccbf23db826a22dbb</aircraft_Douglas-Dc3>
<aircraft_Douglas-Dolphin>578771e25e6d7d81e5574d8cd1d19de0</aircraft_Douglas-Dolphin>
<aircraft_DR400>01c814d7ddeb0adcee0ed58022ebf6a8</aircraft_DR400>
<aircraft_DR400-dauphin>259cd05cfbf4b80b2cb4be07cf4bf781</aircraft_DR400-dauphin>
<aircraft_Dragonfly>012f8917ef6d7ec50d8a73c0508e5b47</aircraft_Dragonfly>
<aircraft_Dromader>9f77b8fbf981c4d761d8c497b6ef0868</aircraft_Dromader>
<aircraft_Dunne-D.5>48795402cda50957be7b7504b4d82389</aircraft_Dunne-D.5>
<aircraft_E-2C>d015100dfb5381135d221f41b293584d</aircraft_E-2C>
<aircraft_E3B>894c16ccfa5aed2778c7be4873947b69</aircraft_E3B>
<aircraft_eastbourne_mono>a99c8114ca48074fea2c675a8e6908e0</aircraft_eastbourne_mono>
<aircraft_ec130>684d979f81bf15b2adf47b52d6ca21f7</aircraft_ec130>
<aircraft_ec135>39631381049db9e54655c499f91bfb31</aircraft_ec135>
<aircraft_Embraer-ERJ-145>ef5ed515fe8f93876137bb6b27f3b158</aircraft_Embraer-ERJ-145>
<aircraft_ercoupe>bdaa474d4be6e51b21266ce0c8782c2c</aircraft_ercoupe>
<aircraft_Etrich-Taube>f6ba735798172b43abf417c80c1c4db4</aircraft_Etrich-Taube>
<aircraft_eurofighter>0f915d06528b1cc2dcc16f7be3b9ab37</aircraft_eurofighter>
<aircraft_extra500>72a8b154cda42a2ec507b6a4c604afcb</aircraft_extra500>
<aircraft_F-106-dart>84bfa325c11d56920062e8516bfc146e</aircraft_F-106-dart>
<aircraft_F-117>ba904d06c2ddb28a7fd3f95ac344de7a</aircraft_F-117>
<aircraft_f-14b>3c0963e6203c4a6315155012bbbb8096</aircraft_f-14b>
<aircraft_F-15>43f556905826c6ad5c80af409eb8a76c</aircraft_F-15>
<aircraft_F-35B>e1875c6efdc7ffe1160d8e64ac5f5fd7</aircraft_F-35B>
<aircraft_F-86>ea67ec6bb6c981dbbd391003f997c6ef</aircraft_F-86>
<aircraft_F-8E-Crusader>41b4502a287018e27402925094324209</aircraft_F-8E-Crusader>
<aircraft_f16>25805162fbd9d4d00e09c814f0beef9b</aircraft_f16>
<aircraft_f18>45264d8293d22533f56f571283940754</aircraft_f18>
<aircraft_F4U>fb47e4425240141a45818dcdc8060a4b</aircraft_F4U>
<aircraft_F6F-Hellcat>b4fcbc6e73565001d25f3cd64fb85a77</aircraft_F6F-Hellcat>
<aircraft_F7F-Tigercat>0ea6ad997b8595f97530d9aed5529ec9</aircraft_F7F-Tigercat>
<aircraft_F80C>9a7c5ac1aabe992abf14fd4b53c1712c</aircraft_F80C>
<aircraft_F9F-Panther>305fc09e91c52fefd2b67d6925baff38</aircraft_F9F-Panther>
<aircraft_fa223>3746de4faf66266399a9273321088ce2</aircraft_fa223>
<aircraft_Fairchild-C119>ec397cdc0f61d78ecc28d2cc564becd6</aircraft_Fairchild-C119>
<aircraft_Fairchild-Metroliner>3248a3f496cc146fcd95c61ec2538ae7</aircraft_Fairchild-Metroliner>
<aircraft_Fairey-Gannet>96e43cd67c0c8b9fd6e158a3ee46fbdc</aircraft_Fairey-Gannet>
<aircraft_Falcon-50>6d78633d200d8f945be6400027116539</aircraft_Falcon-50>
<aircraft_Farman-III>3e0a4af617e2064e78cee25e1d8af653</aircraft_Farman-III>
<aircraft_Farman-IV>42f45908ac131a855f66e63c09279562</aircraft_Farman-IV>
<aircraft_Fiat-G55>15f03458e112d4d7d3ff674dc20286c2</aircraft_Fiat-G55>
<aircraft_Fiat-G91>a3854718af2cf6c4c0512a166e283b4c</aircraft_Fiat-G91>
<aircraft_FK9MK2>24144321fdadaf71e81f8b014ad0e16b</aircraft_FK9MK2>
<aircraft_fkdr1>2294512dc1cdb63a8b90a21ba48875c7</aircraft_fkdr1>
<aircraft_flash2a>c56ee7fbdb10b1ba979d019cc26972cf</aircraft_flash2a>
<aircraft_Focke-Wulf-F19-ente>8bd5f800b24dbfc37f59fe368a748af1</aircraft_Focke-Wulf-F19-ente>
<aircraft_Focke-Wulf-Ta.154>f926af126c01eabd3ceb0398b178519a</aircraft_Focke-Wulf-Ta.154>
<aircraft_Fokker-Eindecker-EIII>29cd9e7ea06489595979f3df518813dd</aircraft_Fokker-Eindecker-EIII>
<aircraft_Fokker-G1>ea6025e2b6cdffc86764c5ee5a949c9a</aircraft_Fokker-G1>
<aircraft_Fokker-S-11>c3f68417e01ab653e66131bd446f8940</aircraft_Fokker-S-11>
<aircraft_Fokker-Spin>2fc955ad2ecb4ba0a7899097e7e4b226</aircraft_Fokker-Spin>
<aircraft_fokker100>83874804ebae4b77f6ac92f55c19ba91</aircraft_fokker100>
<aircraft_fokker50>da5fc6e9761203e6dd26dc3f01a2fe68</aircraft_fokker50>
<aircraft_followme>6b17d6d7bc78b5424420d47c0d737fa9</aircraft_followme>
<aircraft_Ford-Trimotor>83743f288a09c89716ac2a2e212b11bc</aircraft_Ford-Trimotor>
<aircraft_Fouga-Magister>866329f60e90f3404a6bace54e733b73</aircraft_Fouga-Magister>
<aircraft_fw190>449953e8d06e61e78e94e520d8fbc3e3</aircraft_fw190>
<aircraft_Fw200>5179bd127ee44112ec06887e322725aa</aircraft_Fw200>
<aircraft_Fw61>049759aaa0c615f71b0e1e2d683cb3ba</aircraft_Fw61>
<aircraft_G-164>977f70220ecee03ef7367b940956122a</aircraft_G-164>
<aircraft_Gee-Bee>bf993f8a5499538d2b5f5f5ec0c7574d</aircraft_Gee-Bee>
<aircraft_Gloster-Gladiator>65223229f5f8adc17c534412fb1b2bc8</aircraft_Gloster-Gladiator>
<aircraft_Gloster-Meteor>9905dc7569bc1e9cf750e47cc138dbeb</aircraft_Gloster-Meteor>
<aircraft_Gloster-Whittle>ef530cb8d0f3b53b83d993f4284bc4c3</aircraft_Gloster-Whittle>
<aircraft_Gotha-G-V>d18ed659fb34df8e078b36d0156de731</aircraft_Gotha-G-V>
<aircraft_Grob-Astir>57ada6ce17e8dda569e49ef29a517b90</aircraft_Grob-Astir>
<aircraft_Grob-G109>65c28732f4909889ca9739953c7b2032</aircraft_Grob-G109>
<aircraft_Grob-G115>82ca3e94ee5a1ee711fbc73e7ab99645</aircraft_Grob-G115>
<aircraft_Grob-Gf200>b80921cb1ec91813ba6912abf8d3d73c</aircraft_Grob-Gf200>
<aircraft_Grumman-American-AA1>40f6523b7cc0aff71281820d54bdaa0f</aircraft_Grumman-American-AA1>
<aircraft_H-21C-Shawnee>515e08d2a12b2cc1891f23e086aa5933</aircraft_H-21C-Shawnee>
<aircraft_H1-Racer>d8250d2d9f842108ffed965ced81ab64</aircraft_H1-Racer>
<aircraft_H4-Hercules>34ea914ec8c9f7c85ba3c243c6d0f981</aircraft_H4-Hercules>
<aircraft_Handley-Page-Halifax>837d0bc1db372b8d18e251fb63aa13ea</aircraft_Handley-Page-Halifax>
<aircraft_Hansajet>98a417480a3126432d9214fe0efb83c9</aircraft_Hansajet>
<aircraft_harrier>568eeccd7ffc3b08937fdf2da81a972a</aircraft_harrier>
<aircraft_Harrier-GR1>8f90009d9f8c66ba0dafc1c05ff2c685</aircraft_Harrier-GR1>
<aircraft_Harrier-GR3>b3d6038ff416a64372b663e9f3ccc137</aircraft_Harrier-GR3>
<aircraft_Hawker-Siddeley-Nimrod>e78cd169d9423dc9a9126d51fbeeb91e</aircraft_Hawker-Siddeley-Nimrod>
<aircraft_He-111>febb50152f339e23040815432e8fd6d4</aircraft_He-111>
<aircraft_He162>a27b2dd3efe6a362d135d55eca70d134</aircraft_He162>
<aircraft_Heinkel-He-111>941ab65d0ee6a8c0578e87b8d881ffc0</aircraft_Heinkel-He-111>
<aircraft_Heinkel-He-177>3bc698cc3b8937609e715c12fb135ca0</aircraft_Heinkel-He-177>
<aircraft_Heinkel-He-178>8a646c02ac858485f683301e5d98adb5</aircraft_Heinkel-He-178>
<aircraft_Heinkel-He-280>f4656701178b9d1eea30aa73b6a96ea2</aircraft_Heinkel-He-280>
<aircraft_Heston-Type5>11ef72971dce2d4b47f9899fabc4e591</aircraft_Heston-Type5>
<aircraft_HM-14>aa1c16c7731e99ebc6cd536ce26daa14</aircraft_HM-14>
<aircraft_Hornet>5dacabf98fe85149246cd5fc9bae6c39</aircraft_Hornet>
<aircraft_Horsa>1ddf68bca0c4a97d263a2d1718f87d2e</aircraft_Horsa>
<aircraft_Horten-Ho-IX>e8e04eb1d9bd25e270944775d8cb4100</aircraft_Horten-Ho-IX>
<aircraft_HS-P-75>90f738b3a6362f787e2170cb3d7317f0</aircraft_HS-P-75>
<aircraft_Hughes-XF11>bcf549f662ba17ac5896ef38b824f13e</aircraft_Hughes-XF11>
<aircraft_Hunter>608118d1e8019c92a22c275b8ce02c4a</aircraft_Hunter>
<aircraft_HUP-Retriever>5a2683f3d5a170495dc0ed3ed8cfa3f2</aircraft_HUP-Retriever>
<aircraft_Hurricane>0f64845ba2b2a4bc6a5f5637d261b93b</aircraft_Hurricane>
<aircraft_Icaro_MRX13>5f873b418694a01d049664ae58ad69a8</aircraft_Icaro_MRX13>
<aircraft_IL-2>cdc9eeae48d8760204735cf3dfdfbec9</aircraft_IL-2>
<aircraft_j22>14d705864d455ec73ca9c373f6d61d58</aircraft_j22>
<aircraft_J3Cub>f978f4a979edc6b3ac3c6b0cbd631c83</aircraft_J3Cub>
<aircraft_j7w>b777fc0d1a2c85ce6c0a03dfd90df48b</aircraft_j7w>
<aircraft_JA37>ef141db8c2469b1421c8e74f018ee8a4</aircraft_JA37>
<aircraft_Jaguar>7a0a5d5f93e34dd40fcdce3f06848908</aircraft_Jaguar>
<aircraft_JAS39-Gripen>ed3685660909e7e831d7711a2cc7b7b0</aircraft_JAS39-Gripen>
<aircraft_jeep>59341e0675583a826c34c625ba277345</aircraft_jeep>
<aircraft_jetman>67a0cbf1e934dd6552cf3f231ed65964</aircraft_jetman>
<aircraft_Jodel-D140>0cfed1923e5d2b849760df5ced30a175</aircraft_Jodel-D140>
<aircraft_JT-5B>0650d1a62cce431fa07e64bf8845a904</aircraft_JT-5B>
<aircraft_Ju-87>91a6f9e779d641b451efa777b6f81e81</aircraft_Ju-87>
<aircraft_Ju-88>ebdd6f04edccd2205bcaed1e845b567d</aircraft_Ju-88>
<aircraft_ju52>ee7f03a89cabb1370183f8a88dad1e9d</aircraft_ju52>
<aircraft_Junkers-F13>f88670ae7d834818ba14d71a7e0036e3</aircraft_Junkers-F13>
<aircraft_Junkers-G.38ce>7ad891738873394a7626882fd86e2031</aircraft_Junkers-G.38ce>
<aircraft_Junkers-Ju-390>be9047b6412830adcf9a7d68cb4574d1</aircraft_Junkers-Ju-390>
<aircraft_Junkers-W34>b5e96c226c4a2277b34dee97efc1d960</aircraft_Junkers-W34>
<aircraft_K-7>cb160921e2c703bbbdafcb51d49c266f</aircraft_K-7>
<aircraft_K5Y1>f72439b0db6a44fde139cb7651c28207</aircraft_K5Y1>
<aircraft_Ka-50>96aae67efd76fb6bfce1a97b1fbdbefd</aircraft_Ka-50>
<aircraft_Katana>151fbc5f85a7acd78039d2f074901028</aircraft_Katana>
<aircraft_Kawasaki-Ki-61-Hien>4ab8429c7200f96c144439fe50cda12d</aircraft_Kawasaki-Ki-61-Hien>
<aircraft_KC135>28519bdf05d7b1c5601ebfe9b7d95c0d</aircraft_KC135>
<aircraft_Ki-84>fbee5f8f188262cf1e09c168dd1014db</aircraft_Ki-84>
<aircraft_KM>3031820f648fe2fb15f8c9d64c104387</aircraft_KM>
<aircraft_kodiak>947daecf702214b7708c8d7df872366b</aircraft_kodiak>
<aircraft_L-1011-500>14670bbba47068cc5914c399c51a20e3</aircraft_L-1011-500>
<aircraft_l39>1d42f9adf23bf70ef1f9ba1695b9f794</aircraft_l39>
<aircraft_La-5>75204b0421e9835bf3ac3d2a0d198163</aircraft_La-5>
<aircraft_Lancair-235>6fbd208db0830b462fe2d105d1924f1e</aircraft_Lancair-235>
<aircraft_LATE-29>5ad79d5b9a17f3ac79b71722547fb6ff</aircraft_LATE-29>
<aircraft_Late-631>421b4ec83fe86c82e0bb952d3ee08780</aircraft_Late-631>
<aircraft_Leduc-022>2d3c15a8151e86b497900f6873b1875b</aircraft_Leduc-022>
<aircraft_Lightning>b80a9a8c89b05c4fa22a314ea56b32ab</aircraft_Lightning>
<aircraft_Lionceau>93a573bcf722ce69de872674b3f9dd27</aircraft_Lionceau>
<aircraft_Lockheed-Martin-FA-22A-Raptor>97c2da3770e378b72637b09c0475156f</aircraft_Lockheed-Martin-FA-22A-Raptor>
<aircraft_Lockheed-NF104>572acc2315b077411699eba35c0655d1</aircraft_Lockheed-NF104>
<aircraft_Lockheed-NF104A>41347e33250b355077aba64c671a44ce</aircraft_Lockheed-NF104A>
<aircraft_Lockheed-P38>53cd0af0a81de17378a7d3201c31dbb9</aircraft_Lockheed-P38>
<aircraft_Lockheed-SR71>99485aa18c25c0e6537334d63ccfe2c6</aircraft_Lockheed-SR71>
<aircraft_Lockheed-U-2S>b00db640f9f0f490b0bfa7d6d8b40163</aircraft_Lockheed-U-2S>
<aircraft_Lockheed-Vega>04e530018ec557294dd90128fc0c4a56</aircraft_Lockheed-Vega>
<aircraft_Lockheed1049>99539707fa1c283b6513be48996d8d14</aircraft_Lockheed1049>
<aircraft_Lockheed1049h>8da4141b5716e4321d1d5dcf3cfd30e6</aircraft_Lockheed1049h>
<aircraft_Long-EZ>6e5a8b2abc701632f9b9ab7a839eee4d</aircraft_Long-EZ>
<aircraft_Lynx-WG13>9add8ac0325547a52fa53e03b06d23b9</aircraft_Lynx-WG13>
<aircraft_M-XE>1978498650f9f5ae335cfd702a6d16f6</aircraft_M-XE>
<aircraft_Macchi-Castoldi-MC72>6952026a71d24cf0b11baca0320ab087</aircraft_Macchi-Castoldi-MC72>
<aircraft_Macchi-M33>90dc0d1bce4c19822312f51be82e9c98</aircraft_Macchi-M33>
<aircraft_marchetti>b6959644da3e1acbdd2f63af0cc529f0</aircraft_marchetti>
<aircraft_Martin-Baker-MB5>5c21bdb968a38b57b911aa998b9db99d</aircraft_Martin-Baker-MB5>
<aircraft_MB326>1a61bc6d32a3ed512b51535c46dc6991</aircraft_MB326>
<aircraft_MD-312-Flamant>be65efca7b7d7fc246c373e391996978</aircraft_MD-312-Flamant>
<aircraft_MD11>e772e7fae851948c6f6b19c0191821aa</aircraft_MD11>
<aircraft_ME-209-V1>3de79c61240e8e04a24d95c707a61a2b</aircraft_ME-209-V1>
<aircraft_ME-262>9960374b772e64e5ad75e0d3b6e12f08</aircraft_ME-262>
<aircraft_ME-262HGIII>3dfa621d920cecce3585b0f1ccb6be72</aircraft_ME-262HGIII>
<aircraft_me163>687309052c27966bd4d3bbd023237c17</aircraft_me163>
<aircraft_me323>0d615e9e715d3d4e150e836fbf43f426</aircraft_me323>
<aircraft_Messerschmitt-BF110>39b9d8b0a4aafa4e1b25992520deb011</aircraft_Messerschmitt-BF110>
<aircraft_Messerschmitt-Libelle>ed7ad8c54b6c2d9d1727e85a1a198a31</aircraft_Messerschmitt-Libelle>
<aircraft_Messerschmitt-P1101>3b989b232dd121eff6b0b230e9e85f6c</aircraft_Messerschmitt-P1101>
<aircraft_MFI-9>a566bad5dc6de5bc8d782c4f292e34ed</aircraft_MFI-9>
<aircraft_MiG-15>9bb9d2c8983b99f4f74e063f3d1e3479</aircraft_MiG-15>
<aircraft_MiG-21bis>d749c64a1fa96fbb0f13fc3d41b646e9</aircraft_MiG-21bis>
<aircraft_Mig-29>c6b9271b94abdf0770612a5cf4555f91</aircraft_Mig-29>
<aircraft_Mil-Mi-12>e1d83cafee3b3cecfdc3e473913df264</aircraft_Mil-Mi-12>
<aircraft_Mil-Mi-24>9fe6b04de733a20290141310f02abdcf</aircraft_Mil-Mi-24>
<aircraft_Mirage-2000>7bf582dfc110cfe38d616b1cdeed91ee</aircraft_Mirage-2000>
<aircraft_mirage2000>faa0e38bdadaadb61fa28e968f8a2122</aircraft_mirage2000>
<aircraft_Mirage_F1>dc188baadc7e6b3033845cfd48a14163</aircraft_Mirage_F1>
<aircraft_MirageIII>9f814e7ec8180ca71bbaf721d9337e70</aircraft_MirageIII>
<aircraft_MirageIV>a969aedf03beddd8ee89367d6179e1a4</aircraft_MirageIV>
<aircraft_mosquito>15eac7459f9aeafabdce72df42a4ba69</aircraft_mosquito>
<aircraft_MPCarrier>280758b9c9b1ec90f2010f1b1ab06ba7</aircraft_MPCarrier>
<aircraft_MRJ>ad879791f1e9d0e2d719d6a4518bbe2c</aircraft_MRJ>
<aircraft_MS-406>4507e58972e6bc69ba4f46ea3db455ec</aircraft_MS-406>
<aircraft_Nakajima-B5N>02e681d40a2427610dd55c643e89b01d</aircraft_Nakajima-B5N>
<aircraft_Nieuport-11>701b0401fb152e87a40c8b5babe87798</aircraft_Nieuport-11>
<aircraft_Noratlas>b177adbf225feca2f7d39f80d5acc352</aircraft_Noratlas>
<aircraft_Nord-1405-Gerfaut-II>a862bcf397791708ef2e0441282b2b69</aircraft_Nord-1405-Gerfaut-II>
<aircraft_Nord-2502>c6f4dc65ba8177e50ef5742b3ecb52b7</aircraft_Nord-2502>
<aircraft_Nordstern>6df28cb4a7d5e8907391c3ed8e70b6e0</aircraft_Nordstern>
<aircraft_North-American-T28D-Trojan>5fee1165f23a11eeca4d24d766117377</aircraft_North-American-T28D-Trojan>
<aircraft_North-American-T6-Texan>7ee82c752779d1c51f7b92660006aad2</aircraft_North-American-T6-Texan>
<aircraft_Northrop-P61>23a394d7e36aa653bff9b32fc9548250</aircraft_Northrop-P61>
<aircraft_Northrop-xb35>e4ec374be03638c10a88f351e8f09bad</aircraft_Northrop-xb35>
<aircraft_ogel>26e51eabb21a9a71f1b5a685e3061843</aircraft_ogel>
<aircraft_OH-1>49259a0e7725bb2c6809e1aae15e8fac</aircraft_OH-1>
<aircraft_OH-58D>40801a1693b0b8bd33178d4a5bf67765</aircraft_OH-58D>
<aircraft_ornithopter>7b0c70f7b8de3e1a5c19d32c36fa7d00</aircraft_ornithopter>
<aircraft_OV10>74faff4f12efb353ccc61689fe96c46c</aircraft_OV10>
<aircraft_P-38-Lightning>43c98dfe30fecc4c2448dc51750154ee</aircraft_P-38-Lightning>
<aircraft_P130UL>ea0a540d06226687e3409c1226a1cc1d</aircraft_P130UL>
<aircraft_P180>ab8760c0219835fe97dcbbf698b39fa4</aircraft_P180>
<aircraft_P47>cc9b6238b260d924338d2c4ee2dafc95</aircraft_P47>
<aircraft_p51d>7caa4abbdb5dba23edbdc02cf2693909</aircraft_p51d>
<aircraft_pa22>da2990b33cef4afe7d629530b274632a</aircraft_pa22>
<aircraft_pa24-250>65a95dd87096e2377dff6fe917befb8a</aircraft_pa24-250>
<aircraft_pa28-161>02f4a01e218da00e8969d4ae52c84193</aircraft_pa28-161>
<aircraft_PaperAirplane>2b7fbfc1efdf6ab2663e8b3d7cd3daed</aircraft_PaperAirplane>
<aircraft_Parachutist>79da74f4e265f5290b4cf35b740663a7</aircraft_Parachutist>
<aircraft_paraglider>6531e09545716af63e4ef5cf8feb8ec1</aircraft_paraglider>
<aircraft_payen-pa100>2f86aa5353798f3a4202e403bfa12c02</aircraft_payen-pa100>
<aircraft_payen-pa350cd>b6e5e2bb9985effc63bdcb2177ec681b</aircraft_payen-pa350cd>
<aircraft_PBY-Catalina>937f55e89ec3df58c2d0339f9a1dd622</aircraft_PBY-Catalina>
<aircraft_PC-12>70352371bec5bee2af6bfa7fceb7da5e</aircraft_PC-12>
<aircraft_PC-21>a53d16394c2492eb0a713ecfd8dbaf8e</aircraft_PC-21>
<aircraft_PC-6>b4fbd66018b94d83d11e3e6e7e0fac1d</aircraft_PC-6>
<aircraft_PC-9M>7c90665c0c85a3e81b15a0ea69befeeb</aircraft_PC-9M>
<aircraft_pc7>6eea7be83224abc9a1c3da0ce2fe6c82</aircraft_pc7>
<aircraft_Percival-Mew-Gull>e2e0f33e2d38ad747f5c738230439ad6</aircraft_Percival-Mew-Gull>
<aircraft_Piaggio-P166>66de4194f057e4a5248d19c5d51f88ca</aircraft_Piaggio-P166>
<aircraft_Piaggio-Pegna-Pc-7>6944e2533d7ddca2752df6300a281b16</aircraft_Piaggio-Pegna-Pc-7>
<aircraft_Pioneer-200>8e89696bf062126e4fe969a65ea5da1f</aircraft_Pioneer-200>
<aircraft_Piper-PA-18>466c8c681f2c6c942668d769e79defba</aircraft_Piper-PA-18>
<aircraft_Piper-PA-28>f7f176d0ff24d09134c43f0e0bc57d5b</aircraft_Piper-PA-28>
<aircraft_Piper-PA-32>601545618b8fe3c210b4514a25242faf</aircraft_Piper-PA-32>
<aircraft_pittss1c>427efb1a07d99ca6c99698de322b7d74</aircraft_pittss1c>
<aircraft_Polikarpov-I16>3926f7b7e584ad63327a622dbac60564</aircraft_Polikarpov-I16>
<aircraft_Pond-Racer>46e6876c63888a593dd46307b7fe0965</aircraft_Pond-Racer>
<aircraft_Potez-630>228dab05bac8112a51265a509d28adc3</aircraft_Potez-630>
<aircraft_Pterodactyl>aa747cdb68e4ce5bcf3fcf3a7fa9b371</aircraft_Pterodactyl>
<aircraft_Pterosaur>fec9ddaa76f650624821341e07c32ef5</aircraft_Pterosaur>
<aircraft_pushback>8fa3ff17dbf4f5216d2b038af30b6d4b</aircraft_pushback>
<aircraft_Quickie>9e12e7ae2a644e77749efb5d5c4d0917</aircraft_Quickie>
<aircraft_R22>7c66503ed0253f16ad021be72e4abfa7</aircraft_R22>
<aircraft_R44>4db8a423cab299263b5139e0b44c4884</aircraft_R44>
<aircraft_RAF-S-E-5>267a979bb7fcadac5698365c158f8fbf</aircraft_RAF-S-E-5>
<aircraft_rah-66>14d8af5d3bc22ac49c5bdfcb8f63c9d8</aircraft_rah-66>
<aircraft_rallye-MS893>7afb876e7a2e7b7bfaa8619bf0c07265</aircraft_rallye-MS893>
<aircraft_Rascal>640eafc8068633c0e48ed3a569d18870</aircraft_Rascal>
<aircraft_RV-6A>27238520cd1123eb6e832489ed6d5a65</aircraft_RV-6A>
<aircraft_Ryan-Navion>e64d386ede9f5d1ab93bbe212246086f</aircraft_Ryan-Navion>
<aircraft_Ryan-PT22>dee77f1d0d3de7f0ce6859006e0ba642</aircraft_Ryan-PT22>
<aircraft_Ryan-SoSL>93e380e1b639a5d063be34521ef058a1</aircraft_Ryan-SoSL>
<aircraft_S-51-Dragonfly>fa4c3f5a64725039c6ac69dc817d0861</aircraft_S-51-Dragonfly>
<aircraft_SaabJ35F>d9c356d0f282204a451c7acb86a0df95</aircraft_SaabJ35F>
<aircraft_santa>cd6232d913be2a512d2e8fcae806afad</aircraft_santa>
<aircraft_Saunders-Roe-Princess>a6cef52c80b2fd0ebc43e26183d9a668</aircraft_Saunders-Roe-Princess>
<aircraft_seahawk>792aa8e491c51b10898600e5fce883fd</aircraft_seahawk>
<aircraft_SeaVixen>21e9817040f8a9ab9160745591915f28</aircraft_SeaVixen>
<aircraft_SenecaII>a769ea7ad74deb9a793966b98be001a0</aircraft_SenecaII>
<aircraft_sf25b>664ad64136e6958a39b292ec54607037</aircraft_sf25b>
<aircraft_sgs233>86308422b554356c850dffb9d0c90b2a</aircraft_sgs233>
<aircraft_Short-Stirling>96a0604d6e963d36a35e919f3ca01310</aircraft_Short-Stirling>
<aircraft_Short_Empire>868a7faef6fb3bca64a0bcb19b32840c</aircraft_Short_Empire>
<aircraft_shuttle>4e24a9c27d36afaec32256a211bef2c3</aircraft_shuttle>
<aircraft_SIAI-Marchetti-S.205R>2771caeaa310c1a6970e95c0ea403f3a</aircraft_SIAI-Marchetti-S.205R>
<aircraft_SIAI-Marchetti-SF.260>dcab556a830e493703640fd1fdad70eb</aircraft_SIAI-Marchetti-SF.260>
<aircraft_Sikorsky-76C>679c00028ac62b9aa3368840147170b5</aircraft_Sikorsky-76C>
<aircraft_Sikorsky-S38>3856921a90f947ec2f3e70fa23a1f6ea</aircraft_Sikorsky-S38>
<aircraft_Sikorsky-S58>9abb2fc4e373ab4431920fdaf45d8a87</aircraft_Sikorsky-S58>
<aircraft_Sky-sportster>d9b9c033f30335a81558a201810f862e</aircraft_Sky-sportster>
<aircraft_Skyranger>0a7450c02b7ff3de085087668ba975e7</aircraft_Skyranger>
<aircraft_Skyvan>712723a74eaa5f47d905c5938d1ecfa3</aircraft_Skyvan>
<aircraft_SM-55>dad894bca78456b5e2ba2e2005d2f29a</aircraft_SM-55>
<aircraft_sm79>626844492e56226455fa3a399f41c9e9</aircraft_sm79>
<aircraft_snowplow>e9eb491ec0bf4d3ad2c2690b94a9be95</aircraft_snowplow>
<aircraft_Socata-ST10>37b95c63434f398743ebbdfd2bee8089</aircraft_Socata-ST10>
<aircraft_sopwithCamel>7792f06b71703a39936f75eb1f0f1e05</aircraft_sopwithCamel>
<aircraft_SpaceShip-One>d082a2f287fc96ade10753e47cff2977</aircraft_SpaceShip-One>
<aircraft_SpaceShuttle>39c46f24941da46177122a83f119e8b7</aircraft_SpaceShuttle>
<aircraft_SPAD-VII>f250ae8d2a2b28eb4f736aa28e8f6abf</aircraft_SPAD-VII>
<aircraft_Spitfire>ca055bf7c4d39b07a40bb465ad635146</aircraft_Spitfire>
<aircraft_spitfireIX>690b3c6a74770738d2d5173fefb48e61</aircraft_spitfireIX>
<aircraft_sr20>cbecc0a364fbe6a7aa0c0ea683ce62ea</aircraft_sr20>
<aircraft_SR71-BlackBird>29a5495e10aa160cf94b0b9a06e94b48</aircraft_SR71-BlackBird>
<aircraft_Stampe-SV4>54ed408f46a6ae86d2b609c58caa2348</aircraft_Stampe-SV4>
<aircraft_Starship>078d68204b7b7d11103f97d6067693d2</aircraft_Starship>
<aircraft_Stearman>791b0a572eba95a6d0fcfdee605b284e</aircraft_Stearman>
<aircraft_Stieglitz>7c5d4939a29bbde445fa5a51a806a600</aircraft_Stieglitz>
<aircraft_Stiletto>f469bf3d05e34508c4644c9f21adde9b</aircraft_Stiletto>
<aircraft_Storch>987d5891ea899b92697b3dbae69f4290</aircraft_Storch>
<aircraft_Su-25>fc53b9f9e774bf455099a41e44f163e0</aircraft_Su-25>
<aircraft_SU-37>f0f2e74ef26520d16f11c26adcfa7244</aircraft_SU-37>
<aircraft_Submarine_Scout>57853593a2c72148f0de00faa70d67d4</aircraft_Submarine_Scout>
<aircraft_Super-Etendard>ea86ee06b4d358790036fe22ae8673a3</aircraft_Super-Etendard>
<aircraft_Super-Frelon>92a9c71fb1666816273b3283e7d02504</aircraft_Super-Frelon>
<aircraft_superguppySGT>86c50734cf3e657a4bb0646ae4848af3</aircraft_superguppySGT>
<aircraft_Supermarine-S.6B>b59d6790040c27853338b680067edc52</aircraft_Supermarine-S.6B>
<aircraft_Superwal>92158d7e55f4a892b3d3640cf0b254f0</aircraft_Superwal>
<aircraft_T-4>8518cfd8bec8278d0681f67dc7293906</aircraft_T-4>
<aircraft_T-50>2e45346a0f377bcb6adc59be3c05d72a</aircraft_T-50>
<aircraft_T37>7607a3732fee1ad3b43d44875764afe0</aircraft_T37>
<aircraft_T38>1039def0bf9d28ef2cc3a4b5649a9bcb</aircraft_T38>
<aircraft_TBM-Avenger>3118e96ceee1f63c4c5f916e48a62e3c</aircraft_TBM-Avenger>
<aircraft_Tecnam-P2006T>45daae280d68e757730051ce96933435</aircraft_Tecnam-P2006T>
<aircraft_Tecnam-P2010>d27cfef60c88f2785585db762aff50c0</aircraft_Tecnam-P2010>
<aircraft_Tecnam-P92>eefbe319cbc34fed4d63ace54f2fc1c8</aircraft_Tecnam-P92>
<aircraft_Tigre>806acc4c1616d1d940e61d27737e39f6</aircraft_Tigre>
<aircraft_TU-114>f6ce2c5a24ea1545e1d22956017e31b0</aircraft_TU-114>
<aircraft_Tu-134>66cee3c0d3e34c4bd97599c1a633c7db</aircraft_Tu-134>
<aircraft_TU-95>71c35b11bb1662bd612bc8e3e21232e5</aircraft_TU-95>
<aircraft_Tu-SB2bis-M103>50cd266f7a98b7d19ec75b9be804e715</aircraft_Tu-SB2bis-M103>
<aircraft_tu154>e5fd32dabb3412be5797805b5b00c002</aircraft_tu154>
<aircraft_tu154b>7a7bd91ea1d3c40e3f52a3453f6d5789</aircraft_tu154b>
<aircraft_UH-1>0c2692680244c3848e16c5f5cc6e525f</aircraft_UH-1>
<aircraft_UH-60>3126bd7f0dc24fb15fbaa6516bbc08d9</aircraft_UH-60>
<aircraft_V22-Osprey>1b1eb3803d01ea5dbfaee1836c9efb02</aircraft_V22-Osprey>
<aircraft_Velocity-XL>85770badb88a7a876bb828718cc4a30f</aircraft_Velocity-XL>
<aircraft_Vickers-Vanguard>1c9f328d29ee7e2453bf30a6b05939f4</aircraft_Vickers-Vanguard>
<aircraft_Vickers-Vimy>5d6709607fc95b3867fc491c0fe5e5e3</aircraft_Vickers-Vimy>
<aircraft_victor>ee0b3f5284765e02f1357f1cf7071ee1</aircraft_victor>
<aircraft_VMX22-Osprey>39f6e98033e45e3b599cdff5b72d7328</aircraft_VMX22-Osprey>
<aircraft_Vostok-1>9dc57923ec3e984723338db44460b4fe</aircraft_Vostok-1>
<aircraft_vulcanb2>f2eabbfcc31b0ab183fb4b91ba4f19c4</aircraft_vulcanb2>
<aircraft_Westland-Whirlwind>cce4ae63928058699f87b61a9604d1b1</aircraft_Westland-Whirlwind>
<aircraft_wrightFlyer1903>04d855def138064915a06781720d33cc</aircraft_wrightFlyer1903>
<aircraft_X15>a4e382d1493412f3d5cb1e06f9ec9b88</aircraft_X15>
<aircraft_x24b>c209d368e99561002a43697c0496d87d</aircraft_x24b>
<aircraft_XB-70>749a85a21354df350ddb8c50a5561b22</aircraft_XB-70>
<aircraft_XP-67>83cebd2f3cf663215a8bb97dcd38b13e</aircraft_XP-67>
<aircraft_Yak-130>b867555c6e06befe0715665c2a10931d</aircraft_Yak-130>
<aircraft_Yak-18T>e514c7719ac869a86ff466a22de3554d</aircraft_Yak-18T>
<aircraft_Yak-23>c1e1b2a685c99e73720bca83f0c01405</aircraft_Yak-23>
<aircraft_Yak-36>2db3c206f581c88c329567013d16aca3</aircraft_Yak-36>
<aircraft_yak3>62ff0d85b3b5d71c2854623bcad155cb</aircraft_yak3>
<aircraft_YardStik>44106df1f8f1145bb7f9d465a3d85233</aircraft_YardStik>
<aircraft_YF-23>bf82709deb10a369d7eaa23d623f631a</aircraft_YF-23>
<aircraft_YS-11>f32ab303e103ceeb6ca46926f2c1f510</aircraft_YS-11>
<aircraft_ZF_Navy_free_balloon>d6d11bb00006f7b6da2f4939ef06af23</aircraft_ZF_Navy_free_balloon>
<aircraft_ZivkoEdge>01893b6c69d97c42f223d95ff8595ff7</aircraft_ZivkoEdge>
<aircraft_Zlin-50lx>ec52deb7d44c5186c324ac0532ff2bc8</aircraft_Zlin-50lx>
<aircraft_ZLT-NT>60ffdd2bd30dc4a02dfca2ced49bbec5</aircraft_ZLT-NT>
<aircraft_IL-76>4a8d5a29427d179a6b0566d79555cbad</aircraft_IL-76>
<aircraft_SuperGuepard912>eedc5b614bac903c03dfdd287dc0123a</aircraft_SuperGuepard912>
<aircraft_Heinkel-He-111Z>e1f2b5c9d0a65366efd6f4840725d3c5</aircraft_Heinkel-He-111Z>
<aircraft_c182s>e307c8d98edfad2432ceea160a5b455d</aircraft_c182s>
<aircraft_Cessna-L19>3c40924714e6511a2c7c2e8d64a22e4c</aircraft_Cessna-L19>
<aircraft_Boomerang>e9c38c20924902a8cb168d69adf028c5</aircraft_Boomerang>
<aircraft_Arsenal-Delanne-10>e01bdd83f13783e98eae4d89d7c55405</aircraft_Arsenal-Delanne-10>
</PropertyList>

View File

@@ -1,24 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--Template catalog - copy and modify for your site as required-->
<PropertyList>
<template>
<version n="0">3.4.*</version>
<version n="1">3.5.*</version>
<version n="2">3.6.*</version>
<version n="3">3.7.*</version>
<version n="5">2016.*.*</version>
<version n="6">2017.*.*</version>
<version n="7">2018.*.*</version>
<id>org.flightgear.fgaddon</id>
<license>GPL</license>
<url>http://mirrors.ibiblio.org/flightgear/ftp/Aircraft/catalog.xml</url>
<name>FlightGear aircraft distribution from fgaddon</name>
<description>This hangar provides aircraft officially supported and maintained by the FlightGear project, under a free-software license.</description>
<de>
<description>Auf Deutsch</description>
</de>
<fr>
<description>En Francais</description>
</fr>
</template>
</PropertyList>

View File

@@ -1,11 +0,0 @@
*/.svn/*
*.xcf*
*.XCF*
*.blend*
*.psd
*~
*/dev/*
*/Dev/*
*/development/*
*/src/*
*/Resources/*

View File

@@ -42,8 +42,8 @@ NEXT_MINOR_VERSION=${VERSION_A[1]}
setVersionTo() {
local V="$1"
echo "setting version to $V"
echo "$V" > flightgear-version
git add flightgear-version
echo "$V" > version
git add version
echo "new version: $V" | git commit --file=-
# git tag "version/$V"
}

View File

@@ -1,7 +1,7 @@
#!/bin/bash
THIS_RELEASE="2020.2"
NEXT_RELEASE="2020.3"
THIS_RELEASE="2018.3"
NEXT_RELEASE="2018.4"
SUBMODULES="simgear flightgear fgdata getstart"
#:<< 'COMMENT_END'
@@ -39,6 +39,6 @@ done
# IdentitiesOnly yes
# User user_sf_username
#svn copy svn+ssh://svn.code.sf.net/p/flightgear/fgaddon/trunk \
# svn+ssh://svn.code.sf.net/p/flightgear/fgaddon/branches/release-${THIS_RELEASE} \
# -m "branching for release ${THIS_RELEASE}"
svn copy svn+ssh://svn.code.sf.net/p/flightgear/fgaddon/trunk \
svn+ssh://svn.code.sf.net/p/flightgear/fgaddon/branches/release-${THIS_RELEASE} \
-m "branching for release ${THIS_RELEASE}"

View File

@@ -1,65 +0,0 @@
#!/bin/bash
#####################################################################################
if [ "$WORKSPACE" == "" ]; then
echo "ERROR: Missing WORKSPACE environment variable."
exit 1
fi
if [ ! -d "$WORKSPACE/fgdata" ]; then
echo "No fgdata subdir in WORKSPACE: can't continue"
exit 1
fi
VERSION=`cat fgdata/version`
BASE_VERSION_TAG="version/2020.3.1"
SCENERY_PACK_AIRPORT=BIKF
SCENERY_PACK_URI="https://sourceforge.net/projects/flightgear/files/scenery/SceneryPack.${SCENERY_PACK_AIRPORT}.tgz/download"
echo "Assembling base package for $VERSION"
cd $WORKSPACE
# wipe directories and re-create
rm -rf staging
mkdir -p output
mkdir -p staging
# wipe existing data TXZs
rm output/FlightGear-$VERSION*data.txz
rsync -az --exclude=".git" --exclude="Textures/Unused" --exclude="*.xcf" fgdata staging/
# add all the scenery pack files into it
SCENERY_PACK_NAME=SceneryPack_${SCENERY_PACK_AIRPORT}.tgz
# Should we re-download the SceneryPack periodically? Or just rely on doing a workspace wipe?
if [ ! -f $SCENERY_PACK_NAME ]; then
echo "Downlaod scenery pack from ${SCENERY_PACK_URI}"
# -L to follow the SF redirect
curl -L $SCENERY_PACK_URI --output $SCENERY_PACK_NAME
fi
tar -xf $SCENERY_PACK_NAME --directory staging/fgdata
pushd staging/fgdata
mv SceneryPack.${SCENERY_PACK_AIRPORT} Scenery
popd
# Creating full base package TXZ
OUTPUT_NAME=FlightGear-$VERSION-data
tar -cJf output/$OUTPUT_NAME.txz --directory staging fgdata
echo "Creating updates package"
pushd fgdata
git diff --name-only --line-prefix="fgdata/" $BASE_VERSION_TAG..HEAD > ../fgdata_changes
popd
tar -cJf output/FlightGear-$VERSION-update-data.txz -T fgdata_changes
echo "Done, data TXZs are in output/"

View File

@@ -1,26 +0,0 @@
#!/bin/bash
#
# Create the scenery pack for a release distribution
# Make sure to
# * set SCENERY and point it to your local (full) mirror of terrasync scenery
# * name the SCENERY_PACK correctly
# * carefully select the tiles to copy, usually 2x2, 2x3 or 3x2 keeps the pack small enough
#
SCENERY=/path/to/your/scenery
SCENERY_PACK=SceneryPack.PHNL
TILES="w160n[12]0/w???n??"
if [ ! -d "$SCENERY" ]; then
echo "Scenery directory not found or not readable"
exit 1
fi
if [ ! -d "$SCENERY"/Objects -o ! -d "$SCENERY"/Terrain -o ! -d "$SCENERY"/Airports -o ! -d "$SCENERY"/Models ]; then
echo "Scenery directory does not look like a scenery directory"
exit 1
fi
rm -f SceneryPack.*.tgz
ln -s "$SCENERY" ${SCENERY_PACK}
tar --format=gnu --create --owner=root --group=root --gzip --exclude="**/.dirindex" --file=${SCENERY_PACK}.tgz ${SCENERY_PACK}/Objects/${TILES} ${SCENERY_PACK}/Terrain/${TILES} ${SCENERY_PACK}/Airports ${SCENERY_PACK}/Models
rm ${SCENERY_PACK}

Some files were not shown because too many files have changed in this diff Show More