4 # \brief Run all setup processes
5 # \date 2009-02-18 15:28GMT
6 # \author Jan Boon (Kaetemi)
7 # Python port of game data build pipeline.
8 # Run all setup processes
10 # NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
11 # Copyright (C) 2009-2014 by authors
13 # This program is free software: you can redistribute it and/or modify
14 # it under the terms of the GNU Affero General Public License as
15 # published by the Free Software Foundation, either version 3 of the
16 # License, or (at your option) any later version.
18 # This program is distributed in the hope that it will be useful,
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 # GNU Affero General Public License for more details.
23 # You should have received a copy of the GNU Affero General Public License
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
27 import time
, sys
, os
, shutil
, subprocess
, distutils
.dir_util
, argparse
28 sys
.path
.append("configuration")
30 parser
= argparse
.ArgumentParser(description
='Ryzom Core - Build Gamedata - Setup')
31 parser
.add_argument('--noconf', '-nc', action
='store_true')
32 parser
.add_argument('--noverify', '-nv', action
='store_true')
33 parser
.add_argument('--preset', '-p', action
='store_true')
34 # parser.add_argument('--haltonerror', '-eh', action='store_true')
35 parser
.add_argument('--includeproject', '-ipj', nargs
='+')
36 parser
.add_argument('--excludeproject', '-epj', nargs
='+')
37 parser
.add_argument('--includeprocess', '-ipc', nargs
='+')
38 parser
.add_argument('--excludeprocess', '-epc', nargs
='+')
39 args
= parser
.parse_args()
41 if not args
.includeproject
== None and not args
.excludeproject
== None:
42 print "ERROR --includeproject cannot be combined with --excludeproject, exit."
45 if not args
.includeprocess
== None and not args
.excludeprocess
== None:
46 print "ERROR --includeprocess cannot be combined with --excludeprocess, exit."
49 if os
.path
.isfile("log.log"):
51 log
= open("log.log", "w")
54 from buildsite
import *
56 printLog(log
, "*** FIRST RUN ***")
58 printLog(log
, "ERROR --noconf is invalid on first run, exit.")
71 ToolDirectories
= [ 'R:/distribution/nel_tools_win_x64-distribution', 'R:/distribution/ryzom_tools_win_x64-distribution' ]
80 ScriptDirectory
= "R:/code/nel/tools/build_gamedata"
85 WorkspaceDirectory
= "R:/leveldesign/workspace"
90 DatabaseDirectory
= "R:/graphics"
95 SoundDirectory
= "R:/sound"
100 SoundDfnDirectory
= "R:/sound/DFN"
105 ExportBuildDirectory
= "R:/pipeline/export"
110 InstallDirectory
= "R:/pipeline/install"
115 ClientDevDirectory
= "R:/pipeline/client_dev"
120 ClientPatchDirectory
= "R:/pipeline/client_patch"
123 ClientInstallDirectory
125 ClientInstallDirectory
= "R:/pipeline/client_install"
128 ShardInstallDirectory
130 ShardInstallDirectory
= "R:/pipeline/shard"
133 WorldEditInstallDirectory
135 WorldEditInstallDirectory
= "R:/pipeline/worldedit"
138 WorldEditorFilesDirectory
140 WorldEditorFilesDirectory
= "R:/code/ryzom/common/data_leveldesign/leveldesign/world_editor_files"
145 LeveldesignDirectory
= "R:/leveldesign"
148 LeveldesignDfnDirectory
150 LeveldesignDfnDirectory
= "R:/leveldesign/DFN"
153 LeveldesignWorldDirectory
155 LeveldesignWorldDirectory
= "R:/leveldesign/world"
160 PrimitivesDirectory
= "R:/leveldesign/primitives"
163 LeveldesignDataCommonDirectory
165 LeveldesignDataCommonDirectory
= "R:/leveldesign/common"
168 LeveldesignDataShardDirectory
170 LeveldesignDataShardDirectory
= "R:/leveldesign/shard"
175 TranslationDirectory
= "R:/leveldesign/translation"
180 GamedevDirectory
= "R:/code/ryzom/client/data/gamedev"
185 DataCommonDirectory
= "R:/code/ryzom/common/data_common"
190 DataShardDirectory
= "R:/code/ryzom/server/data_shard"
193 WindowsExeDllCfgDirectories
195 # TODO: Separate 64bit and 32bit
196 WindowsExeDllCfgDirectories
= [ '', 'R:/build/fv_x64/bin/Release', 'R:/distribution/external_x64', 'R:/code/ryzom/client', '', '', '' ]
199 LinuxServiceExecutableDirectory
201 LinuxServiceExecutableDirectory
= "R:/build/gcc_server/bin"
204 LinuxClientExecutableDirectory
206 LinuxClientExecutableDirectory
= "R:/build/gcc_client/bin"
209 PatchmanCfgAdminDirectory
211 PatchmanCfgAdminDirectory
= "R:/patchman/admin_install"
214 PatchmanCfgDefaultDirectory
216 PatchmanCfgDefaultDirectory
= "R:/patchman/default"
219 PatchmanBridgeServerDirectory
221 PatchmanBridgeServerDirectory
= "R:/pipeline/bridge_server"
225 SignToolExecutable
= "C:/Program Files/Microsoft SDKs/Windows/v6.0A/Bin/signtool.exe"
233 SignToolTimestamp
= "http://timestamp.comodoca.com/authenticode"
241 MaxDirectory
= "C:/Program Files (x86)/Autodesk/3ds Max 2010"
247 MaxUserDirectory
= os
.path
.normpath(os
.environ
["LOCALAPPDATA"] + "/Autodesk/3dsMax/2010 - 32bit/enu")
250 MaxUserDirectory
= "C:/Users/Kaetemi/AppData/Local/Autodesk/3dsMax/2010 - 32bit/enu"
254 MaxExecutable
= "3dsmax.exe"
257 printLog(log
, "-------")
258 printLog(log
, "--- Setup build site")
259 printLog(log
, "-------")
260 printLog(log
, time
.strftime("%Y-%m-%d %H:%MGMT", time
.gmtime(time
.time())))
262 printLog(log
, "This script will set up the buildsite configuration, and create needed directories.")
263 printLog(log
, "To use the defaults, simply hit ENTER, else type in the new value.")
264 printLog(log
, "Use -- if you need to insert an empty value.")
266 BuildQuality
= int(askVar(log
, "Build Quality", str(BuildQuality
)))
268 ToolDirectories
[0] = askVar(log
, "[IN] Primary Tool Directory", ToolDirectories
[0]).replace("\\", "/")
269 ToolDirectories
[1] = askVar(log
, "[IN] Secondary Tool Directory", ToolDirectories
[1]).replace("\\", "/")
270 ToolSuffix
= askVar(log
, "Tool Suffix", ToolSuffix
)
271 ScriptDirectory
= askVar(log
, "[IN] Script Directory", os
.getcwd().replace("\\", "/")).replace("\\", "/")
272 WorkspaceDirectory
= askVar(log
, "[IN] Workspace Directory", WorkspaceDirectory
).replace("\\", "/")
273 DatabaseDirectory
= askVar(log
, "[IN] Database Directory", DatabaseDirectory
).replace("\\", "/")
274 SoundDirectory
= askVar(log
, "[IN] Sound Directory", SoundDirectory
).replace("\\", "/")
275 SoundDfnDirectory
= askVar(log
, "[IN] Sound DFN Directory", SoundDfnDirectory
).replace("\\", "/")
276 ExportBuildDirectory
= askVar(log
, "[OUT] Export Build Directory", ExportBuildDirectory
).replace("\\", "/")
277 InstallDirectory
= askVar(log
, "[OUT] Install Directory", InstallDirectory
).replace("\\", "/")
278 ClientDevDirectory
= askVar(log
, "[OUT] Client Dev Directory", ClientDevDirectory
).replace("\\", "/")
279 ClientPatchDirectory
= askVar(log
, "[OUT] Client Patch Directory", ClientPatchDirectory
).replace("\\", "/")
280 ClientInstallDirectory
= askVar(log
, "[OUT] Client Install Directory", ClientInstallDirectory
).replace("\\", "/")
281 ShardInstallDirectory
= askVar(log
, "[OUT] Shard Data Install Directory", ShardInstallDirectory
).replace("\\", "/")
282 WorldEditInstallDirectory
= askVar(log
, "[OUT] World Edit Data Install Directory", WorldEditInstallDirectory
).replace("\\", "/")
283 LeveldesignDirectory
= askVar(log
, "[IN] Leveldesign Directory", LeveldesignDirectory
).replace("\\", "/")
284 LeveldesignDfnDirectory
= askVar(log
, "[IN] Leveldesign DFN Directory", LeveldesignDfnDirectory
).replace("\\", "/")
285 LeveldesignWorldDirectory
= askVar(log
, "[IN] Leveldesign World Directory", LeveldesignWorldDirectory
).replace("\\", "/")
286 PrimitivesDirectory
= askVar(log
, "[IN] Primitives Directory", PrimitivesDirectory
).replace("\\", "/")
287 GamedevDirectory
= askVar(log
, "[IN] Gamedev Directory", GamedevDirectory
).replace("\\", "/")
288 DataShardDirectory
= askVar(log
, "[IN] Data Shard Directory", DataShardDirectory
).replace("\\", "/")
289 DataCommonDirectory
= askVar(log
, "[IN] Data Common Directory", DataCommonDirectory
).replace("\\", "/")
290 TranslationDirectory
= askVar(log
, "[IN] Translation Directory", TranslationDirectory
).replace("\\", "/")
291 LeveldesignDataShardDirectory
= askVar(log
, "[IN] Leveldesign Data Shard Directory", LeveldesignDataShardDirectory
).replace("\\", "/")
292 LeveldesignDataCommonDirectory
= askVar(log
, "[IN] Leveldesign Data Common Directory", LeveldesignDataCommonDirectory
).replace("\\", "/")
293 WorldEditorFilesDirectory
= askVar(log
, "[IN] World Editor Files Directory", WorldEditorFilesDirectory
).replace("\\", "/")
294 WindowsExeDllCfgDirectories
[0] = askVar(log
, "[IN] Primary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories
[0]).replace("\\", "/")
295 WindowsExeDllCfgDirectories
[1] = askVar(log
, "[IN] Secondary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories
[1]).replace("\\", "/")
296 WindowsExeDllCfgDirectories
[2] = askVar(log
, "[IN] Tertiary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories
[2]).replace("\\", "/")
297 WindowsExeDllCfgDirectories
[3] = askVar(log
, "[IN] Quaternary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories
[3]).replace("\\", "/")
298 WindowsExeDllCfgDirectories
[4] = askVar(log
, "[IN] Quinary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories
[4]).replace("\\", "/")
299 WindowsExeDllCfgDirectories
[5] = askVar(log
, "[IN] Senary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories
[5]).replace("\\", "/")
300 WindowsExeDllCfgDirectories
[6] = askVar(log
, "[IN] Septenary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories
[6]).replace("\\", "/")
301 LinuxServiceExecutableDirectory
= askVar(log
, "[IN] Linux Service Executable Directory", LinuxServiceExecutableDirectory
).replace("\\", "/")
302 LinuxClientExecutableDirectory
= askVar(log
, "[IN] Linux Client Executable Directory", LinuxClientExecutableDirectory
).replace("\\", "/")
303 PatchmanCfgAdminDirectory
= askVar(log
, "[IN] Patchman Cfg Admin Directory", PatchmanCfgAdminDirectory
).replace("\\", "/")
304 PatchmanCfgDefaultDirectory
= askVar(log
, "[IN] Patchman Cfg Default Directory", PatchmanCfgDefaultDirectory
).replace("\\", "/")
305 PatchmanBridgeServerDirectory
= askVar(log
, "[OUT] Patchman Bridge Server Patch Directory", PatchmanBridgeServerDirectory
).replace("\\", "/")
306 SignToolExecutable
= askVar(log
, "Sign Tool Executable", SignToolExecutable
).replace("\\", "/")
307 SignToolSha1
= askVar(log
, "Sign Tool Signature SHA1", SignToolSha1
)
308 SignToolTimestamp
= askVar(log
, "Sign Tool Timestamp Authority", SignToolTimestamp
)
309 MaxAvailable
= int(askVar(log
, "3dsMax Available", str(MaxAvailable
)))
311 MaxDirectory
= askVar(log
, "3dsMax Directory", MaxDirectory
).replace("\\", "/")
312 MaxUserDirectory
= askVar(log
, "3dsMax User Directory", MaxUserDirectory
).replace("\\", "/")
313 MaxExecutable
= askVar(log
, "3dsMax Executable", MaxExecutable
)
314 if os
.path
.isfile("configuration/buildsite.py"):
315 os
.remove("configuration/buildsite.py")
316 sf
= open("configuration/buildsite.py", "w")
317 sf
.write("#!/usr/bin/python\n")
319 sf
.write("# \\file site.py\n")
320 sf
.write("# \\brief Site configuration\n")
321 sf
.write("# \\date " + time
.strftime("%Y-%m-%d-%H-%M-GMT", time
.gmtime(time
.time())) + "\n")
322 sf
.write("# \\author Jan Boon (Kaetemi)\n")
323 sf
.write("# Python port of game data build pipeline.\n")
324 sf
.write("# Site configuration.\n")
326 sf
.write("# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>\n")
327 sf
.write("# Copyright (C) 2009-2014 by authors\n")
329 sf
.write("# This program is free software: you can redistribute it and/or modify\n")
330 sf
.write("# it under the terms of the GNU Affero General Public License as\n")
331 sf
.write("# published by the Free Software Foundation, either version 3 of the\n")
332 sf
.write("# License, or (at your option) any later version.\n")
334 sf
.write("# This program is distributed in the hope that it will be useful,\n")
335 sf
.write("# but WITHOUT ANY WARRANTY; without even the implied warranty of\n")
336 sf
.write("# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n")
337 sf
.write("# GNU Affero General Public License for more details.\n")
339 sf
.write("# You should have received a copy of the GNU Affero General Public License\n")
340 sf
.write("# along with this program. If not, see <http://www.gnu.org/licenses/>.\n")
344 sf
.write("# *** SITE INSTALLATION ***\n")
346 sf
.write("# Use '/' in path name, not '\'\n")
347 sf
.write("# Don't put '/' at the end of a directory name\n")
350 sf
.write("# Quality option for this site (1 for BEST, 0 for DRAFT)\n")
351 sf
.write("BuildQuality = " + str(BuildQuality
) + "\n")
353 sf
.write("ToolDirectories = " + str(ToolDirectories
) + "\n")
354 sf
.write("ToolSuffix = \"" + str(ToolSuffix
) + "\"\n")
356 sf
.write("# Build script directory\n")
357 sf
.write("ScriptDirectory = \"" + str(ScriptDirectory
) + "\"\n")
358 sf
.write("WorkspaceDirectory = \"" + str(WorkspaceDirectory
) + "\"\n")
360 sf
.write("# Data build directories\n")
361 sf
.write("DatabaseDirectory = \"" + str(DatabaseDirectory
) + "\"\n")
362 sf
.write("SoundDirectory = \"" + str(SoundDirectory
) + "\"\n")
363 sf
.write("SoundDfnDirectory = \"" + str(SoundDfnDirectory
) + "\"\n")
364 sf
.write("ExportBuildDirectory = \"" + str(ExportBuildDirectory
) + "\"\n")
366 sf
.write("# Install directories\n")
367 sf
.write("InstallDirectory = \"" + str(InstallDirectory
) + "\"\n")
368 sf
.write("ClientDevDirectory = \"" + str(ClientDevDirectory
) + "\"\n")
369 sf
.write("ClientPatchDirectory = \"" + str(ClientPatchDirectory
) + "\"\n")
370 sf
.write("ClientInstallDirectory = \"" + str(ClientInstallDirectory
) + "\"\n")
371 sf
.write("ShardInstallDirectory = \"" + str(ShardInstallDirectory
) + "\"\n")
372 sf
.write("WorldEditInstallDirectory = \"" + str(WorldEditInstallDirectory
) + "\"\n")
374 sf
.write("# Utility directories\n")
375 sf
.write("WorldEditorFilesDirectory = \"" + str(WorldEditorFilesDirectory
) + "\"\n")
377 sf
.write("# Leveldesign directories\n")
378 sf
.write("LeveldesignDirectory = \"" + str(LeveldesignDirectory
) + "\"\n")
379 sf
.write("LeveldesignDfnDirectory = \"" + str(LeveldesignDfnDirectory
) + "\"\n")
380 sf
.write("LeveldesignWorldDirectory = \"" + str(LeveldesignWorldDirectory
) + "\"\n")
381 sf
.write("PrimitivesDirectory = \"" + str(PrimitivesDirectory
) + "\"\n")
382 sf
.write("LeveldesignDataCommonDirectory = \"" + str(LeveldesignDataCommonDirectory
) + "\"\n")
383 sf
.write("LeveldesignDataShardDirectory = \"" + str(LeveldesignDataShardDirectory
) + "\"\n")
384 sf
.write("TranslationDirectory = \"" + str(TranslationDirectory
) + "\"\n")
386 sf
.write("# Misc data directories\n")
387 sf
.write("GamedevDirectory = \"" + str(GamedevDirectory
) + "\"\n")
388 sf
.write("DataCommonDirectory = \"" + str(DataCommonDirectory
) + "\"\n")
389 sf
.write("DataShardDirectory = \"" + str(DataShardDirectory
) + "\"\n")
390 sf
.write("WindowsExeDllCfgDirectories = " + str(WindowsExeDllCfgDirectories
) + "\n")
391 sf
.write("LinuxServiceExecutableDirectory = \"" + str(LinuxServiceExecutableDirectory
) + "\"\n")
392 sf
.write("LinuxClientExecutableDirectory = \"" + str(LinuxClientExecutableDirectory
) + "\"\n")
393 sf
.write("PatchmanCfgAdminDirectory = \"" + str(PatchmanCfgAdminDirectory
) + "\"\n")
394 sf
.write("PatchmanCfgDefaultDirectory = \"" + str(PatchmanCfgDefaultDirectory
) + "\"\n")
395 sf
.write("PatchmanBridgeServerDirectory = \"" + str(PatchmanBridgeServerDirectory
) + "\"\n")
397 sf
.write("# Sign tool\n")
398 sf
.write("SignToolExecutable = \"" + str(SignToolExecutable
) + "\"\n")
399 sf
.write("SignToolSha1 = \"" + str(SignToolSha1
) + "\"\n")
400 sf
.write("SignToolTimestamp = \"" + str(SignToolTimestamp
) + "\"\n")
402 sf
.write("# 3dsMax directives\n")
403 sf
.write("MaxAvailable = " + str(MaxAvailable
) + "\n")
404 sf
.write("MaxDirectory = \"" + str(MaxDirectory
) + "\"\n")
405 sf
.write("MaxUserDirectory = \"" + str(MaxUserDirectory
) + "\"\n")
406 sf
.write("MaxExecutable = \"" + str(MaxExecutable
) + "\"\n")
409 sf
.write("# end of file\n")
412 sys
.path
.append(WorkspaceDirectory
)
413 from projects
import *
416 printLog(log
, "-------")
417 printLog(log
, "--- Run the setup projects")
418 printLog(log
, "-------")
419 printLog(log
, time
.strftime("%Y-%m-%d %H:%MGMT", time
.gmtime(time
.time())))
422 for projectName
in ProjectsToProcess
:
423 if ((args
.includeproject
== None or projectName
in args
.includeproject
) and (args
.excludeproject
== None or not projectName
in args
.excludeproject
)):
424 printLog(log
, "PROJECT " + projectName
)
425 os
.putenv("NELBUILDACTIVEPROJECT", os
.path
.abspath(WorkspaceDirectory
+ "/" + projectName
))
426 os
.chdir("processes")
428 if not args
.includeprocess
== None:
429 subprocess
.call([ "python", "0_setup.py", "--includeprocess" ] + args
.includeprocess
)
430 elif not args
.excludeprocess
== None:
431 subprocess
.call([ "python", "0_setup.py", "--excludeprocess" ] + args
.excludeprocess
)
433 subprocess
.call([ "python", "0_setup.py" ])
435 printLog(log
, "<" + projectName
+ "> " + str(e
))
438 projectLog
= open("processes/log.log", "r")
439 projectLogData
= projectLog
.read()
441 log
.write(projectLogData
)
443 printLog(log
, "<" + projectName
+ "> " + str(e
))
445 printLog(log
, "IGNORE PROJECT " + projectName
)
448 # Additional directories
449 printLog(log
, ">>> Setup additional directories <<<")
450 mkPath(log
, ClientDevDirectory
)
451 mkPath(log
, ClientPatchDirectory
)
452 mkPath(log
, ClientInstallDirectory
)
454 if not args
.noverify
:
456 printLog(log
, "-------")
457 printLog(log
, "--- Verify tool paths")
458 printLog(log
, "-------")
459 printLog(log
, time
.strftime("%Y-%m-%d %H:%MGMT", time
.gmtime(time
.time())))
462 findMax(log
, MaxDirectory
, MaxExecutable
)
463 findTool(log
, ToolDirectories
, TgaToDdsTool
, ToolSuffix
)
464 findTool(log
, ToolDirectories
, BuildInterfaceTool
, ToolSuffix
)
465 findTool(log
, ToolDirectories
, ExecTimeoutTool
, ToolSuffix
)
466 findTool(log
, ToolDirectories
, BuildSmallbankTool
, ToolSuffix
)
467 findTool(log
, ToolDirectories
, BuildFarbankTool
, ToolSuffix
)
468 findTool(log
, ToolDirectories
, ZoneDependenciesTool
, ToolSuffix
)
469 findTool(log
, ToolDirectories
, ZoneWelderTool
, ToolSuffix
)
470 findTool(log
, ToolDirectories
, ZoneElevationTool
, ToolSuffix
)
471 findTool(log
, ToolDirectories
, BuildRbankTool
, ToolSuffix
)
472 findTool(log
, ToolDirectories
, BuildIndoorRbankTool
, ToolSuffix
)
473 findTool(log
, ToolDirectories
, BuildIgBoxesTool
, ToolSuffix
)
474 findTool(log
, ToolDirectories
, GetNeighborsTool
, ToolSuffix
)
475 findTool(log
, ToolDirectories
, ZoneLighterTool
, ToolSuffix
)
476 findTool(log
, ToolDirectories
, ZoneIgLighterTool
, ToolSuffix
)
477 findTool(log
, ToolDirectories
, IgLighterTool
, ToolSuffix
)
478 findTool(log
, ToolDirectories
, AnimBuilderTool
, ToolSuffix
)
479 findTool(log
, ToolDirectories
, TileEditTool
, ToolSuffix
)
480 # findTool(log, ToolDirectories, BuildImagesetTool, ToolSuffix) # kaetemi stuff, ignore this
481 findTool(log
, ToolDirectories
, MakeSheetIdTool
, ToolSuffix
)
482 # findTool(log, ToolDirectories, BuildSheetsTool, ToolSuffix) # kaetemi stuff, ignore this
483 # findTool(log, ToolDirectories, BuildSoundTool, ToolSuffix) # kaetemi stuff, ignore this
484 # findTool(log, ToolDirectories, BuildSoundTool, ToolSuffix)
485 findTool(log
, ToolDirectories
, BuildSoundbankTool
, ToolSuffix
)
486 findTool(log
, ToolDirectories
, BuildSamplebankTool
, ToolSuffix
)
487 findTool(log
, ToolDirectories
, BuildCoarseMeshTool
, ToolSuffix
)
488 findTool(log
, ToolDirectories
, LightmapOptimizerTool
, ToolSuffix
)
489 findTool(log
, ToolDirectories
, BuildClodtexTool
, ToolSuffix
)
490 findTool(log
, ToolDirectories
, BuildShadowSkinTool
, ToolSuffix
)
491 findTool(log
, ToolDirectories
, PanoplyMakerTool
, ToolSuffix
)
492 findTool(log
, ToolDirectories
, HlsBankMakerTool
, ToolSuffix
)
493 findTool(log
, ToolDirectories
, LandExportTool
, ToolSuffix
)
494 findTool(log
, ToolDirectories
, PrimExportTool
, ToolSuffix
)
495 findTool(log
, ToolDirectories
, IgElevationTool
, ToolSuffix
)
496 findTool(log
, ToolDirectories
, IgAddTool
, ToolSuffix
)
497 findTool(log
, ToolDirectories
, BuildClodBankTool
, ToolSuffix
)
498 findTool(log
, ToolDirectories
, SheetsPackerTool
, ToolSuffix
)
499 findTool(log
, ToolDirectories
, BnpMakeTool
, ToolSuffix
)
500 findTool(log
, ToolDirectories
, AiBuildWmapTool
, ToolSuffix
)
501 findTool(log
, ToolDirectories
, TgaCutTool
, ToolSuffix
)
502 findTool(log
, ToolDirectories
, PatchGenTool
, ToolSuffix
)
503 findTool(log
, ToolDirectories
, TranslationToolsTool
, ToolSuffix
)
504 findTool(log
, ToolDirectories
, BuildWorldPackedColTool
, ToolSuffix
)
505 findTool(log
, ToolDirectories
, R2IslandsTexturesTool
, ToolSuffix
)
508 if os
.path
.isfile("0_setup.log"):
509 os
.remove("0_setup.log")
510 shutil
.copy("log.log", time
.strftime("%Y-%m-%d-%H-%M-GMT", time
.gmtime(time
.time())) + "_setup.log")
511 shutil
.move("log.log", "0_setup.log")