Compare commits
364 Commits
release/20
...
next
Author | SHA1 | Date | |
---|---|---|---|
4899cbc634 | |||
|
d8a16058bf | ||
|
5e6276bd30 | ||
|
fe33acae74 | ||
|
aa17379ae0 | ||
|
5e71ae60fe | ||
|
7469b39cad | ||
|
1e65f0e144 | ||
|
14e27756b1 | ||
|
11949b1e8e | ||
|
0ee880c5dc | ||
|
50fd23d72c | ||
|
8966dcd737 | ||
|
382747c2d1 | ||
|
5b12f55c3f | ||
|
d043edf9c5 | ||
|
969c2f9788 | ||
|
c346526e1b | ||
|
7bcff8eaf4 | ||
|
4730d57d40 | ||
|
f672e8451b | ||
|
65f2c2e041 | ||
|
b1dd31e255 | ||
|
9fa81a6ab8 | ||
|
52c0efedb7 | ||
|
d7abbaa10f | ||
|
f46f25dbaf | ||
|
54e68e949f | ||
|
1be19e5f12 | ||
|
f135bd8f61 | ||
|
e36c646caf | ||
|
61abd3e89e | ||
|
232699cb31 | ||
|
b42f543b93 | ||
|
acd34fda78 | ||
|
7e26d650bc | ||
|
79ee40e885 | ||
|
3bf94f7b61 | ||
|
32cb401c79 | ||
|
4db42544d2 | ||
|
9eafe4e274 | ||
|
178cdbe216 | ||
|
04587d3a39 | ||
|
aaf52f0628 | ||
|
bd01aad8e6 | ||
|
8be5b2fc52 | ||
|
6eae0403c1 | ||
|
3d47c15feb | ||
|
26c859fcbd | ||
|
538e89be54 | ||
|
b68dc80cb6 | ||
|
d817865575 | ||
|
d0f4f363d2 | ||
|
53a0c9cc2e | ||
|
27475c599f | ||
|
b8bc8301f9 | ||
|
411823a24d | ||
|
799633854b | ||
|
2b0b734160 | ||
|
1b2b8da12f | ||
|
4e1d247ce3 | ||
|
136ef74759 | ||
|
bfe6b6b925 | ||
|
7deb727a90 | ||
|
68f0c9ee74 | ||
|
01a6208fa7 | ||
|
fd93c81fbb | ||
|
4ad749a481 | ||
|
0cf47573fb | ||
|
79642b4d29 | ||
|
273927d40a | ||
|
979d8f051e | ||
|
c24e3c2aac | ||
|
fa9550e5e7 | ||
|
b11dab8c30 | ||
|
4a82d5e8bc | ||
|
444e8c0338 | ||
|
c6dde7ecc5 | ||
|
4b45f4224e | ||
|
eea397ed85 | ||
|
b8a7bf3104 | ||
|
00d4c6ec93 | ||
|
6435bcbf4f | ||
|
c731caa23d | ||
|
2618144e24 | ||
|
90f951a899 | ||
|
ebaa83c483 | ||
|
c2223d4deb | ||
|
0472d9483c | ||
|
b86121be85 | ||
|
c5032d816b | ||
|
8d558e636a | ||
|
ebcf07ddaa | ||
|
d6cf56a465 | ||
|
7d75f46d2c | ||
|
1a76b92300 | ||
|
56ae978017 | ||
|
bbf956b518 | ||
|
e78b239597 | ||
|
754b347d7c | ||
|
cf95fc3530 | ||
|
25d9d717b5 | ||
|
aa563cb5cb | ||
|
43082ed65b | ||
|
9f710a8c84 | ||
|
3099633675 | ||
|
21c13c0886 | ||
|
0972e57a5b | ||
|
3bce994ea8 | ||
|
fdf98d0ef3 | ||
|
041dc98c9c | ||
|
1f3f4ea353 | ||
|
c4c8f0a099 | ||
|
28de5426f2 | ||
|
e105274de4 | ||
|
8028ce2888 | ||
|
cef19a8b13 | ||
|
3a36bdd474 | ||
|
b86452cf08 | ||
|
1c2d17d869 | ||
|
d259ec0b76 | ||
|
52e84741d0 | ||
|
c2a241c357 | ||
|
120d02e5fb | ||
|
14eb302022 | ||
|
d502afa171 | ||
|
14b3950d44 | ||
|
eabc8534b0 | ||
|
a80917705d | ||
|
e92948a44e | ||
|
fd2b26a975 | ||
|
40b6272570 | ||
|
a82e6f7f6b | ||
|
e34d02edbc | ||
|
3810a31230 | ||
|
00710497b0 | ||
|
420034d5b5 | ||
|
b3893f7bda | ||
|
4e28b88c22 | ||
|
fa0dcb5d4d | ||
|
819074136a | ||
|
03ac46120c | ||
|
cc76052038 | ||
|
3f38a3cf18 | ||
|
1c7dcaf5d5 | ||
|
dbdfc52a00 | ||
|
d4489091e2 | ||
|
6fa2edf9d5 | ||
|
6e608907b4 | ||
|
ac504c70a2 | ||
|
2bb86ee6ea | ||
|
a02dc9aad6 | ||
|
69033f37f8 | ||
|
aa7770911b | ||
|
b954ad8cd7 | ||
|
9158b1688e | ||
|
9effd91f62 | ||
|
0ddf75b382 | ||
|
a2eb0d7b4c | ||
|
14ee759409 | ||
|
aff1ac0f69 | ||
|
9453e085b3 | ||
|
da4cf552cb | ||
|
91e0f86a0b | ||
|
aae488794e | ||
|
4dffeeb56e | ||
|
ed7075f4ba | ||
|
185a10f7c5 | ||
|
5d3fcd3ba0 | ||
|
3b1a3c51b1 | ||
|
ea18939738 | ||
|
d22ff42e42 | ||
|
190d789a54 | ||
|
8534a8aba4 | ||
|
9ec3e015b2 | ||
|
b8c05410e3 | ||
|
fd6fae3858 | ||
|
ca4a2ca813 | ||
|
da0d245685 | ||
|
e0568f4f63 | ||
|
f61d0d35bd | ||
|
61fbe94ee2 | ||
|
523fe108be | ||
|
23e6b50aa9 | ||
|
22337b2bdb | ||
|
b38a53490c | ||
|
326dd6e11d | ||
|
40e5af8d57 | ||
|
eea7bac1e8 | ||
|
a5e4c47f1d | ||
|
9804df24a1 | ||
|
bad115cac0 | ||
|
696829a260 | ||
|
09cc52296d | ||
|
abc616b548 | ||
|
c3b9b9a524 | ||
|
2277ba38c7 | ||
|
97a72b4934 | ||
|
ecd4b9aab3 | ||
|
882ab6ae59 | ||
|
f3423dba60 | ||
|
39c1754a7f | ||
|
f190773790 | ||
|
5b34458439 | ||
|
59c9a55baa | ||
|
92f566f1d3 | ||
|
5b6ba959d9 | ||
|
675e7e6bdc | ||
|
07d1b0e882 | ||
|
f826f8c4b2 | ||
|
82f3c85343 | ||
|
3344c21c71 | ||
|
b2274fbbed | ||
|
cd80fffbe2 | ||
|
5e25bc9277 | ||
|
06d84d1d5b | ||
|
6661d1e10c | ||
|
6caf43f9e7 | ||
|
7b51c99439 | ||
|
1cf284bd6f | ||
|
1f27f8e39a | ||
|
caaad41e26 | ||
|
120055fa43 | ||
|
72bd67c6ef | ||
|
ac35f4d20f | ||
|
56e1055dec | ||
|
ed88c630ea | ||
|
da0f443f62 | ||
|
2eac2b8546 | ||
|
1d97e9f573 | ||
|
bd7ccccda6 | ||
|
f0f047e6c5 | ||
|
271f103ae3 | ||
|
99b893368b | ||
|
e4007bae99 | ||
|
6e8b4c3ee7 | ||
|
ccb35c7707 | ||
|
391ceaea11 | ||
|
feae4a2d56 | ||
|
70dfd6b8d4 | ||
|
a1f8e52ae8 | ||
|
a5525ba2b3 | ||
|
1c5449fcd6 | ||
|
359152c8d1 | ||
|
2c41742b99 | ||
|
a20342ed48 | ||
|
d424cdaad3 | ||
|
141bb7dec4 | ||
|
2874e0eade | ||
|
6520925c5b | ||
|
77384be44a | ||
|
7c5ad2405e | ||
|
250c0c54a8 | ||
|
2930727a87 | ||
|
a281b46214 | ||
|
8a7fd33b2b | ||
|
305a501ef3 | ||
|
d073c54c0d | ||
|
705bd47bcd | ||
|
4128259e8e | ||
|
44bdb42fd0 | ||
|
7de0f9f524 | ||
|
1e3ac37c96 | ||
|
81d950aee6 | ||
|
9fde4fc6fa | ||
|
7e8a679eb4 | ||
|
a20cdef996 | ||
|
5be72a84d3 | ||
|
0b46052259 | ||
|
0cc48e148f | ||
|
3cf24d18e7 | ||
|
b765807530 | ||
|
24db98b5e1 | ||
|
5f21b077a6 | ||
|
72aae21420 | ||
|
b8f206f1d4 | ||
|
69e2ca5ce6 | ||
|
1020303fec | ||
|
68dee3f3a4 | ||
|
64f3f534a2 | ||
|
4588c2f1e8 | ||
|
5eb7dd3ef7 | ||
|
c548c55274 | ||
|
fcc7af9991 | ||
|
e79bb4f8be | ||
|
e8d25cd78f | ||
|
55408ffda6 | ||
|
803e6ef418 | ||
|
0b831773af | ||
|
bc4bd61de6 | ||
|
38426b8a64 | ||
|
e9ebb418f3 | ||
|
f2cbb733a0 | ||
|
195f123c05 | ||
|
3408da4f40 | ||
|
ab34ede1ea | ||
|
dddf9dcb83 | ||
|
f6cbce7324 | ||
|
6034143788 | ||
|
7ad60c4471 | ||
|
4f5fd4bea6 | ||
|
2ab43e6c0a | ||
|
663eaaa65b | ||
|
e950c89c2f | ||
|
bcb4eb6064 | ||
|
c1a00bb944 | ||
|
480f8bbb68 | ||
|
f1e8e8b4a2 | ||
|
4f4a2c9cdd | ||
|
dd510b0286 | ||
|
018f0907c2 | ||
|
f2a27e592d | ||
|
89d526e740 | ||
|
68e2df9db6 | ||
|
87c11e7e2f | ||
|
7142621966 | ||
|
54d6196698 | ||
|
6b970f8e02 | ||
|
fb28f40b72 | ||
|
efd4f15d9d | ||
|
be74bb8017 | ||
|
3acff3caba | ||
|
c6eb59eb42 | ||
|
89948603de | ||
|
25a9835014 | ||
|
70eb74bc09 | ||
|
3e3b63181b | ||
|
91ea5ba877 | ||
|
b2754b573a | ||
|
6029b13828 | ||
|
6e8acf6fdc | ||
|
f16831a51d | ||
|
117fffef0b | ||
|
47570b3676 | ||
|
250152fd7c | ||
|
7dbf960291 | ||
|
5fa23309c5 | ||
|
e8fb2f58f2 | ||
|
5bf2814178 | ||
|
b621bbe3e8 | ||
|
9c41bca63f | ||
|
efab6d7e51 | ||
|
910e3ec490 | ||
|
df6d8be57f | ||
|
b670f096be | ||
|
b7d27d156f | ||
|
51e37ac662 | ||
|
1d68e73690 | ||
|
aeaf259c59 | ||
|
257ba0f733 | ||
|
7eb3a8886f | ||
|
e86954cc7f | ||
|
f23197f811 | ||
|
f28db85017 | ||
|
3f85e1911e | ||
|
b350cd9827 | ||
|
8e22064b71 | ||
|
7a64df78e3 | ||
|
493ad2c306 | ||
|
533cec6236 | ||
|
0dd0bf3043 | ||
|
b0594ed4ef | ||
|
f2e86108d4 | ||
|
8462f3217a |
23
.gitattributes
vendored
Normal file
23
.gitattributes
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# Set default behaviour, in case users don't have core.autocrlf set.
|
||||||
|
* text=auto
|
||||||
|
|
||||||
|
.gitattributes text export-ignore
|
||||||
|
.gitignore text export-ignore
|
||||||
|
*.py text
|
||||||
|
*.txt text
|
||||||
|
*.rst text
|
||||||
|
*.xml text
|
||||||
|
*.desktop text
|
||||||
|
*.svg text
|
||||||
|
*.jpg binary
|
||||||
|
*.png binary
|
||||||
|
*.gif binary
|
||||||
|
*.bat text eol=crlf
|
||||||
|
AUTHORS text
|
||||||
|
COPYING text
|
||||||
|
COPYING.* text
|
||||||
|
README.* text
|
||||||
|
Makefile text
|
||||||
|
ChangeLog text
|
||||||
|
ChangeLog.* text
|
||||||
|
/download_and_compile.sh text ident
|
6
.gitignore
vendored
6
.gitignore
vendored
@ -1,6 +1,6 @@
|
|||||||
dist
|
dist
|
||||||
.DS_Store
|
.DS_Store
|
||||||
install
|
install*/
|
||||||
3rdParty
|
3rdParty
|
||||||
3rdParty.x64
|
3rdParty.x64
|
||||||
boost_1_44_0
|
boost_1_44_0
|
||||||
@ -21,3 +21,7 @@ osgbuild
|
|||||||
CMakeCache.txt
|
CMakeCache.txt
|
||||||
*.pyc
|
*.pyc
|
||||||
build-*
|
build-*
|
||||||
|
testOutput*
|
||||||
|
md5sum.xml
|
||||||
|
staging
|
||||||
|
|
||||||
|
20
.gitmodules
vendored
20
.gitmodules
vendored
@ -1,20 +1,24 @@
|
|||||||
[submodule "simgear"]
|
[submodule "simgear"]
|
||||||
path = simgear
|
path = simgear
|
||||||
url = https://git.code.sf.net/p/flightgear/simgear
|
url = ../simgear
|
||||||
branch = release/2017.1
|
branch = next
|
||||||
[submodule "flightgear"]
|
[submodule "flightgear"]
|
||||||
path = flightgear
|
path = flightgear
|
||||||
url = https://git.code.sf.net/p/flightgear/flightgear
|
url = ../flightgear
|
||||||
branch = release/2017.1
|
branch = next
|
||||||
[submodule "fgrun"]
|
[submodule "fgrun"]
|
||||||
path = fgrun
|
path = fgrun
|
||||||
url = https://git.code.sf.net/p/flightgear/fgrun
|
url = ../fgrun
|
||||||
branch = next
|
branch = next
|
||||||
[submodule "fgdata"]
|
[submodule "fgdata"]
|
||||||
path = fgdata
|
path = fgdata
|
||||||
url = git://git.code.sf.net/p/flightgear/fgdata
|
url = ../fgdata
|
||||||
branch = release/2017.1
|
branch = next
|
||||||
[submodule "windows-3rd-party"]
|
[submodule "windows-3rd-party"]
|
||||||
path = windows-3rd-party
|
path = windows-3rd-party
|
||||||
url = https://git.code.sf.net/p/flightgear/windows-3rd-party
|
url = ../windows-3rd-party
|
||||||
branch = master
|
branch = master
|
||||||
|
[submodule "getstart"]
|
||||||
|
path = getstart
|
||||||
|
url = ../getstart
|
||||||
|
branch = next
|
||||||
|
50
FlightGear-files.iss
Normal file
50
FlightGear-files.iss
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
[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
|
39
FlightGear-i18n.iss
Normal file
39
FlightGear-i18n.iss
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
[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.
|
286
FlightGear.iss
Executable file → Normal file
286
FlightGear.iss
Executable file → Normal 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!
|
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
|
||||||
;
|
;
|
||||||
; This script creates an installable FlightGear package for Win32 using the
|
; This script creates an installable FlightGear package for Win32 using the
|
||||||
@ -7,7 +7,9 @@
|
|||||||
;
|
;
|
||||||
; http://www.jrsoftware.org/isinfo.php
|
; http://www.jrsoftware.org/isinfo.php
|
||||||
;
|
;
|
||||||
; Note: the files must appear in the X: drive.
|
; 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
|
||||||
; You can do this with the command below:
|
; You can do this with the command below:
|
||||||
;
|
;
|
||||||
; subst X: path_to_files
|
; subst X: path_to_files
|
||||||
@ -17,201 +19,98 @@
|
|||||||
; C:\> subst X: F:\Path\to\FlightGear\root
|
; C:\> subst X: F:\Path\to\FlightGear\root
|
||||||
; C:\> subst X: F:\
|
; 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 "InstallConfig.iss"
|
||||||
|
#include "FlightGear-i18n.iss"
|
||||||
|
|
||||||
#if GetEnv("VSINSTALLDIR") == ""
|
#define FGSourcePath FgHarnessPath + "\flightgear"
|
||||||
#define VSInstallDir "C:\Program Files (x86)\Microsoft Visual Studio 14.0"
|
#define InstallDir64 FgHarnessPath + "\install\msvc140-64"
|
||||||
#else
|
|
||||||
#define VSInstallDir GetEnv("VSINSTALLDIR")
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define VCInstallDir VSInstallDir + "\VC"
|
|
||||||
#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 OSG64InstallDir InstallDir64 + "\OpenSceneGraph"
|
||||||
#define OSG64PluginsDir OSG64InstallDir + "\bin\osgPlugins-" + OSGVersion
|
#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
|
; we copy everything in install/<arch>/bin except these, which aren't
|
||||||
; useful to the end-user to ship
|
; useful to the end-user to ship
|
||||||
#define ExcludedBinaries "*smooth.exe,metar.exe,js_demo.exe"
|
#define ExcludedBinaries "*smooth.exe,metar.exe"
|
||||||
|
|
||||||
|
#include "FlightGear-files.iss"
|
||||||
|
|
||||||
[Setup]
|
[Setup]
|
||||||
AppId=FlightGear
|
AppId=FlightGear_{#FGVersionGroup}
|
||||||
AppName=FlightGear
|
AppName=FlightGear
|
||||||
AppPublisher=The FlightGear Team
|
AppPublisher=The FlightGear Team
|
||||||
OutputBaseFilename=FlightGear-{#FGVersion}{#FGDetails}
|
OutputBaseFilename=FlightGear-{#FGVersion}{#FGDetails}
|
||||||
AppVerName=FlightGear v{#FGVersion}
|
AppVerName=FlightGear v{#FGVersion}
|
||||||
|
AppVersion={#FGVersion}
|
||||||
AppPublisherURL=http://www.flightgear.org
|
AppPublisherURL=http://www.flightgear.org
|
||||||
AppSupportURL=http://www.flightgear.org
|
AppSupportURL=http://www.flightgear.org
|
||||||
AppUpdatesURL=http://www.flightgear.org
|
AppUpdatesURL=http://www.flightgear.org
|
||||||
DefaultDirName={pf}\FlightGear {#FGVersion}
|
DefaultDirName={pf}\FlightGear {#FGVersionGroup}
|
||||||
UsePreviousAppDir=no
|
UsePreviousAppDir=no
|
||||||
DefaultGroupName=FlightGear {#FGVersion}
|
DefaultGroupName=FlightGear {#FGVersionGroup}
|
||||||
UsePreviousGroup=no
|
UsePreviousGroup=no
|
||||||
LicenseFile=X:\flightgear\COPYING
|
LicenseFile={#FGSourcePath}\COPYING
|
||||||
Uninstallable=yes
|
Uninstallable=yes
|
||||||
SetupIconFile=X:\flightgear\package\flightgear.ico
|
SetupIconFile={#FgHarnessPath}\windows\flightgear.ico
|
||||||
VersionInfoVersion={#FGVersion}.0
|
VersionInfoVersion={#FGVersion}.0
|
||||||
InfoBeforeFile=X:\flightgear\package\windows\infobefore.txt
|
WizardImageFile={#FgHarnessPath}\windows\setupimg.bmp
|
||||||
WizardImageFile=X:\flightgear\package\windows\setupimg.bmp
|
|
||||||
WizardImageStretch=No
|
WizardImageStretch=No
|
||||||
WizardSmallImageFile=X:\flightgear\package\windows\setupsmall.bmp
|
WizardSmallImageFile={#FgHarnessPath}\windows\setupsmall.bmp
|
||||||
VersionInfoCompany=The FlightGear Team
|
VersionInfoCompany=The FlightGear Team
|
||||||
UninstallDisplayIcon={app}\bin\fgfs.exe
|
UninstallDisplayIcon={app}\bin\fgfs.exe
|
||||||
ArchitecturesInstallIn64BitMode=x64
|
ArchitecturesInstallIn64BitMode=x64
|
||||||
ArchitecturesAllowed=x86 x64
|
ArchitecturesAllowed=x64
|
||||||
|
|
||||||
; Sign tool must be defined in the Inno Setup GUI, to avoid
|
; Sign tool must be defined in the Inno Setup GUI, to avoid
|
||||||
; exposing the certificate password
|
; exposing the certificate password
|
||||||
; SignTool=fg_code_sign1
|
; SignTool=fg_code_sign1
|
||||||
|
|
||||||
[Tasks]
|
[Tasks]
|
||||||
; 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: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:CreateDesktopIconGroup}"
|
||||||
Name: "desktopicon"; Description: "Create a &desktop icon"; GroupDescription: "Additional icons:"
|
|
||||||
|
|
||||||
[Files]
|
[Languages]
|
||||||
; NOTE: run subst X: F:\ (or whatever path the expanded tree resides at)
|
Name: "en"; MessagesFile: "compiler:Default.isl"; InfoBeforeFile: "{#FgHarnessPath}\windows\info-before-en.txt"
|
||||||
;Source: "X:\*.txt"; DestDir: "{app}"; Flags: ignoreversion
|
Name: "pl"; MessagesFile: "compiler:Languages\Polish.isl"; InfoBeforeFile: "{#FgHarnessPath}\windows\info-before-pl.txt"
|
||||||
; 32 bits install
|
Name: "es"; MessagesFile: "compiler:Languages\Spanish.isl";
|
||||||
|
Name: "nl"; MessagesFile: "compiler:Languages\Dutch.isl";
|
||||||
Source: "{#InstallDir32}\bin\*.*"; DestDir: "{app}\bin"; Excludes: "{#ExcludedBinaries}"; Flags: ignoreversion recursesubdirs; Check: not Is64BitInstallMode
|
Name: "de"; MessagesFile: "compiler:Languages\German.isl";
|
||||||
;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
|
|
||||||
Source: "{#VCInstallDir}\redist\x86\Microsoft.VC140.CRT\*.dll"; 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
|
|
||||||
Source: "{#VCInstallDir}\redist\x64\Microsoft.VC140.CRT\*.dll"; DestDir: "{app}\bin"; Check: Is64BitInstallMode
|
|
||||||
|
|
||||||
; 32/64 bits install
|
|
||||||
;NOTE: FGPanel has no 64 bits equivalent, so we are using the 32 bits binary for 32&64 bits OS
|
|
||||||
;Torsten 2017-02-21: currently no FGPanel due to missing glew dependency
|
|
||||||
;Source: "{#InstallDir32}\bin\fgpanel.exe"; DestDir: "{app}\bin"; Flags: ignoreversion
|
|
||||||
|
|
||||||
|
|
||||||
; 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]
|
[Dirs]
|
||||||
; Make the user installable scenery directory
|
; Make the user installable scenery directory
|
||||||
Name: "{userdocs}\FlightGear\Aircraft"; Permissions: everyone-modify; Check: not DirExists(ExpandConstant('{userdocs}\FlightGear\Aircraft'))
|
Name: "{%USERPROFILE}\FlightGear\Downloads"; Permissions: creatorowner-modify; Check: not DirExists(ExpandConstant('{%USERPROFILE}\FlightGear\Downloads'))
|
||||||
Name: "{userdocs}\FlightGear\TerraSync"; Permissions: everyone-modify; Check: not DirExists(ExpandConstant('{userdocs}\FlightGear\TerraSync'))
|
Name: "{%USERPROFILE}\FlightGear\Custom Aircraft"; Permissions: creatorowner-modify; Check: not DirExists(ExpandConstant('{%USERPROFILE}\FlightGear\Custom Aircraft'))
|
||||||
Name: "{userdocs}\FlightGear\Custom Scenery"; Permissions: everyone-modify; Check: not DirExists(ExpandConstant('{userdocs}\FlightGear\Custom Scenery'))
|
Name: "{%USERPROFILE}\FlightGear\Custom Scenery"; Permissions: creatorowner-modify; Check: not DirExists(ExpandConstant('{%USERPROFILE}\FlightGear\Custom Scenery'))
|
||||||
|
|
||||||
[Icons]
|
[Icons]
|
||||||
Name: "{userdesktop}\FlightGear {#FGVersion}"; Filename: "{app}\bin\fgfs.exe"; Parameters: "--launcher"; WorkingDir: "{app}\bin"; Tasks: desktopicon;
|
Name: "{userdesktop}\FlightGear {#FGVersionGroup}"; 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 {#FGVersionGroup}"; Filename: "{app}\bin\fgfs.exe"; Parameters: "--launcher"; WorkingDir: "{app}\bin";
|
||||||
Name: "{group}\FlightGear Manual"; Filename: "{app}\data\Docs\getstart.pdf"
|
Name: "{group}\FlightGear Manual"; Filename: "{app}\data\Docs\getstart.pdf"
|
||||||
Name: "{group}\FlightGear Documentation"; Filename: "{app}\data\Docs\index.html"
|
Name: "{group}\FlightGear Documentation"; Filename: "{app}\data\Docs\index.html"
|
||||||
Name: "{group}\Flightgear Wiki"; Filename: "http://wiki.flightgear.org"
|
Name: "{group}\Flightgear Wiki"; Filename: "http://wiki.flightgear.org"
|
||||||
Name: "{group}\Tools\Uninstall FlightGear"; Filename: "{uninstallexe}"
|
Name: "{group}\Tools\Uninstall FlightGear {#FGVersion}"; Filename: "{uninstallexe}"
|
||||||
Name: "{group}\Tools\fgjs"; Filename: "cmd"; Parameters: "/k fgjs.exe ""--fg-root={app}\data"""; WorkingDir: "{app}\bin"
|
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\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"
|
Name: "{group}\Tools\fgpanel"; Filename: "cmd"; Parameters: "/k ""{app}\bin\fgpanel.exe"" -h"; WorkingDir: "{app}\bin"
|
||||||
Name: "{group}\Tools\FGCom"; Filename: "{app}\bin\fgcom.exe"; WorkingDir: "{app}\bin"
|
Name: "{group}\Tools\FGCom"; Filename: "{app}\bin\fgcom.exe"; WorkingDir: "{app}\bin"
|
||||||
Name: "{group}\Tools\FGCom-testing"; Filename: "{app}\bin\fgcom.exe"; Parameters: "--frequency=910"; WorkingDir: "{app}\bin"
|
Name: "{group}\Tools\FGCom-testing"; Filename: "{app}\bin\fgcom.exe"; Parameters: "--frequency=910"; WorkingDir: "{app}\bin"
|
||||||
Name: "{group}\Tools\Explore Documentation Folder"; Filename: "{app}\data\Docs"
|
Name: "{group}\Tools\Explore Documentation Folder"; Filename: "{app}\data\Docs"
|
||||||
@ -334,6 +233,62 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
UninstallCheckCleanPage: TNewNotebookPage;
|
||||||
|
UninstallBackButton: TNewButton;
|
||||||
|
UninstallNextButton: TNewButton;
|
||||||
|
DoCleanCheckbox : TNewCheckBox;
|
||||||
|
CleanHelp : TNewStaticText;
|
||||||
|
|
||||||
|
procedure InitializeUninstallProgressForm();
|
||||||
|
begin
|
||||||
|
UninstallCheckCleanPage := TNewNotebookPage.Create(UninstallProgressForm);
|
||||||
|
UninstallCheckCleanPage.Notebook := UninstallProgressForm.InnerNotebook;
|
||||||
|
UninstallCheckCleanPage.Parent := UninstallProgressForm.InnerNotebook;
|
||||||
|
UninstallCheckCleanPage.Align := alClient
|
||||||
|
|
||||||
|
DoCleanCheckbox := TNewCheckBox.Create(UninstallProgressForm);
|
||||||
|
DoCleanCheckbox.Parent := UninstallCheckCleanPage;
|
||||||
|
DoCleanCheckbox.Caption := ExpandConstant('{cm:RemoveAllSettings}');
|
||||||
|
DoCleanCheckbox.Left := ScaleX(10);
|
||||||
|
DoCleanCheckbox.Top := ScaleY(10);
|
||||||
|
|
||||||
|
DoCleanCheckbox.Width := UninstallProgressForm.InnerNotebook.Width - ScaleX(20)
|
||||||
|
DoCleanCheckbox.Height := ScaleY(30)
|
||||||
|
|
||||||
|
CleanHelp := TNewStaticText.Create(UninstallProgressForm);
|
||||||
|
CleanHelp.Parent := UninstallCheckCleanPage;
|
||||||
|
CleanHelp.Top := DoCleanCheckbox.Top + DoCleanCheckbox.Height + ScaleY(10);
|
||||||
|
CleanHelp.Left := DoCleanCheckbox.Left;
|
||||||
|
CleanHelp.Width := DoCleanCheckbox.Width;
|
||||||
|
CleanHelp.Height := CleanHelp.AdjustHeight();
|
||||||
|
|
||||||
|
CleanHelp.WordWrap := True;
|
||||||
|
CleanHelp.Caption := ExpandConstant('{cm:RemoveAllSettingsDescription}');
|
||||||
|
|
||||||
|
UninstallProgressForm.InnerNotebook.ActivePage := UninstallCheckCleanPage;
|
||||||
|
|
||||||
|
UninstallNextButton := TNewButton.Create(UninstallProgressForm);
|
||||||
|
UninstallNextButton.Caption := 'Next';
|
||||||
|
UninstallNextButton.Parent := UninstallProgressForm;
|
||||||
|
UninstallNextButton.Left :=
|
||||||
|
UninstallProgressForm.CancelButton.Left -
|
||||||
|
UninstallProgressForm.CancelButton.Width -
|
||||||
|
ScaleX(10);
|
||||||
|
UninstallNextButton.Top := UninstallProgressForm.CancelButton.Top;
|
||||||
|
UninstallNextButton.Width := UninstallProgressForm.CancelButton.Width;
|
||||||
|
UninstallNextButton.Height := UninstallProgressForm.CancelButton.Height;
|
||||||
|
UninstallNextButton.ModalResult := mrOk;
|
||||||
|
|
||||||
|
UninstallProgressForm.CancelButton.Enabled := True;
|
||||||
|
UninstallProgressForm.CancelButton.ModalResult := mrCancel;
|
||||||
|
|
||||||
|
if UninstallProgressForm.ShowModal = mrCancel then Abort;
|
||||||
|
|
||||||
|
UninstallProgressForm.InnerNotebook.ActivePage := UninstallProgressForm.InstallingPage;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure CurStepChanged(CurStep: TSetupStep);
|
procedure CurStepChanged(CurStep: TSetupStep);
|
||||||
var
|
var
|
||||||
Version: TWindowsVersion;
|
Version: TWindowsVersion;
|
||||||
@ -344,10 +299,10 @@ begin
|
|||||||
if (Version.Major >= 6) then
|
if (Version.Major >= 6) then
|
||||||
begin
|
begin
|
||||||
{ IN and OUT rules must be specified separately, otherwise the firewall will create only the IN rule }
|
{ IN and OUT rules must be specified separately, otherwise the firewall will create only the IN rule }
|
||||||
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', ExpandConstant('{cm:FirewallFgException}'), 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', ExpandConstant('{cm:FirewallFgException}'), 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', ExpandConstant('{cm:FirewallFgcomException}'), 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);
|
AddAdvancedFirewallException('FlightGear FGCom', ExpandConstant('{cm:FirewallFgcomException}'), ExpandConstant('{app}') + '\bin\fgcom.exe', NET_FW_IP_PROTOCOL_ALL, '', '', NET_FW_RULE_DIR_OUT);
|
||||||
end
|
end
|
||||||
else if (Version.Major = 5) and (((Version.Minor = 1) and (Version.ServicePackMajor >= 2)) or ((Version.Minor = 2) and (Version.ServicePackMajor >= 1))) then
|
else if (Version.Major = 5) and (((Version.Minor = 1) and (Version.ServicePackMajor >= 2)) or ((Version.Minor = 2) and (Version.ServicePackMajor >= 1))) then
|
||||||
begin
|
begin
|
||||||
@ -359,7 +314,18 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
|
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
|
||||||
|
var ResultCode: Integer;
|
||||||
begin
|
begin
|
||||||
|
if CurUninstallStep = usUninstall then
|
||||||
|
begin
|
||||||
|
if DoCleanCheckbox.Checked = True then
|
||||||
|
begin
|
||||||
|
Log('Running clean uninstall');
|
||||||
|
Exec(ExpandConstant('{app}\bin\fgfs.exe'), '--uninstall', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
|
||||||
|
Log('clean uninstall completed');
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
if CurUninstallStep = usPostUninstall then
|
if CurUninstallStep = usPostUninstall then
|
||||||
begin
|
begin
|
||||||
RemoveFirewallException('FlightGear', ExpandConstant('{app}') + '\bin\fgfs.exe');
|
RemoveFirewallException('FlightGear', ExpandConstant('{app}') + '\bin\fgfs.exe');
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>fgfs</string>
|
<string>fgfs</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
<string>org.flightgear.FlightGear</string>
|
<string><%= fgBundleIdentifier %></string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string><%= fgVersion %></string>
|
<string><%= fgVersion %></string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
|
@ -1,96 +1,123 @@
|
|||||||
# Nasa2FGearthview
|
# Nasa2FGearthview
|
||||||
A bash-script to convert NASA satellite images to ready-to-use
|
A bash-script to convert NASA satellite images to ready-to-use
|
||||||
textures for FG's EarthView using ImageMagick.
|
textures for FG's EarthView using ImageMagick and normalmap
|
||||||
|
|
||||||
For info about FGearthview, see the forum thread:
|
You can get "normalmap" there:
|
||||||
|
https://github.com/planrich/normalmap
|
||||||
|
|
||||||
|
For info about FGearthview, see the forum thread:\
|
||||||
https://forum.flightgear.org/viewtopic.php?f=6&t=15754
|
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
|
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
|
This script runs on Linux (maybe Mac also?) in a Bash
|
||||||
(Bourne Again Shell) - Windows is not supported (by the nature of the
|
(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
|
script). Maybe it works on windows as well, I don't know, feel free
|
||||||
to try, and please let me know! :)
|
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.
|
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
|
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.
|
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
|
http://wiki.flightgear.org/index.php?title=DDS_Textures_in_FlightGear&redirect=no
|
||||||
|
|
||||||
If you also converted the clouds, then you'll also find 8 cloud-
|
If you also converted the clouds and the height maps, then you'll also
|
||||||
textures in the format .png. Because the .dds-format has trouble with
|
find 8 cloud- and 8 height textures (as well as their conversion to
|
||||||
rendering heavy alpha images, which is because of it's compression
|
normal maps) in the format .png. Because the .dds-format has trouble
|
||||||
algorythm [1], I think it's useless to also build faulty files.
|
with rendering heavy alpha images, which is because of it's
|
||||||
However, this is not entirely true! It is possible to switch off the
|
compression algorythm [1], I think it's useless to also build faulty
|
||||||
.dds/DXT compression. But this results in huge files and is rather
|
files. However, this is not entirely true! It is possible to switch
|
||||||
heavy on the GPU's RAM.
|
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:
|
Buckaroo has created a nice overview on dds-compression:
|
||||||
[1] http://www.buckarooshangar.com/flightgear/tut_dds.html
|
[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:
|
Simply copy "convert.sh" into a folder of your liking and run it:
|
||||||
|
|
||||||
$ ./convert.sh
|
```shell
|
||||||
|
./convert.sh
|
||||||
|
```
|
||||||
|
|
||||||
This will show a help text, since you didn't specify any target(s).
|
This will show a help text, since you didn't specify any target(s).
|
||||||
Possible targets are:
|
Possible targets are:
|
||||||
* world
|
* world
|
||||||
* clouds
|
* clouds
|
||||||
|
* heights
|
||||||
* all
|
* all
|
||||||
|
|
||||||
Additionally, there are some options you could specify (further
|
Additionally, there are some options you could specify (further
|
||||||
explained below):
|
explained below):
|
||||||
* 1k | 2k | 4k | 8k | 16k
|
* 1k | 2k | 4k | 8k | 16k
|
||||||
* nasa
|
* download | no-download
|
||||||
* no-download
|
* world
|
||||||
|
* clouds
|
||||||
|
* heights
|
||||||
* cleanup
|
* cleanup
|
||||||
* rebuild
|
* rebuild
|
||||||
* check
|
* check
|
||||||
|
|
||||||
So your call could look sth like this:
|
So your call could look sth like this:
|
||||||
|
|
||||||
$ ./convert.sh world no-download cleanup 8k
|
```shell
|
||||||
|
./convert.sh world download alt cleanup 8k
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
------------------------------------
|
------------------------------------
|
||||||
Requirements:
|
## Requirements:
|
||||||
|
|
||||||
WARNING!
|
WARNING!
|
||||||
|
|
||||||
This script uses a *lot* disk space! Make sure you have at least 90GB
|
This script uses a *lot* disk space! In my last test run, which
|
||||||
available!
|
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.
|
||||||
|
|
||||||
Also, this script will run for a *very long* time! It might be best to
|
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
|
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
|
time to time, due to the heavy CPU and memory load, which tends to
|
||||||
occur, when converting 54000x27000 images. ;-)
|
occur, when converting 54000x27000 images. ;-)
|
||||||
I also recommend to deactivate swapping!
|
|
||||||
$ sudo swapoff -a
|
|
||||||
To reactivate swapping do:
|
|
||||||
$ sudo swapon -a
|
|
||||||
|
|
||||||
This script relies on wget and imagemagick. Both are easily installed
|
I also recommend to deactivate swapping!
|
||||||
by your systems package-management-system.
|
```shell
|
||||||
(On Debian/Ubuntu this is "apt-get")
|
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").
|
||||||
|
|
||||||
So, on Debian for instance, you only need to put the following into
|
So, on Debian for instance, you only need to put the following into
|
||||||
the console:
|
the console:
|
||||||
|
|
||||||
$ sudo apt-get install wget imagemagick
|
```shell
|
||||||
|
sudo apt-get install wget imagemagick
|
||||||
|
```
|
||||||
|
|
||||||
Depending on your distro, the package names might differ slightly! Use
|
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
|
a search engine of your choice to find out, how the packages are named
|
||||||
@ -98,70 +125,92 @@ in your distro!
|
|||||||
|
|
||||||
You may want to check:
|
You may want to check:
|
||||||
|
|
||||||
$ apt search imagemagick
|
```shell
|
||||||
|
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
|
**world**\
|
||||||
Generates the world tiles, needed to run FG with EarthView.
|
Generates the world tiles, needed to run FG with EarthView.
|
||||||
You will find the results in output/[$resolution]/*. Copy
|
You will find the results in output/[$resolution]/\*. Copy
|
||||||
these into $FGDATA/Models/Astro/*. More about the installation
|
these into $FGDATA/Models/Astro/\*. More about the installation
|
||||||
of these textures can be found here:
|
of these textures can be found here:
|
||||||
http://wiki.flightgear.org/Earthview#Customization
|
http://wiki.flightgear.org/Earthview#Customization
|
||||||
|
|
||||||
clouds
|
**clouds**\
|
||||||
Generates the cloud tiles, needed to run FG with EarthView.
|
Generates the cloud tiles, needed to run FG with EarthView.
|
||||||
The locations are the same as the other textures mentioned
|
The locations are the same as the other textures mentioned
|
||||||
above. Note that clouds are only available with up to 8k
|
above. Note that clouds are only available with up to 8k
|
||||||
resolution, due to the available data at NASA.
|
resolution, due to the available data at NASA.
|
||||||
|
|
||||||
all
|
**heights**\
|
||||||
Converts everything needed for a full-blown earthview texture
|
Generates the height tiles, which are then converted to the
|
||||||
set. Does the same as:
|
normal maps needed to run FG with EarthView. The locations are
|
||||||
$ ./convert.sh world clouds
|
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```
|
||||||
|
|
||||||
|
|
||||||
Options:
|
## Options:
|
||||||
|
|
||||||
1k | 2k | 4k | 8k | 16k
|
**1k | 2k | 4k | 8k | 16k**\
|
||||||
Lets you specify a desired resolution of the textures.
|
Lets you specify a desired resolution of the textures.
|
||||||
Possible values are 1k, 2k, 4k, 8k and 16k. If nothing is
|
Possible values are 1k, 2k, 4k, 8k and 16k. If nothing is
|
||||||
specified, the script will generate all of the resolutions.
|
specified, the script will generate all of the resolutions.
|
||||||
16k is only available for earth textures.
|
16k is recommended only for earth textures, it will induce
|
||||||
|
oversampling from clouds and height maps.
|
||||||
|
|
||||||
nasa
|
**download**\
|
||||||
Causes the script to download directly from
|
Causes the script to download the needed data, this is the
|
||||||
http://visibleearth.nasa.gov . If omitted the script will
|
default behavior (and can be omitted).
|
||||||
download from
|
|
||||||
https://musicchris.de/download/FG/EarthView/raw-data-NASA.7z
|
|
||||||
which is much faster!
|
|
||||||
Uses wget either way.
|
|
||||||
|
|
||||||
no-download
|
**no-download**\
|
||||||
Causes the script to skip the download function. If you
|
Causes the script to skip the download function. If you
|
||||||
already have the source images, then you don't need to
|
already have the source images, then you don't need to
|
||||||
re-download them. (About 2.4GB!)
|
re-download them. (About 2.4GB!)
|
||||||
If omitted, the script will download the source images from
|
If omitted, the script will download the source images from
|
||||||
https://musicchris.de/download/FG/EarthView/raw-data-NASA.7z
|
the default location.
|
||||||
|
|
||||||
cleanup
|
**cleanup**\
|
||||||
Deletes the temporary files created during texture generation.
|
Deletes the temporary files created during texture generation.
|
||||||
These can be found in tmp/
|
These can be found in tmp/
|
||||||
Note: if for some reason you later want some other resolution,
|
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
|
then it's good to have the data there. So only do this, when
|
||||||
you're quite sure that you're done.
|
you're quite sure that you're done.
|
||||||
Frees up a lot of disk-space! Which would have to be
|
Frees up a lot of disk-space! Which would have to be
|
||||||
regenerated if needed again.
|
regenerated if needed again.
|
||||||
|
|
||||||
rebuild
|
**rebuild**\
|
||||||
Deletes only the temporary files of the given target. So if
|
Deletes only the temporary files of the given target. So if
|
||||||
you call './convert.sh rebuild world' the script will delete
|
you call ```./convert.sh rebuild world``` the script will delete
|
||||||
all corresponding temp-files of the target world, which will
|
all corresponding temp-files of the target world, which will
|
||||||
trigger a complete regeneration of the relevant (instead of
|
trigger a complete regeneration of the relevant (instead of
|
||||||
skipping existing files)
|
skipping existing files)
|
||||||
|
|
||||||
check
|
**check**\
|
||||||
Creates mosaics of the tiles, so you can look at them and see
|
Creates mosaics of the tiles, so you can look at them and see
|
||||||
if all went well.
|
if all went well.
|
||||||
|
File diff suppressed because it is too large
Load Diff
167
build_appimage.sh
Executable file
167
build_appimage.sh
Executable file
@ -0,0 +1,167 @@
|
|||||||
|
#!/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[@]}"
|
@ -5,7 +5,11 @@ if [ "$WORKSPACE" == "" ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
VERSION=`cat flightgear/version`
|
VERSION=`cat flightgear/flightgear-version`
|
||||||
|
|
||||||
|
#####################################################################################
|
||||||
|
# ensure fgrcc can run when linked against libSimGearCore, for example
|
||||||
|
export LD_LIBRARY_PATH=$WORKSPACE/dist/lib64:$WORKSPACE/dist/lib:$LD_LIBRARY_PATH
|
||||||
|
|
||||||
#####################################################################################
|
#####################################################################################
|
||||||
# remove old and create fresh build directories
|
# remove old and create fresh build directories
|
||||||
@ -14,50 +18,42 @@ mkdir -p sgBuild
|
|||||||
mkdir -p fgBuild
|
mkdir -p fgBuild
|
||||||
mkdir -p output
|
mkdir -p output
|
||||||
rm -rf output/*
|
rm -rf output/*
|
||||||
rm -rf dist/*
|
|
||||||
|
|
||||||
#####################################################################################
|
#####################################################################################
|
||||||
echo "Starting on SimGear"
|
echo "Starting on SimGear"
|
||||||
cd sgBuild
|
cd sgBuild
|
||||||
cmake -DCMAKE_INSTALL_PREFIX:PATH=$WORKSPACE/dist -DENABLE_DNS:BOOL="ON" -DSIMGEAR_SHARED:BOOL="ON" ../simgear
|
cmake -G Ninja -DCMAKE_INSTALL_PREFIX:PATH=$WORKSPACE/dist -DENABLE_DNS:BOOL="ON" -DSIMGEAR_SHARED:BOOL="ON" -DCMAKE_BUILD_TYPE=RelWithDebInfo ../simgear
|
||||||
|
|
||||||
# compile
|
# compile
|
||||||
make
|
ninja
|
||||||
|
|
||||||
if [ $? -ne '0' ]; then
|
if [ $? -ne '0' ]; then
|
||||||
echo "make simgear failed"
|
echo "make simgear failed"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
make install
|
ninja install
|
||||||
|
|
||||||
# build source package and copy to output
|
# build source package and copy to output
|
||||||
make package_source
|
ninja package_source
|
||||||
cp simgear-*.tar.bz2 ../output/.
|
cp simgear-*.tar.bz2 ../output/.
|
||||||
|
|
||||||
#####################################################################################
|
#####################################################################################
|
||||||
echo "Starting on FlightGear"
|
echo "Starting on FlightGear"
|
||||||
cd ../fgBuild
|
cd ../fgBuild
|
||||||
cmake -DCMAKE_INSTALL_PREFIX:PATH=$WORKSPACE/dist -DSIMGEAR_SHARED:BOOL="ON" ../flightgear
|
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
|
||||||
|
|
||||||
# compile
|
# compile
|
||||||
make
|
ninja
|
||||||
|
|
||||||
if [ $? -ne '0' ]; then
|
if [ $? -ne '0' ]; then
|
||||||
echo "make flightgear failed"
|
echo "make flightgear failed"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
make install
|
ninja install
|
||||||
|
|
||||||
# build source package and copy to output
|
# build source package and copy to output
|
||||||
make package_source
|
ninja package_source
|
||||||
cp flightgear-*.tar.bz2 ../output/.
|
cp flightgear-*.tar.bz2 ../output/.
|
||||||
|
|
||||||
#####################################################################################
|
|
||||||
|
|
||||||
echo "Assembling base package"
|
|
||||||
cd $WORKSPACE
|
|
||||||
|
|
||||||
tar cjf output/FlightGear-$VERSION-data.tar.bz2 fgdata/
|
|
||||||
|
|
||||||
|
@ -1,5 +1,12 @@
|
|||||||
|
|
||||||
IF NOT DEFINED WORKSPACE SET WORKSPACE=%~dp0
|
IF NOT DEFINED WORKSPACE SET WORKSPACE=%~dp0
|
||||||
|
IF NOT DEFINED IS_NIGHTLY_BUILD SET IS_NIGHTLY_BUILD=1
|
||||||
|
|
||||||
|
IF %IS_NIGHTLY_BUILD% EQU 1 (
|
||||||
|
SET FGBUILDTYPE=Nightly
|
||||||
|
) ELSE (
|
||||||
|
SET FGBUILDTYPE=Release
|
||||||
|
)
|
||||||
|
|
||||||
REM following are for testing the script locally
|
REM following are for testing the script locally
|
||||||
REM SET PATH=%PATH%;%ProgramFiles%\CMake\bin;%ProgramFiles(x86)%\"Inno Setup 5"\
|
REM SET PATH=%PATH%;%ProgramFiles%\CMake\bin;%ProgramFiles(x86)%\"Inno Setup 5"\
|
||||||
@ -7,56 +14,42 @@ REM SET QT5SDK32=C:\Qt\5.6\msvc2015
|
|||||||
REM SET QT5SDK64=C:\Qt\5.6\msvc2015_64
|
REM SET QT5SDK64=C:\Qt\5.6\msvc2015_64
|
||||||
REM SET IS_NIGHTLY_BUILD=1
|
REM SET IS_NIGHTLY_BUILD=1
|
||||||
|
|
||||||
SET OSG32=%WORKSPACE%\install\msvc140\OpenSceneGraph
|
|
||||||
SET OSG64=%WORKSPACE%\install\msvc140-64\OpenSceneGraph
|
SET OSG64=%WORKSPACE%\install\msvc140-64\OpenSceneGraph
|
||||||
|
|
||||||
REM 32bits
|
SET VSGEN="Visual Studio 16 2019"
|
||||||
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 ^
|
|
||||||
-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 ^
|
|
||||||
-DCMAKE_PREFIX_PATH=%QT5SDK32%;%OSG32%
|
|
||||||
cmake --build . --config RelWithDebInfo --target INSTALL
|
|
||||||
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
REM 64 bits
|
|
||||||
md build-sg64
|
md build-sg64
|
||||||
md build-fg64
|
md build-fg64
|
||||||
|
|
||||||
cd build-sg64
|
cd build-sg64
|
||||||
cmake ..\SimGear -G "Visual Studio 14 Win64" ^
|
cmake ..\SimGear -G %VSGEN% -A x64 ^
|
||||||
-DMSVC_3RDPARTY_ROOT=%WORKSPACE%/windows-3rd-party/msvc140 ^
|
-DMSVC_3RDPARTY_ROOT=%WORKSPACE%/windows-3rd-party/msvc140 ^
|
||||||
-DBOOST_ROOT=%WORKSPACE%/windows-3rd-party ^
|
-DBOOST_ROOT=%WORKSPACE%/windows-3rd-party ^
|
||||||
|
-DOSG_FSTREAM_EXPORT_FIXED=1 ^
|
||||||
-DCMAKE_PREFIX_PATH:PATH=%OSG64% ^
|
-DCMAKE_PREFIX_PATH:PATH=%OSG64% ^
|
||||||
-DCMAKE_INSTALL_PREFIX:PATH=%WORKSPACE%/install/msvc140-64
|
-DCMAKE_INSTALL_PREFIX:PATH=%WORKSPACE%/install/msvc140-64
|
||||||
|
|
||||||
cmake --build . --config RelWithDebInfo --target INSTALL
|
cmake --build . --config RelWithDebInfo --target INSTALL
|
||||||
|
|
||||||
cd ..\build-fg64
|
cd ..\build-fg64
|
||||||
cmake ..\flightgear -G "Visual Studio 14 Win64" ^
|
cmake ..\flightgear -G %VSGEN% -A x64 ^
|
||||||
-DMSVC_3RDPARTY_ROOT=%WORKSPACE%/windows-3rd-party/msvc140 ^
|
-DMSVC_3RDPARTY_ROOT=%WORKSPACE%/windows-3rd-party/msvc140 ^
|
||||||
-DBOOST_ROOT=%WORKSPACE%/windows-3rd-party ^
|
-DBOOST_ROOT=%WORKSPACE%/windows-3rd-party ^
|
||||||
-DCMAKE_INSTALL_PREFIX:PATH=%WORKSPACE%/install/msvc140-64 ^
|
-DCMAKE_INSTALL_PREFIX:PATH=%WORKSPACE%/install/msvc140-64 ^
|
||||||
-DCMAKE_PREFIX_PATH=%QT5SDK64%;%OSG64%
|
-DCMAKE_PREFIX_PATH=%QT5SDK64%;%OSG64% ^
|
||||||
|
-DOSG_FSTREAM_EXPORT_FIXED=1 ^
|
||||||
|
-DFG_BUILD_TYPE=%FGBUILDTYPE% ^
|
||||||
|
-DENABLE_SWIFT:BOOL=ON
|
||||||
|
|
||||||
cmake --build . --config RelWithDebInfo --target INSTALL
|
cmake --build . --config RelWithDebInfo --target INSTALL
|
||||||
|
|
||||||
cd ..
|
cd ..
|
||||||
|
|
||||||
REM Qt5 deployment
|
REM Qt5 deployment
|
||||||
%QT5SDK32%\bin\windeployqt --release --list target %WORKSPACE%/install/msvc140/bin/fgfs.exe
|
SET QMLDIR=%WORKSPACE%/flightgear/src/GUI/qml
|
||||||
%QT5SDK64%\bin\windeployqt --release --list target %WORKSPACE%/install/msvc140-64/bin/fgfs.exe
|
|
||||||
|
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
|
||||||
|
|
||||||
REM build setup
|
REM build setup
|
||||||
ECHO Packaging root is %WORKSPACE%
|
ECHO Packaging root is %WORKSPACE%
|
||||||
@ -67,21 +60,31 @@ subst X: %WORKSPACE%.
|
|||||||
REM ensure output dir is clean since we upload the entirety of it
|
REM ensure output dir is clean since we upload the entirety of it
|
||||||
rmdir /S /Q output
|
rmdir /S /Q output
|
||||||
|
|
||||||
REM archiving PDB files
|
SET FGFS_PDB=src\Main\RelWithDebInfo\fgfs.pdb
|
||||||
copy %WORKSPACE%\build-fg32\src\Main\RelWithDebInfo\fgfs.pdb %WORKSPACE%\Output\fgfs-x86-%BUILD_NUMBER%.pdb
|
|
||||||
copy %WORKSPACE%\build-fg64\src\Main\RelWithDebInfo\fgfs.pdb %WORKSPACE%\Output\fgfs-x64-%BUILD_NUMBER%.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 indirect way to get command output into an environment variable
|
REM indirect way to get command output into an environment variable
|
||||||
set PATH=%OSG32%\bin;%PATH%
|
set PATH=%OSG64%\bin;%PATH%
|
||||||
osgversion --so-number > %TEMP%\osg-so-number.txt
|
osgversion --so-number > %TEMP%\osg-so-number.txt
|
||||||
osgversion --version-number > %TEMP%\osg-version.txt
|
osgversion --version-number > %TEMP%\osg-version.txt
|
||||||
osgversion --openthreads-soversion-number > %TEMP%\openthreads-so-number.txt
|
osgversion --openthreads-soversion-number > %TEMP%\openthreads-so-number.txt
|
||||||
|
|
||||||
SET /P FLIGHTGEAR_VERSION=<flightgear\version
|
SET /P FLIGHTGEAR_VERSION=<flightgear\flightgear-version
|
||||||
SET /P OSG_VERSION=<%TEMP%\osg-version.txt
|
SET /P OSG_VERSION=<%TEMP%\osg-version.txt
|
||||||
SET /P OSG_SO_NUMBER=<%TEMP%\osg-so-number.txt
|
SET /P OSG_SO_NUMBER=<%TEMP%\osg-so-number.txt
|
||||||
SET /P OT_SO_NUMBER=<%TEMP%\openthreads-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 (
|
IF %IS_NIGHTLY_BUILD% EQU 1 (
|
||||||
REM FlightGear nightly: with fgdata, output filename would be "FlightGear-x.x.x-nightly-full.exe"
|
REM FlightGear nightly: with fgdata, output filename would be "FlightGear-x.x.x-nightly-full.exe"
|
||||||
CALL :writeBaseConfig
|
CALL :writeBaseConfig
|
||||||
@ -101,7 +104,9 @@ IF %IS_NIGHTLY_BUILD% EQU 1 (
|
|||||||
GOTO End
|
GOTO End
|
||||||
|
|
||||||
:writeBaseConfig
|
:writeBaseConfig
|
||||||
ECHO #define FGVersion "%FLIGHTGEAR_VERSION%" > InstallConfig.iss
|
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 OSGVersion "%OSG_VERSION%" >> InstallConfig.iss
|
ECHO #define OSGVersion "%OSG_VERSION%" >> InstallConfig.iss
|
||||||
ECHO #define OSGSoNumber "%OSG_SO_NUMBER%" >> InstallConfig.iss
|
ECHO #define OSGSoNumber "%OSG_SO_NUMBER%" >> InstallConfig.iss
|
||||||
ECHO #define OTSoNumber "%OT_SO_NUMBER%" >> InstallConfig.iss
|
ECHO #define OTSoNumber "%OT_SO_NUMBER%" >> InstallConfig.iss
|
||||||
|
66
catalog/README.md
Normal file
66
catalog/README.md
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
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.
|
@ -1,80 +0,0 @@
|
|||||||
aircraftTypeTags = [
|
|
||||||
"ga", "fighter", "helicopter", "glider", "spaceship", "bomber", "groundvehicle",
|
|
||||||
"tanker", "cargo", "transport", "bizjet", "trainer", "airship", "balloon"
|
|
||||||
]
|
|
||||||
|
|
||||||
manufacturerTags = [
|
|
||||||
"boeing", "cessna", "diamond", "douglas", "bell", "piper",
|
|
||||||
"airbus", "vickers", "lockheed", "fokker",
|
|
||||||
"embraer", "bombardier", "pilatus", "robin",
|
|
||||||
"eurocopter"
|
|
||||||
]
|
|
||||||
|
|
||||||
eraTags = [
|
|
||||||
"early-pioneers",
|
|
||||||
"ww1",
|
|
||||||
"1920s",
|
|
||||||
"1930s",
|
|
||||||
"golden-age",
|
|
||||||
"ww2",
|
|
||||||
"coldwar", "vietnam",
|
|
||||||
"1950s",
|
|
||||||
"1960s",
|
|
||||||
"1970s",
|
|
||||||
"1980s",
|
|
||||||
"1990s",
|
|
||||||
"2000s",
|
|
||||||
"gulfwar1",
|
|
||||||
"gulfwar2"
|
|
||||||
]
|
|
||||||
|
|
||||||
featureTags = [
|
|
||||||
"ifr",
|
|
||||||
"retractable-gear",
|
|
||||||
"fixed-gear",
|
|
||||||
"tail-dragger",
|
|
||||||
"seaplane",
|
|
||||||
"vtol",
|
|
||||||
"stol",
|
|
||||||
"experimental",
|
|
||||||
"prototype",
|
|
||||||
"fictional",
|
|
||||||
"biplane",
|
|
||||||
"triplane",
|
|
||||||
"supersonic",
|
|
||||||
"t-tail",
|
|
||||||
"v-tail",
|
|
||||||
"high-wing",
|
|
||||||
"cannard",
|
|
||||||
"tail-hook",
|
|
||||||
"refuel",
|
|
||||||
"delta",
|
|
||||||
"variable-geometry",
|
|
||||||
"glass-cockpit",
|
|
||||||
"hud",
|
|
||||||
"etops",
|
|
||||||
"floats",
|
|
||||||
"amphibious",
|
|
||||||
"airship",
|
|
||||||
"aerobatic"
|
|
||||||
]
|
|
||||||
|
|
||||||
propulsionTags = [
|
|
||||||
"piston", "radial",
|
|
||||||
"diesel",
|
|
||||||
"variable-pitch",
|
|
||||||
"supercharged",
|
|
||||||
"turboprop",
|
|
||||||
"jet", "afterburner", "rocket",
|
|
||||||
"electric",
|
|
||||||
"twin-engine",
|
|
||||||
"single-engine"
|
|
||||||
]
|
|
||||||
|
|
||||||
simFeatureTags = [
|
|
||||||
"tow",
|
|
||||||
"dual-controls",
|
|
||||||
"rembrandt"
|
|
||||||
]
|
|
||||||
|
|
||||||
tags = aircraftTypeTags + manufacturerTags + eraTags + simFeatureTags + propulsionTags + featureTags
|
|
76
catalog/check_aircraft.py
Executable file
76
catalog/check_aircraft.py
Executable file
@ -0,0 +1,76 @@
|
|||||||
|
#! /usr/bin/env python3
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import os
|
||||||
|
|
||||||
|
from flightgear.meta import sgprops
|
||||||
|
|
||||||
|
|
||||||
|
def check_meta_data(aircraft_dir, set_file, includes):
|
||||||
|
base_file = os.path.basename(set_file)
|
||||||
|
base_id = base_file[:-8]
|
||||||
|
set_path = os.path.join(aircraft_dir, set_file)
|
||||||
|
|
||||||
|
includes.append(aircraft_dir)
|
||||||
|
root_node = sgprops.readProps(set_path, includePaths = includes)
|
||||||
|
|
||||||
|
if not root_node.hasChild("sim"):
|
||||||
|
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)
|
||||||
|
|
||||||
|
if not sim_node.hasChild('long-description'):
|
||||||
|
print("-set.xml missing <long-description>:", set_path)
|
||||||
|
|
||||||
|
if not sim_node.hasChild('authors'):
|
||||||
|
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)
|
||||||
|
|
||||||
|
# check for non-standard tags
|
||||||
|
|
||||||
|
if not sim_node.hasChild('thumbnail'):
|
||||||
|
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)
|
||||||
|
|
||||||
|
if not sim_node.hasChild('minimum-fg-version'):
|
||||||
|
print("-set.xml does not define a minimum FG version", set_path)
|
||||||
|
|
||||||
|
|
||||||
|
# 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)
|
||||||
|
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument("--include", help="Include directory to validate -set.xml parsing",
|
||||||
|
action="append", dest='include', default=[])
|
||||||
|
parser.add_argument("dir", nargs='+', help="Aircraft directory")
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
for d in args.dir:
|
||||||
|
if not os.path.isdir(d):
|
||||||
|
print("Skipping missing directory:", d)
|
||||||
|
|
||||||
|
names = os.listdir(d)
|
||||||
|
for name in sorted(names, key=lambda s: s.lower()):
|
||||||
|
# if name in skip_list:
|
||||||
|
# print "skipping:", name
|
||||||
|
# continue
|
||||||
|
|
||||||
|
acftDir = os.path.join(d, name)
|
||||||
|
check_aircraft_dir(acftDir, args.include)
|
33
catalog/fgaddon-catalog-ukmirror/catalog.config.xml
Normal file
33
catalog/fgaddon-catalog-ukmirror/catalog.config.xml
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<?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>
|
22
catalog/fgaddon-catalog-ukmirror/template.xml
Normal file
22
catalog/fgaddon-catalog-ukmirror/template.xml
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<?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>
|
11
catalog/fgaddon-catalog-ukmirror/zip-excludes.lst
Normal file
11
catalog/fgaddon-catalog-ukmirror/zip-excludes.lst
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
*/.svn/*
|
||||||
|
*.xcf*
|
||||||
|
*.XCF*
|
||||||
|
*.blend*
|
||||||
|
*.psd
|
||||||
|
*~
|
||||||
|
*/dev/*
|
||||||
|
*/Dev/*
|
||||||
|
*/development/*
|
||||||
|
*/src/*
|
||||||
|
*/Resources/*
|
@ -6,13 +6,13 @@
|
|||||||
<version n="1">3.5.*</version>
|
<version n="1">3.5.*</version>
|
||||||
<version n="2">3.6.*</version>
|
<version n="2">3.6.*</version>
|
||||||
<version n="3">3.7.*</version>
|
<version n="3">3.7.*</version>
|
||||||
<version n="4">2016.1.*</version>
|
|
||||||
<version n="5">2016.*.*</version>
|
<version n="5">2016.*.*</version>
|
||||||
<version n="6">2017.*.*</version>
|
<version n="6">2017.*.*</version>
|
||||||
|
<version n="7">2018.*.*</version>
|
||||||
<id>org.flightgear.fgaddon</id>
|
<id>org.flightgear.fgaddon</id>
|
||||||
<license>GPL</license>
|
<license>GPL</license>
|
||||||
<url>http://mirrors.ibiblio.org/flightgear/ftp/Aircraft/catalog.xml</url>
|
<url>http://mirrors.ibiblio.org/flightgear/ftp/Aircraft/catalog.xml</url>
|
||||||
<name>FlightGear Aircraft Distribution From fgaddon</name>
|
<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>
|
<description>This hangar provides aircraft officially supported and maintained by the FlightGear project, under a free-software license.</description>
|
||||||
<de>
|
<de>
|
||||||
<description>Auf Deutsch</description>
|
<description>Auf Deutsch</description>
|
||||||
|
@ -1,5 +1,11 @@
|
|||||||
*/.svn/*
|
*/.svn/*
|
||||||
*.xcf
|
*.xcf*
|
||||||
*.blend
|
*.XCF*
|
||||||
|
*.blend*
|
||||||
*.psd
|
*.psd
|
||||||
*~
|
*~
|
||||||
|
*/dev/*
|
||||||
|
*/Dev/*
|
||||||
|
*/development/*
|
||||||
|
*/src/*
|
||||||
|
*/Resources/*
|
||||||
|
25
catalog/legacy-catalog/catalog.config.xml
Normal file
25
catalog/legacy-catalog/catalog.config.xml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<?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>
|
38
catalog/legacy-catalog/template.xml
Normal file
38
catalog/legacy-catalog/template.xml
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
<?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>
|
5
catalog/legacy-catalog/zip-excludes.lst
Normal file
5
catalog/legacy-catalog/zip-excludes.lst
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
*/.svn/*
|
||||||
|
*.xcf
|
||||||
|
*.blend
|
||||||
|
*.psd
|
||||||
|
*~
|
6
catalog/single-craft-catalog-test/README
Normal file
6
catalog/single-craft-catalog-test/README
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
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.
|
12
catalog/single-craft-catalog-test/catalog.config.xml
Normal file
12
catalog/single-craft-catalog-test/catalog.config.xml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?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>
|
12
catalog/single-craft-catalog-test/template.xml
Normal file
12
catalog/single-craft-catalog-test/template.xml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?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>
|
11
catalog/single-craft-catalog-test/zip-excludes.lst
Normal file
11
catalog/single-craft-catalog-test/zip-excludes.lst
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
*/.svn/*
|
||||||
|
*.xcf*
|
||||||
|
*.XCF*
|
||||||
|
*.blend*
|
||||||
|
*.psd
|
||||||
|
*~
|
||||||
|
*/dev/*
|
||||||
|
*/Dev/*
|
||||||
|
*/development/*
|
||||||
|
*/src/*
|
||||||
|
*/Resources/*
|
34
catalog/stable-2018-catalog/catalog.config.xml
Normal file
34
catalog/stable-2018-catalog/catalog.config.xml
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<?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>
|
21
catalog/stable-2018-catalog/template.xml
Normal file
21
catalog/stable-2018-catalog/template.xml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?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>
|
5
catalog/stable-2018-catalog/zip-excludes.lst
Normal file
5
catalog/stable-2018-catalog/zip-excludes.lst
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
*/.svn/*
|
||||||
|
*.xcf
|
||||||
|
*.blend
|
||||||
|
*.psd
|
||||||
|
*~
|
34
catalog/stable-2020-catalog/catalog.config.xml
Normal file
34
catalog/stable-2020-catalog/catalog.config.xml
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<?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>
|
13
catalog/stable-2020-catalog/template.xml
Normal file
13
catalog/stable-2020-catalog/template.xml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?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>
|
5
catalog/stable-2020-catalog/zip-excludes.lst
Normal file
5
catalog/stable-2020-catalog/zip-excludes.lst
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
*/.svn/*
|
||||||
|
*.xcf
|
||||||
|
*.blend
|
||||||
|
*.psd
|
||||||
|
*~
|
@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/python
|
#! /usr/bin/env python3
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import datetime
|
import datetime
|
||||||
@ -8,12 +8,21 @@ import os
|
|||||||
import re
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
import subprocess
|
import subprocess
|
||||||
import time
|
|
||||||
import sgprops
|
|
||||||
import sys
|
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
|
||||||
|
|
||||||
|
|
||||||
CATALOG_VERSION = 4
|
CATALOG_VERSION = 4
|
||||||
|
|
||||||
|
# The Python version.
|
||||||
|
PY_VERSION = sys.version_info[0]
|
||||||
|
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument("--update", help="Update/pull SCM source",
|
parser.add_argument("--update", help="Update/pull SCM source",
|
||||||
action="store_true")
|
action="store_true")
|
||||||
@ -22,10 +31,13 @@ parser.add_argument("--no-update",
|
|||||||
action="store_true")
|
action="store_true")
|
||||||
parser.add_argument("--clean", help="Force regeneration of all zip files",
|
parser.add_argument("--clean", help="Force regeneration of all zip files",
|
||||||
action="store_true")
|
action="store_true")
|
||||||
|
parser.add_argument("--quiet", help="Only print warnings and errors",
|
||||||
|
action="store_true")
|
||||||
parser.add_argument("dir", help="Catalog directory")
|
parser.add_argument("dir", help="Catalog directory")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
includes = []
|
includes = []
|
||||||
|
mirrors = [] # mirror base URLs
|
||||||
|
|
||||||
# xml node (robust) get text helper
|
# xml node (robust) get text helper
|
||||||
def get_xml_text(e):
|
def get_xml_text(e):
|
||||||
@ -34,131 +46,15 @@ def get_xml_text(e):
|
|||||||
else:
|
else:
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
# create an xml node with text content
|
|
||||||
def make_xml_leaf(name, text):
|
|
||||||
leaf = ET.Element(name)
|
|
||||||
if text != None:
|
|
||||||
if isinstance(text, (int, long)):
|
|
||||||
leaf.text = str(text)
|
|
||||||
else:
|
|
||||||
leaf.text = text
|
|
||||||
else:
|
|
||||||
leaf.text = ''
|
|
||||||
return leaf
|
|
||||||
|
|
||||||
# return all available aircraft information from the set file as a
|
|
||||||
# dict
|
|
||||||
def scan_set_file(aircraft_dir, set_file):
|
|
||||||
global includes
|
|
||||||
|
|
||||||
base_file = os.path.basename(set_file)
|
|
||||||
base_id = base_file[:-8]
|
|
||||||
set_path = os.path.join(aircraft_dir, set_file)
|
|
||||||
|
|
||||||
local_includes = includes
|
|
||||||
local_includes.append(aircraft_dir)
|
|
||||||
root_node = sgprops.readProps(set_path, includePaths = local_includes)
|
|
||||||
|
|
||||||
if not root_node.hasChild("sim"):
|
|
||||||
return None
|
|
||||||
|
|
||||||
sim_node = root_node.getChild("sim")
|
|
||||||
if sim_node == None:
|
|
||||||
return None
|
|
||||||
|
|
||||||
variant = {}
|
|
||||||
variant['name'] = sim_node.getValue("description", None)
|
|
||||||
variant['status'] = sim_node.getValue("status", None)
|
|
||||||
variant['author'] = sim_node.getValue("author", None)
|
|
||||||
variant['description'] = sim_node.getValue("long-description", None)
|
|
||||||
variant['id'] = base_id
|
|
||||||
|
|
||||||
# allow -set.xml files to declare themselves as primary.
|
|
||||||
# we use this avoid needing a variant-of in every other -set.xml
|
|
||||||
variant['primary-set'] = sim_node.getValue('primary-set', False)
|
|
||||||
|
|
||||||
# extract and record previews for each variant
|
|
||||||
if sim_node.hasChild('previews'):
|
|
||||||
print "has previews ..."
|
|
||||||
variant['previews'] = extract_previews(sim_node.getChild('previews'), aircraft_dir)
|
|
||||||
|
|
||||||
if sim_node.hasChild('rating'):
|
|
||||||
rating_node = sim_node.getChild("rating")
|
|
||||||
variant['rating_FDM'] = rating_node.getValue("FDM", 0)
|
|
||||||
variant['rating_systems'] = rating_node.getValue("systems", 0)
|
|
||||||
variant['rating_cockpit'] = rating_node.getValue("cockpit", 0)
|
|
||||||
variant['rating_model'] = rating_node.getValue("model", 0)
|
|
||||||
|
|
||||||
variant['variant-of'] = sim_node.getValue("variant-of", None)
|
|
||||||
#print ' ', variant
|
|
||||||
return variant
|
|
||||||
|
|
||||||
def extract_previews(previews_node, aircraft_dir):
|
|
||||||
result = []
|
|
||||||
for node in previews_node.getChildren("preview"):
|
|
||||||
previewType = node.getValue("type", None)
|
|
||||||
previewPath = node.getValue("path", None)
|
|
||||||
|
|
||||||
# check path exists in base-name-dir
|
|
||||||
fullPath = os.path.join(aircraft_dir, previewPath)
|
|
||||||
if not os.path.isfile(fullPath):
|
|
||||||
print "Bad preview path, skipping:" + fullPath
|
|
||||||
continue
|
|
||||||
result.append({'type':previewType, 'path':previewPath})
|
|
||||||
|
|
||||||
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):
|
|
||||||
# old way of finding the master aircraft: it's the only one whose
|
|
||||||
# variant-of is empty. All the others have an actual value
|
|
||||||
# newer alternative is to specify one -set.xml as the primary. All the
|
|
||||||
# others are therefore variants.
|
|
||||||
setDicts = []
|
|
||||||
found_master = False
|
|
||||||
package = None
|
|
||||||
|
|
||||||
files = os.listdir(aircraft_dir)
|
|
||||||
for file in sorted(files, key=lambda s: s.lower()):
|
|
||||||
if file.endswith('-set.xml'):
|
|
||||||
try:
|
|
||||||
d = scan_set_file(aircraft_dir, file)
|
|
||||||
if d == None:
|
|
||||||
continue
|
|
||||||
except:
|
|
||||||
print "Skipping set file since couldn't be parsed:", os.path.join(aircraft_dir, file), sys.exc_info()[0]
|
|
||||||
continue
|
|
||||||
|
|
||||||
setDicts.append(d)
|
|
||||||
if d['primary-set']:
|
|
||||||
found_master = True
|
|
||||||
package = d
|
|
||||||
|
|
||||||
# didn't find a dict identified explicitly as the primary, look for one
|
|
||||||
# with an undefined variant-of
|
|
||||||
if not found_master:
|
|
||||||
for d in setDicts:
|
|
||||||
if d['variant-of'] == '':
|
|
||||||
found_master = True
|
|
||||||
package = d
|
|
||||||
break
|
|
||||||
|
|
||||||
if not found_master:
|
|
||||||
if len(setDicts) > 1:
|
|
||||||
print "Warning, no explicit primary set.xml in " + aircraft_dir
|
|
||||||
# use the first one
|
|
||||||
package = setDicts[0]
|
|
||||||
|
|
||||||
# variants is just all the set dicts except the master
|
|
||||||
variants = setDicts
|
|
||||||
variants.remove(package)
|
|
||||||
return (package, variants)
|
|
||||||
|
|
||||||
# use svn commands to report the last change date within dir
|
# use svn commands to report the last change date within dir
|
||||||
def last_change_date_svn(dir):
|
def last_change_date_svn(dir):
|
||||||
command = [ 'svn', 'info', dir ]
|
command = [ 'svn', 'info', dir ]
|
||||||
result = subprocess.check_output( command )
|
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)
|
match = re.search('Last Changed Date: (\d+)\-(\d+)\-(\d+)', result)
|
||||||
if match:
|
if match:
|
||||||
rev_str = match.group(1) + match.group(2) + match.group(3)
|
rev_str = match.group(1) + match.group(2) + match.group(3)
|
||||||
@ -182,39 +78,13 @@ def scan_dir_for_change_date_mtime(path):
|
|||||||
maxsec = mtime
|
maxsec = mtime
|
||||||
return maxsec
|
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):
|
def get_md5sum(file):
|
||||||
f = open(file, 'r')
|
f = open(file, 'rb')
|
||||||
md5sum = hashlib.md5(f.read()).hexdigest()
|
md5sum = hashlib.md5(f.read()).hexdigest()
|
||||||
f.close()
|
f.close()
|
||||||
return md5sum
|
return md5sum
|
||||||
|
|
||||||
def append_preview_nodes(node, variant, download_base, package_name):
|
|
||||||
if not 'previews' in variant:
|
|
||||||
return
|
|
||||||
|
|
||||||
for preview in variant['previews']:
|
|
||||||
preview_node = ET.Element('preview')
|
|
||||||
preview_url = download_base + 'previews/' + package_name + '_' + preview['path']
|
|
||||||
preview_node.append( make_xml_leaf('type', preview['type']) )
|
|
||||||
preview_node.append( make_xml_leaf('url', preview_url) )
|
|
||||||
preview_node.append( make_xml_leaf('path', preview['path']) )
|
|
||||||
node.append(preview_node)
|
|
||||||
|
|
||||||
def copy_previews_for_variant(variant, package_name, package_dir, previews_dir):
|
def copy_previews_for_variant(variant, package_name, package_dir, previews_dir):
|
||||||
if not 'previews' in variant:
|
if not 'previews' in variant:
|
||||||
return
|
return
|
||||||
@ -222,7 +92,7 @@ def copy_previews_for_variant(variant, package_name, package_dir, previews_dir):
|
|||||||
for preview in variant['previews']:
|
for preview in variant['previews']:
|
||||||
preview_src = os.path.join(package_dir, preview['path'])
|
preview_src = os.path.join(package_dir, preview['path'])
|
||||||
preview_dst = os.path.join(previews_dir, package_name + '_' + 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)
|
dir = os.path.dirname(preview_dst)
|
||||||
if not os.path.isdir(dir):
|
if not os.path.isdir(dir):
|
||||||
os.makedirs(dir)
|
os.makedirs(dir)
|
||||||
@ -234,6 +104,115 @@ def copy_previews_for_package(package, variants, package_name, package_dir, prev
|
|||||||
for v in variants:
|
for v in variants:
|
||||||
copy_previews_for_variant(v, package_name, package_dir, previews_dir)
|
copy_previews_for_variant(v, package_name, package_dir, previews_dir)
|
||||||
|
|
||||||
|
def copy_thumbnail_for_variant(variant, package_name, package_dir, thumbnails_dir):
|
||||||
|
if not 'thumbnail' in variant:
|
||||||
|
return
|
||||||
|
|
||||||
|
thumb_src = os.path.join(package_dir, variant['thumbnail'])
|
||||||
|
thumb_dst = os.path.join(thumbnails_dir, package_name + '_' + variant['thumbnail'])
|
||||||
|
|
||||||
|
dir = os.path.dirname(thumb_dst)
|
||||||
|
if not os.path.isdir(dir):
|
||||||
|
os.makedirs(dir)
|
||||||
|
if os.path.exists(thumb_src):
|
||||||
|
shutil.copy2(thumb_src, thumb_dst)
|
||||||
|
|
||||||
|
def copy_thumbnails_for_package(package, variants, package_name, package_dir, thumbnails_dir):
|
||||||
|
copy_thumbnail_for_variant(package, package_name, package_dir, thumbnails_dir)
|
||||||
|
|
||||||
|
# and now each variant in turn
|
||||||
|
for v in variants:
|
||||||
|
copy_thumbnail_for_variant(v, package_name, package_dir, thumbnails_dir)
|
||||||
|
|
||||||
|
def process_aircraft_dir(name, repo_path):
|
||||||
|
global includes
|
||||||
|
global download_base
|
||||||
|
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):
|
||||||
|
return
|
||||||
|
|
||||||
|
(package, variants) = catalog.scan_aircraft_dir(aircraft_dir, includes)
|
||||||
|
if package == None:
|
||||||
|
if not args.quiet:
|
||||||
|
print("skipping: %s (no -set.xml files)" % name)
|
||||||
|
return
|
||||||
|
|
||||||
|
if not args.quiet:
|
||||||
|
print("%s:" % name)
|
||||||
|
|
||||||
|
package_node = make_aircraft_node(name, package, variants, download_base, mirrors)
|
||||||
|
|
||||||
|
download_url = download_base + name + '.zip'
|
||||||
|
if 'thumbnail' in package:
|
||||||
|
# this is never even used, but breaks the script by assuming
|
||||||
|
# all aircraft packages have thumbnails defined?
|
||||||
|
thumbnail_url = download_base + 'thumbnails/' + name + '_' + package['thumbnail']
|
||||||
|
|
||||||
|
# get cached md5sum if it exists
|
||||||
|
md5sum = get_xml_text(md5sum_root.find(str('aircraft_' + name)))
|
||||||
|
|
||||||
|
# now do the packaging and rev number stuff
|
||||||
|
dir_mtime = scan_dir_for_change_date_mtime(aircraft_dir)
|
||||||
|
if repo_type == 'svn':
|
||||||
|
rev = last_change_date_svn(aircraft_dir)
|
||||||
|
else:
|
||||||
|
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)
|
||||||
|
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)
|
||||||
|
md5sum = get_md5sum(zipfile)
|
||||||
|
else:
|
||||||
|
if not args.quiet:
|
||||||
|
print("(no change)")
|
||||||
|
if md5sum == "":
|
||||||
|
md5sum = get_md5sum(zipfile)
|
||||||
|
filesize = os.path.getsize(zipfile)
|
||||||
|
package_node.append( catalog.make_xml_leaf('md5', md5sum) )
|
||||||
|
package_node.append( catalog.make_xml_leaf('file-size-bytes', filesize) )
|
||||||
|
|
||||||
|
# handle md5sum cache
|
||||||
|
node = md5sum_root.find('aircraft_' + name)
|
||||||
|
if node != None:
|
||||||
|
node.text = md5sum
|
||||||
|
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)
|
||||||
|
|
||||||
|
catalog_node.append(package_node)
|
||||||
|
|
||||||
|
# copy previews for the package and variants into the
|
||||||
|
# output directory
|
||||||
|
copy_previews_for_package(package, variants, name, aircraft_dir, previews_dir)
|
||||||
|
|
||||||
#def get_file_stats(file):
|
#def get_file_stats(file):
|
||||||
# f = open(file, 'r')
|
# f = open(file, 'r')
|
||||||
# md5 = hashlib.md5(f.read()).hexdigest()
|
# md5 = hashlib.md5(f.read()).hexdigest()
|
||||||
@ -241,19 +220,12 @@ def copy_previews_for_package(package, variants, package_name, package_dir, prev
|
|||||||
# return (md5, file_size)
|
# return (md5, file_size)
|
||||||
|
|
||||||
if not os.path.isdir(args.dir):
|
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)
|
exit(0)
|
||||||
|
|
||||||
parser = ET.XMLParser(remove_blank_text=True)
|
parser = ET.XMLParser(remove_blank_text=True)
|
||||||
|
config_node = parse_config_file(parser=parser, file_name=os.path.join(args.dir, 'catalog.config.xml'))
|
||||||
config_file = 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 = 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')
|
md5sum_file = os.path.join(args.dir, 'md5sum.xml')
|
||||||
if os.path.exists(md5sum_file):
|
if os.path.exists(md5sum_file):
|
||||||
@ -263,9 +235,32 @@ else:
|
|||||||
md5sum_root = ET.Element('PropertyList')
|
md5sum_root = ET.Element('PropertyList')
|
||||||
md5sum_tree = ET.ElementTree(md5sum_root)
|
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')
|
scm_list = config_node.findall('scm')
|
||||||
upload_node = config_node.find('upload')
|
upload_node = config_node.find('upload')
|
||||||
download_base = get_xml_text(config_node.find('download-url'))
|
|
||||||
|
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)
|
||||||
|
|
||||||
output_dir = get_xml_text(config_node.find('local-output'))
|
output_dir = get_xml_text(config_node.find('local-output'))
|
||||||
if output_dir == '':
|
if output_dir == '':
|
||||||
output_dir = os.path.join(args.dir, 'output')
|
output_dir = os.path.join(args.dir, 'output')
|
||||||
@ -286,31 +281,37 @@ zip_excludes = os.path.realpath(tmp)
|
|||||||
for i in config_node.findall("include-dir"):
|
for i in config_node.findall("include-dir"):
|
||||||
path = get_xml_text(i)
|
path = get_xml_text(i)
|
||||||
if not os.path.exists(path):
|
if not os.path.exists(path):
|
||||||
print "Skipping missing include path:", path
|
print("Skipping missing include path: %s" % path)
|
||||||
continue
|
continue
|
||||||
includes.append(path)
|
includes.append(path)
|
||||||
|
|
||||||
# freshen repositories
|
# freshen repositories
|
||||||
if args.no_update:
|
if args.no_update:
|
||||||
print 'Skipping repository updates.'
|
print('Skipping repository updates.')
|
||||||
else:
|
else:
|
||||||
cwd = os.getcwd()
|
cwd = os.getcwd()
|
||||||
for scm in scm_list:
|
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_type = get_xml_text(scm.find('type'))
|
||||||
repo_path = get_xml_text(scm.find('path'))
|
repo_path = get_xml_text(scm.find('path'))
|
||||||
includes.append(repo_path)
|
includes.append(repo_path)
|
||||||
|
|
||||||
if repo_type == 'svn':
|
if repo_type == 'svn':
|
||||||
print 'SVN update:', repo_path
|
print("SVN update: %s" % repo_path)
|
||||||
subprocess.call(['svn', 'update', repo_path])
|
subprocess.call(['svn', 'update', repo_path])
|
||||||
elif repo_type == 'git':
|
elif repo_type == 'git':
|
||||||
print 'GIT pull:', repo_path
|
print("GIT pull: %s" % repo_path)
|
||||||
os.chdir(repo_path)
|
os.chdir(repo_path)
|
||||||
subprocess.call(['git','pull'])
|
subprocess.call(['git','pull'])
|
||||||
elif repo_type == 'no-scm':
|
elif repo_type == 'no-scm':
|
||||||
print "No update of unmannaged files:", repo_path
|
print("No update of unmannaged files: %s" % repo_path)
|
||||||
else:
|
else:
|
||||||
print "Unknown scm type:", scm, repo_path
|
print("Unknown scm type: %s %s" % (scm, repo_path))
|
||||||
os.chdir(cwd)
|
os.chdir(cwd)
|
||||||
|
|
||||||
# names of zip files we want (so we can identify/remove orphans)
|
# names of zip files we want (so we can identify/remove orphans)
|
||||||
@ -332,124 +333,39 @@ for scm in scm_list:
|
|||||||
skip_list = []
|
skip_list = []
|
||||||
for s in skip_nodes:
|
for s in skip_nodes:
|
||||||
skip_list.append(get_xml_text(s))
|
skip_list.append(get_xml_text(s))
|
||||||
print 'skip list:', skip_list
|
|
||||||
|
# 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)
|
||||||
|
|
||||||
names = os.listdir(repo_path)
|
names = os.listdir(repo_path)
|
||||||
for name in sorted(names, key=lambda s: s.lower()):
|
for name in sorted(names, key=lambda s: s.lower()):
|
||||||
if name in skip_list:
|
if name in skip_list or (len(include_list) and name not in include_list):
|
||||||
print "skipping:", name
|
if not args.quiet:
|
||||||
|
print("Skipping: %s" % name)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
aircraft_dir = os.path.join(repo_path, name)
|
# process each aircraft in turn
|
||||||
if os.path.isdir(aircraft_dir):
|
# print("%s %s" % (name, repo_path))
|
||||||
print "%s:" % name,
|
process_aircraft_dir(name, repo_path)
|
||||||
(package, variants) = scan_aircraft_dir(aircraft_dir)
|
|
||||||
if package == None:
|
|
||||||
print "skipping:", name, "(no -set.xml files)"
|
|
||||||
continue
|
|
||||||
#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']) )
|
|
||||||
package_node.append( make_xml_leaf('author', package['author']) )
|
|
||||||
package_node.append( make_xml_leaf('description', package['description']) )
|
|
||||||
if 'rating_FDM' in package or 'rating_systems' in package \
|
|
||||||
or 'rating_cockpit' in package or 'rating_model' in package:
|
|
||||||
rating_node = ET.Element('rating')
|
|
||||||
package_node.append(rating_node)
|
|
||||||
rating_node.append( make_xml_leaf('FDM',
|
|
||||||
package['rating_FDM']) )
|
|
||||||
rating_node.append( make_xml_leaf('systems',
|
|
||||||
package['rating_systems']) )
|
|
||||||
rating_node.append( make_xml_leaf('cockpit',
|
|
||||||
package['rating_cockpit']) )
|
|
||||||
rating_node.append( make_xml_leaf('model',
|
|
||||||
package['rating_model']) )
|
|
||||||
package_node.append( make_xml_leaf('id', package['id']) )
|
|
||||||
for variant in variants:
|
|
||||||
variant_node = ET.Element('variant')
|
|
||||||
package_node.append(variant_node)
|
|
||||||
variant_node.append( make_xml_leaf('id', variant['id']) )
|
|
||||||
variant_node.append( make_xml_leaf('name', variant['name']) )
|
|
||||||
if 'description' in variant:
|
|
||||||
variant_node.append( make_xml_leaf('description', variant['description']) )
|
|
||||||
|
|
||||||
if 'author' in variant:
|
|
||||||
variant_node.append( make_xml_leaf('author', variant['author']) )
|
|
||||||
|
|
||||||
append_preview_nodes(variant_node, variant, download_base, name)
|
|
||||||
|
|
||||||
package_node.append( make_xml_leaf('dir', name) )
|
|
||||||
if not download_base.endswith('/'):
|
|
||||||
download_base += '/'
|
|
||||||
download_url = download_base + name + '.zip'
|
|
||||||
thumbnail_url = download_base + 'thumbnails/' + name + '_thumbnail.jpg'
|
|
||||||
package_node.append( make_xml_leaf('url', download_url) )
|
|
||||||
package_node.append( make_xml_leaf('thumbnail', thumbnail_url) )
|
|
||||||
|
|
||||||
append_preview_nodes(package_node, package, download_base, name)
|
|
||||||
|
|
||||||
# todo: url (download), thumbnail (download url)
|
|
||||||
|
|
||||||
# get cached md5sum if it exists
|
|
||||||
md5sum = get_xml_text(md5sum_root.find(str('aircraft_' + name)))
|
|
||||||
|
|
||||||
# now do the packaging and rev number stuff
|
|
||||||
dir_mtime = scan_dir_for_change_date_mtime(aircraft_dir)
|
|
||||||
if repo_type == 'svn':
|
|
||||||
rev = last_change_date_svn(aircraft_dir)
|
|
||||||
else:
|
|
||||||
d = datetime.datetime.utcfromtimestamp(dir_mtime)
|
|
||||||
rev = d.strftime("%Y%m%d")
|
|
||||||
package_node.append( make_xml_leaf('revision', rev) )
|
|
||||||
#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
|
|
||||||
print "updating:", zipfile
|
|
||||||
make_aircraft_zip(repo_path, name, zipfile)
|
|
||||||
md5sum = get_md5sum(zipfile)
|
|
||||||
else:
|
|
||||||
print "(no change)"
|
|
||||||
if md5sum == "":
|
|
||||||
md5sum = get_md5sum(zipfile)
|
|
||||||
filesize = os.path.getsize(zipfile)
|
|
||||||
package_node.append( make_xml_leaf('md5', md5sum) )
|
|
||||||
package_node.append( make_xml_leaf('file-size-bytes', filesize) )
|
|
||||||
|
|
||||||
# handle md5sum cache
|
|
||||||
node = md5sum_root.find('aircraft_' + name)
|
|
||||||
if node != None:
|
|
||||||
node.text = md5sum
|
|
||||||
else:
|
|
||||||
md5sum_root.append( make_xml_leaf('aircraft_' + name, md5sum) )
|
|
||||||
|
|
||||||
# handle thumbnails
|
|
||||||
thumbnail_src = os.path.join(aircraft_dir, 'thumbnail.jpg')
|
|
||||||
thumbnail_dst = os.path.join(thumbnail_dir, name + '_thumbnail.jpg')
|
|
||||||
if os.path.exists(thumbnail_src):
|
|
||||||
shutil.copy2(thumbnail_src, thumbnail_dst)
|
|
||||||
catalog_node.append(package_node)
|
|
||||||
package_node.append( make_xml_leaf('thumbnail-path', 'thumbnail.jpg') )
|
|
||||||
|
|
||||||
# copy previews for the package and variants into the
|
|
||||||
# output directory
|
|
||||||
copy_previews_for_package(package, variants, name, aircraft_dir, previews_dir)
|
|
||||||
|
|
||||||
# write out the master catalog file
|
# write out the master catalog file
|
||||||
cat_file = os.path.join(output_dir, 'catalog.xml')
|
cat_file = os.path.join(output_dir, 'catalog.xml')
|
||||||
catalog_root.write(cat_file, encoding='utf-8', xml_declaration=True, pretty_print=True)
|
catalog_root.write(cat_file, encoding='utf-8', xml_declaration=True, pretty_print=True)
|
||||||
|
|
||||||
# write out the md5sum cache file
|
# 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)
|
md5sum_tree.write(md5sum_file, encoding='utf-8', xml_declaration=True, pretty_print=True)
|
||||||
|
|
||||||
# look for orphaned zip files
|
# look for orphaned zip files
|
||||||
files = os.listdir(output_dir)
|
files = os.listdir(output_dir)
|
||||||
for file in files:
|
for file in files:
|
||||||
if file.endswith('.zip')and not file in valid_zips:
|
if file.endswith('.zip')and not file in valid_zips:
|
||||||
print "orphaned zip:", file
|
print("orphaned zip: %s" % file)
|
||||||
|
51
catalog/update_catalogs.sh
Executable file
51
catalog/update_catalogs.sh
Executable file
@ -0,0 +1,51 @@
|
|||||||
|
#!/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"
|
||||||
|
|
||||||
|
|
||||||
|
|
345
dev-utils/git-date.py
Executable file
345
dev-utils/git-date.py
Executable file
@ -0,0 +1,345 @@
|
|||||||
|
#! /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
2
fg-from-scratch/.gitignore
vendored
Normal file
2
fg-from-scratch/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
scratch-*/
|
||||||
|
vcpkg-git/
|
481
fg-from-scratch/COPYING
Normal file
481
fg-from-scratch/COPYING
Normal file
@ -0,0 +1,481 @@
|
|||||||
|
GNU LIBRARY GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1991 Free Software Foundation, Inc.
|
||||||
|
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
[This is the first released version of the library GPL. It is
|
||||||
|
numbered 2 because it goes with version 2 of the ordinary GPL.]
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
Licenses are intended to guarantee your freedom to share and change
|
||||||
|
free software--to make sure the software is free for all its users.
|
||||||
|
|
||||||
|
This license, the Library General Public License, applies to some
|
||||||
|
specially designated Free Software Foundation software, and to any
|
||||||
|
other libraries whose authors decide to use it. You can use it for
|
||||||
|
your libraries, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if
|
||||||
|
you distribute copies of the library, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of the library, whether gratis
|
||||||
|
or for a fee, you must give the recipients all the rights that we gave
|
||||||
|
you. You must make sure that they, too, receive or can get the source
|
||||||
|
code. If you link a program with the library, you must provide
|
||||||
|
complete object files to the recipients so that they can relink them
|
||||||
|
with the library, after making changes to the library and recompiling
|
||||||
|
it. And you must show them these terms so they know their rights.
|
||||||
|
|
||||||
|
Our method of protecting your rights has two steps: (1) copyright
|
||||||
|
the library, and (2) offer you this license which gives you legal
|
||||||
|
permission to copy, distribute and/or modify the library.
|
||||||
|
|
||||||
|
Also, for each distributor's protection, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
library. If the library is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original
|
||||||
|
version, so that any problems introduced by others will not reflect on
|
||||||
|
the original authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that companies distributing free
|
||||||
|
software will individually obtain patent licenses, thus in effect
|
||||||
|
transforming the program into proprietary software. To prevent this,
|
||||||
|
we have made it clear that any patent must be licensed for everyone's
|
||||||
|
free use or not licensed at all.
|
||||||
|
|
||||||
|
Most GNU software, including some libraries, is covered by the ordinary
|
||||||
|
GNU General Public License, which was designed for utility programs. This
|
||||||
|
license, the GNU Library General Public License, applies to certain
|
||||||
|
designated libraries. This license is quite different from the ordinary
|
||||||
|
one; be sure to read it in full, and don't assume that anything in it is
|
||||||
|
the same as in the ordinary license.
|
||||||
|
|
||||||
|
The reason we have a separate public license for some libraries is that
|
||||||
|
they blur the distinction we usually make between modifying or adding to a
|
||||||
|
program and simply using it. Linking a program with a library, without
|
||||||
|
changing the library, is in some sense simply using the library, and is
|
||||||
|
analogous to running a utility program or application program. However, in
|
||||||
|
a textual and legal sense, the linked executable is a combined work, a
|
||||||
|
derivative of the original library, and the ordinary General Public License
|
||||||
|
treats it as such.
|
||||||
|
|
||||||
|
Because of this blurred distinction, using the ordinary General
|
||||||
|
Public License for libraries did not effectively promote software
|
||||||
|
sharing, because most developers did not use the libraries. We
|
||||||
|
concluded that weaker conditions might promote sharing better.
|
||||||
|
|
||||||
|
However, unrestricted linking of non-free programs would deprive the
|
||||||
|
users of those programs of all benefit from the free status of the
|
||||||
|
libraries themselves. This Library General Public License is intended to
|
||||||
|
permit developers of non-free programs to use free libraries, while
|
||||||
|
preserving your freedom as a user of such programs to change the free
|
||||||
|
libraries that are incorporated in them. (We have not seen how to achieve
|
||||||
|
this as regards changes in header files, but we have achieved it as regards
|
||||||
|
changes in the actual functions of the Library.) The hope is that this
|
||||||
|
will lead to faster development of free libraries.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow. Pay close attention to the difference between a
|
||||||
|
"work based on the library" and a "work that uses the library". The
|
||||||
|
former contains code derived from the library, while the latter only
|
||||||
|
works together with the library.
|
||||||
|
|
||||||
|
Note that it is possible for a library to be covered by the ordinary
|
||||||
|
General Public License rather than by this special one.
|
||||||
|
|
||||||
|
GNU LIBRARY GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License Agreement applies to any software library which
|
||||||
|
contains a notice placed by the copyright holder or other authorized
|
||||||
|
party saying it may be distributed under the terms of this Library
|
||||||
|
General Public License (also called "this License"). Each licensee is
|
||||||
|
addressed as "you".
|
||||||
|
|
||||||
|
A "library" means a collection of software functions and/or data
|
||||||
|
prepared so as to be conveniently linked with application programs
|
||||||
|
(which use some of those functions and data) to form executables.
|
||||||
|
|
||||||
|
The "Library", below, refers to any such software library or work
|
||||||
|
which has been distributed under these terms. A "work based on the
|
||||||
|
Library" means either the Library or any derivative work under
|
||||||
|
copyright law: that is to say, a work containing the Library or a
|
||||||
|
portion of it, either verbatim or with modifications and/or translated
|
||||||
|
straightforwardly into another language. (Hereinafter, translation is
|
||||||
|
included without limitation in the term "modification".)
|
||||||
|
|
||||||
|
"Source code" for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For a library, complete source code means
|
||||||
|
all the source code for all modules it contains, plus any associated
|
||||||
|
interface definition files, plus the scripts used to control compilation
|
||||||
|
and installation of the library.
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running a program using the Library is not restricted, and output from
|
||||||
|
such a program is covered only if its contents constitute a work based
|
||||||
|
on the Library (independent of the use of the Library in a tool for
|
||||||
|
writing it). Whether that is true depends on what the Library does
|
||||||
|
and what the program that uses the Library does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Library's
|
||||||
|
complete source code as you receive it, in any medium, provided that
|
||||||
|
you conspicuously and appropriately publish on each copy an
|
||||||
|
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||||
|
all the notices that refer to this License and to the absence of any
|
||||||
|
warranty; and distribute a copy of this License along with the
|
||||||
|
Library.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy,
|
||||||
|
and you may at your option offer warranty protection in exchange for a
|
||||||
|
fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Library or any portion
|
||||||
|
of it, thus forming a work based on the Library, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The modified work must itself be a software library.
|
||||||
|
|
||||||
|
b) You must cause the files modified to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
c) You must cause the whole of the work to be licensed at no
|
||||||
|
charge to all third parties under the terms of this License.
|
||||||
|
|
||||||
|
d) If a facility in the modified Library refers to a function or a
|
||||||
|
table of data to be supplied by an application program that uses
|
||||||
|
the facility, other than as an argument passed when the facility
|
||||||
|
is invoked, then you must make a good faith effort to ensure that,
|
||||||
|
in the event an application does not supply such function or
|
||||||
|
table, the facility still operates, and performs whatever part of
|
||||||
|
its purpose remains meaningful.
|
||||||
|
|
||||||
|
(For example, a function in a library to compute square roots has
|
||||||
|
a purpose that is entirely well-defined independent of the
|
||||||
|
application. Therefore, Subsection 2d requires that any
|
||||||
|
application-supplied function or table used by this function must
|
||||||
|
be optional: if the application does not supply it, the square
|
||||||
|
root function must still compute square roots.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Library,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Library, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote
|
||||||
|
it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Library.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Library
|
||||||
|
with the Library (or with a work based on the Library) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||||
|
License instead of this License to a given copy of the Library. To do
|
||||||
|
this, you must alter all the notices that refer to this License, so
|
||||||
|
that they refer to the ordinary GNU General Public License, version 2,
|
||||||
|
instead of to this License. (If a newer version than version 2 of the
|
||||||
|
ordinary GNU General Public License has appeared, then you can specify
|
||||||
|
that version instead if you wish.) Do not make any other change in
|
||||||
|
these notices.
|
||||||
|
|
||||||
|
Once this change is made in a given copy, it is irreversible for
|
||||||
|
that copy, so the ordinary GNU General Public License applies to all
|
||||||
|
subsequent copies and derivative works made from that copy.
|
||||||
|
|
||||||
|
This option is useful when you wish to copy part of the code of
|
||||||
|
the Library into a program that is not a library.
|
||||||
|
|
||||||
|
4. You may copy and distribute the Library (or a portion or
|
||||||
|
derivative of it, under Section 2) in object code or executable form
|
||||||
|
under the terms of Sections 1 and 2 above provided that you accompany
|
||||||
|
it with the complete corresponding machine-readable source code, which
|
||||||
|
must be distributed under the terms of Sections 1 and 2 above on a
|
||||||
|
medium customarily used for software interchange.
|
||||||
|
|
||||||
|
If distribution of object code is made by offering access to copy
|
||||||
|
from a designated place, then offering equivalent access to copy the
|
||||||
|
source code from the same place satisfies the requirement to
|
||||||
|
distribute the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
5. A program that contains no derivative of any portion of the
|
||||||
|
Library, but is designed to work with the Library by being compiled or
|
||||||
|
linked with it, is called a "work that uses the Library". Such a
|
||||||
|
work, in isolation, is not a derivative work of the Library, and
|
||||||
|
therefore falls outside the scope of this License.
|
||||||
|
|
||||||
|
However, linking a "work that uses the Library" with the Library
|
||||||
|
creates an executable that is a derivative of the Library (because it
|
||||||
|
contains portions of the Library), rather than a "work that uses the
|
||||||
|
library". The executable is therefore covered by this License.
|
||||||
|
Section 6 states terms for distribution of such executables.
|
||||||
|
|
||||||
|
When a "work that uses the Library" uses material from a header file
|
||||||
|
that is part of the Library, the object code for the work may be a
|
||||||
|
derivative work of the Library even though the source code is not.
|
||||||
|
Whether this is true is especially significant if the work can be
|
||||||
|
linked without the Library, or if the work is itself a library. The
|
||||||
|
threshold for this to be true is not precisely defined by law.
|
||||||
|
|
||||||
|
If such an object file uses only numerical parameters, data
|
||||||
|
structure layouts and accessors, and small macros and small inline
|
||||||
|
functions (ten lines or less in length), then the use of the object
|
||||||
|
file is unrestricted, regardless of whether it is legally a derivative
|
||||||
|
work. (Executables containing this object code plus portions of the
|
||||||
|
Library will still fall under Section 6.)
|
||||||
|
|
||||||
|
Otherwise, if the work is a derivative of the Library, you may
|
||||||
|
distribute the object code for the work under the terms of Section 6.
|
||||||
|
Any executables containing that work also fall under Section 6,
|
||||||
|
whether or not they are linked directly with the Library itself.
|
||||||
|
|
||||||
|
6. As an exception to the Sections above, you may also compile or
|
||||||
|
link a "work that uses the Library" with the Library to produce a
|
||||||
|
work containing portions of the Library, and distribute that work
|
||||||
|
under terms of your choice, provided that the terms permit
|
||||||
|
modification of the work for the customer's own use and reverse
|
||||||
|
engineering for debugging such modifications.
|
||||||
|
|
||||||
|
You must give prominent notice with each copy of the work that the
|
||||||
|
Library is used in it and that the Library and its use are covered by
|
||||||
|
this License. You must supply a copy of this License. If the work
|
||||||
|
during execution displays copyright notices, you must include the
|
||||||
|
copyright notice for the Library among them, as well as a reference
|
||||||
|
directing the user to the copy of this License. Also, you must do one
|
||||||
|
of these things:
|
||||||
|
|
||||||
|
a) Accompany the work with the complete corresponding
|
||||||
|
machine-readable source code for the Library including whatever
|
||||||
|
changes were used in the work (which must be distributed under
|
||||||
|
Sections 1 and 2 above); and, if the work is an executable linked
|
||||||
|
with the Library, with the complete machine-readable "work that
|
||||||
|
uses the Library", as object code and/or source code, so that the
|
||||||
|
user can modify the Library and then relink to produce a modified
|
||||||
|
executable containing the modified Library. (It is understood
|
||||||
|
that the user who changes the contents of definitions files in the
|
||||||
|
Library will not necessarily be able to recompile the application
|
||||||
|
to use the modified definitions.)
|
||||||
|
|
||||||
|
b) Accompany the work with a written offer, valid for at
|
||||||
|
least three years, to give the same user the materials
|
||||||
|
specified in Subsection 6a, above, for a charge no more
|
||||||
|
than the cost of performing this distribution.
|
||||||
|
|
||||||
|
c) If distribution of the work is made by offering access to copy
|
||||||
|
from a designated place, offer equivalent access to copy the above
|
||||||
|
specified materials from the same place.
|
||||||
|
|
||||||
|
d) Verify that the user has already received a copy of these
|
||||||
|
materials or that you have already sent this user a copy.
|
||||||
|
|
||||||
|
For an executable, the required form of the "work that uses the
|
||||||
|
Library" must include any data and utility programs needed for
|
||||||
|
reproducing the executable from it. However, as a special exception,
|
||||||
|
the source code distributed need not include anything that is normally
|
||||||
|
distributed (in either source or binary form) with the major
|
||||||
|
components (compiler, kernel, and so on) of the operating system on
|
||||||
|
which the executable runs, unless that component itself accompanies
|
||||||
|
the executable.
|
||||||
|
|
||||||
|
It may happen that this requirement contradicts the license
|
||||||
|
restrictions of other proprietary libraries that do not normally
|
||||||
|
accompany the operating system. Such a contradiction means you cannot
|
||||||
|
use both them and the Library together in an executable that you
|
||||||
|
distribute.
|
||||||
|
|
||||||
|
7. You may place library facilities that are a work based on the
|
||||||
|
Library side-by-side in a single library together with other library
|
||||||
|
facilities not covered by this License, and distribute such a combined
|
||||||
|
library, provided that the separate distribution of the work based on
|
||||||
|
the Library and of the other library facilities is otherwise
|
||||||
|
permitted, and provided that you do these two things:
|
||||||
|
|
||||||
|
a) Accompany the combined library with a copy of the same work
|
||||||
|
based on the Library, uncombined with any other library
|
||||||
|
facilities. This must be distributed under the terms of the
|
||||||
|
Sections above.
|
||||||
|
|
||||||
|
b) Give prominent notice with the combined library of the fact
|
||||||
|
that part of it is a work based on the Library, and explaining
|
||||||
|
where to find the accompanying uncombined form of the same work.
|
||||||
|
|
||||||
|
8. You may not copy, modify, sublicense, link with, or distribute
|
||||||
|
the Library except as expressly provided under this License. Any
|
||||||
|
attempt otherwise to copy, modify, sublicense, link with, or
|
||||||
|
distribute the Library is void, and will automatically terminate your
|
||||||
|
rights under this License. However, parties who have received copies,
|
||||||
|
or rights, from you under this License will not have their licenses
|
||||||
|
terminated so long as such parties remain in full compliance.
|
||||||
|
|
||||||
|
9. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Library or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Library (or any work based on the
|
||||||
|
Library), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Library or works based on it.
|
||||||
|
|
||||||
|
10. Each time you redistribute the Library (or any work based on the
|
||||||
|
Library), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute, link with or modify the Library
|
||||||
|
subject to these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
11. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Library at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Library by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Library.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under any
|
||||||
|
particular circumstance, the balance of the section is intended to apply,
|
||||||
|
and the section as a whole is intended to apply in other circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
12. If the distribution and/or use of the Library is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Library under this License may add
|
||||||
|
an explicit geographical distribution limitation excluding those countries,
|
||||||
|
so that distribution is permitted only in or among countries not thus
|
||||||
|
excluded. In such case, this License incorporates the limitation as if
|
||||||
|
written in the body of this License.
|
||||||
|
|
||||||
|
13. The Free Software Foundation may publish revised and/or new
|
||||||
|
versions of the Library General Public License from time to time.
|
||||||
|
Such new versions will be similar in spirit to the present version,
|
||||||
|
but may differ in detail to address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Library
|
||||||
|
specifies a version number of this License which applies to it and
|
||||||
|
"any later version", you have the option of following the terms and
|
||||||
|
conditions either of that version or of any later version published by
|
||||||
|
the Free Software Foundation. If the Library does not specify a
|
||||||
|
license version number, you may choose any version ever published by
|
||||||
|
the Free Software Foundation.
|
||||||
|
|
||||||
|
14. If you wish to incorporate parts of the Library into other free
|
||||||
|
programs whose distribution conditions are incompatible with these,
|
||||||
|
write to the author to ask for permission. For software which is
|
||||||
|
copyrighted by the Free Software Foundation, write to the Free
|
||||||
|
Software Foundation; we sometimes make exceptions for this. Our
|
||||||
|
decision will be guided by the two goals of preserving the free status
|
||||||
|
of all derivatives of our free software and of promoting the sharing
|
||||||
|
and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||||
|
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||||
|
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||||
|
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||||
|
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||||
|
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||||
|
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||||
|
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||||
|
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||||
|
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||||
|
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||||
|
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||||
|
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||||
|
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||||
|
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||||
|
DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Libraries
|
||||||
|
|
||||||
|
If you develop a new library, and you want it to be of the greatest
|
||||||
|
possible use to the public, we recommend making it free software that
|
||||||
|
everyone can redistribute and change. You can do so by permitting
|
||||||
|
redistribution under these terms (or, alternatively, under the terms of the
|
||||||
|
ordinary General Public License).
|
||||||
|
|
||||||
|
To apply these terms, attach the following notices to the library. It is
|
||||||
|
safest to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least the
|
||||||
|
"copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the library's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library 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
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this library; if not, write to the Free
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||||
|
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1990
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
That's all there is to it!
|
56
fg-from-scratch/CustomSceneryProjects/Test/README.md
Normal file
56
fg-from-scratch/CustomSceneryProjects/Test/README.md
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
## Test Scenery Project
|
||||||
|
An example to demostrate the usage of the TerraGear Scenery tools. By studying this example, you should gain a better understanding of the tool workflow.
|
||||||
|
Copyright (C) 2018 Scott Giese (xDraconian) scttgs0@gmail.com
|
||||||
|
|
||||||
|
### Purpose:
|
||||||
|
Most users could benefit from the availability of a reference example to gain a working understanding of scenery generation. I am hopeful you gain value from this example and i would like to see this lead toward encouraging more Windows users to get involved in contributing to scenery development.
|
||||||
|
|
||||||
|
### Supported Platform:
|
||||||
|
Windows 10
|
||||||
|
|
||||||
|
### Prerequisites:
|
||||||
|
SimGear
|
||||||
|
TerraGear
|
||||||
|
|
||||||
|
### Installation Instructions:
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
### Usage:
|
||||||
|
Below is an explaination of the files provided:
|
||||||
|
|
||||||
|
| File | Description |
|
||||||
|
|-----:|------------|
|
||||||
|
|**generate.cmd** | A command script containing calls to the various TerraGear tools to produce scenery for Oahu |
|
||||||
|
|**test.apt.dat** | Contains all airport data for those located on Oahu |
|
||||||
|
|**/data** | Folder containing files you provide to the TerraGear tools |
|
||||||
|
|**/data/SRTM-3** | Terrain data for Oahu |
|
||||||
|
|**/data/fg_* ** | Shapefiles. These define the type of terrain (grass, lake, forest, etc.) - Items typically defined by a polygon area |
|
||||||
|
|**/data/osm_* ** | OpenStreetMap files. These represent roadways, rivers, etc. - Items typically defined by "lines" |
|
||||||
|
| **/work** | Files produced by the TerraGear tools |
|
||||||
|
| **/output** | Final resulting files. These are the scenery files that will be loaded into FlightGear |
|
||||||
|
|
||||||
|
Run the command script interactively. No log is produced.
|
||||||
|
|
||||||
|
generate.cmd
|
||||||
|
|
||||||
|
Runs the command script and routes STDOUT and STDERR to a log file. You will miss the prompts, so it is important that you monitor the log while it is running.
|
||||||
|
|
||||||
|
generate.cmd > generate.log 2>&1
|
||||||
|
|
||||||
|
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/)
|
||||||
|
|
||||||
|
### Testing the Scenery:
|
||||||
|
|
||||||
|
Configure fgfs or the Flightgear Launcher to look in **/CustomSeneryProjects/Test/output** for additional scenery files.
|
||||||
|
Choose as a starting location from any of the airports present on Oahu (e.g. PHNL or PHNG.)
|
||||||
|
|
||||||
|
Note: You will find that all the buildings, radio towers, smoke stacks, etc. are missing. This is expected since your *output* folder doesn't contain any of these items.
|
||||||
|
|
||||||
|
### Known Issues:
|
||||||
|
|
||||||
|
There is a bug in the toolchain that prevents the airport BTG files from being copied to the */output* folder. You will need to copy these files manually until the issue is resolved. Copy the files you find in the */work/AirportObj* folder to your */output* folder.
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
|
@ -0,0 +1 @@
|
|||||||
|
GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
|
@ -0,0 +1 @@
|
|||||||
|
GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
|
@ -0,0 +1 @@
|
|||||||
|
GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
|
@ -0,0 +1 @@
|
|||||||
|
GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user