549 lines
15 KiB
Python
549 lines
15 KiB
Python
# vim: set ts=8 sts=2 sw=2 tw=99 et ft=python:
|
|
import os
|
|
|
|
builder.SetBuildFolder('packages')
|
|
|
|
ModPackages = {
|
|
'cstrike': 'cstrike',
|
|
'dod': 'dod',
|
|
'esf': 'esf',
|
|
'ns': 'ns',
|
|
'tfc': 'tfc',
|
|
'tfcx': 'tfc',
|
|
'ts': 'ts',
|
|
}
|
|
|
|
folder_list = [
|
|
'base/addons/amxmodx',
|
|
'base/addons/amxmodx/configs',
|
|
'base/addons/amxmodx/data',
|
|
'base/addons/amxmodx/data/gamedata',
|
|
'base/addons/amxmodx/data/gamedata/common.games',
|
|
'base/addons/amxmodx/data/gamedata/common.games/entities.games',
|
|
'base/addons/amxmodx/data/gamedata/common.games/entities.games/cstrike',
|
|
'base/addons/amxmodx/data/gamedata/common.games/hostages.games',
|
|
'base/addons/amxmodx/data/gamedata/common.games/hostages.games/cstrike',
|
|
'base/addons/amxmodx/data/gamedata/common.games/others.games',
|
|
'base/addons/amxmodx/data/gamedata/common.games/others.games/cstrike',
|
|
'base/addons/amxmodx/data/gamedata/modules.games',
|
|
'base/addons/amxmodx/data/lang',
|
|
'base/addons/amxmodx/dlls',
|
|
'base/addons/amxmodx/logs',
|
|
'base/addons/amxmodx/modules',
|
|
'base/addons/amxmodx/plugins',
|
|
'base/addons/amxmodx/scripting',
|
|
'base/addons/amxmodx/scripting/include',
|
|
'base/addons/amxmodx/scripting/testsuite',
|
|
'cstrike/addons/amxmodx/configs',
|
|
'cstrike/addons/amxmodx/data',
|
|
'cstrike/addons/amxmodx/plugins',
|
|
'cstrike/addons/amxmodx/modules',
|
|
'cstrike/addons/amxmodx/scripting',
|
|
'dod/addons/amxmodx/configs',
|
|
'dod/addons/amxmodx/data',
|
|
'dod/addons/amxmodx/plugins',
|
|
'dod/addons/amxmodx/modules',
|
|
'dod/addons/amxmodx/scripting',
|
|
'esf/addons/amxmodx/configs',
|
|
'esf/addons/amxmodx/plugins',
|
|
'esf/addons/amxmodx/scripting',
|
|
'ns/addons/amxmodx/configs',
|
|
'ns/addons/amxmodx/plugins',
|
|
'ns/addons/amxmodx/modules',
|
|
'ns/addons/amxmodx/scripting',
|
|
'tfc/addons/amxmodx/configs',
|
|
'tfc/addons/amxmodx/data',
|
|
'tfc/addons/amxmodx/plugins',
|
|
'tfc/addons/amxmodx/modules',
|
|
'tfc/addons/amxmodx/scripting',
|
|
'ts/addons/amxmodx/configs',
|
|
'ts/addons/amxmodx/data',
|
|
'ts/addons/amxmodx/plugins',
|
|
'ts/addons/amxmodx/modules',
|
|
'ts/addons/amxmodx/scripting',
|
|
]
|
|
|
|
def split_all(path):
|
|
parts = []
|
|
while True:
|
|
head, tail = os.path.split(path)
|
|
if head == path or tail == path:
|
|
parts.insert(0, path)
|
|
break
|
|
path = head
|
|
parts.insert(0, tail)
|
|
return parts
|
|
|
|
def copy_binary(source, dest):
|
|
builder.AddCopy(source.binary, dest)
|
|
|
|
# Create the distribution folder hierarchy.
|
|
folder_map = {}
|
|
for folder in folder_list:
|
|
norm_folder = os.path.normpath(folder)
|
|
folder_map[folder] = builder.AddFolder(norm_folder)
|
|
|
|
# Do all straight-up file copies from the source tree.
|
|
def CopyFiles(src, dest, files):
|
|
if not dest:
|
|
dest = src
|
|
dest_entry = folder_map[dest]
|
|
for source_file in files:
|
|
source_path = os.path.join(builder.sourcePath, src, source_file)
|
|
builder.AddCopy(source_path, dest_entry)
|
|
|
|
# Copy core dlls.
|
|
for dll in AMXX.binaries:
|
|
copy_binary(dll, folder_map['base/addons/amxmodx/dlls'])
|
|
|
|
# Copy modules.
|
|
for module in AMXX.modules:
|
|
parts = split_all(module.binary.path)
|
|
if parts[1] in ModPackages:
|
|
package = ModPackages[parts[1]]
|
|
else:
|
|
package = 'base'
|
|
copy_binary(module, folder_map[package + '/addons/amxmodx/modules'])
|
|
|
|
# Copy the compiler.
|
|
builder.AddCopy(AMXX.amxxpc.binary, folder_map['base/addons/amxmodx/scripting'])
|
|
builder.AddCopy(AMXX.libpc300.binary, folder_map['base/addons/amxmodx/scripting'])
|
|
|
|
# Copy plugins.
|
|
StatsPlugins = ['csstats.amxx']
|
|
for amxx_file in AMXX.plugins:
|
|
amxx_entry = AMXX.plugins[amxx_file]
|
|
package = os.path.dirname(amxx_file)
|
|
output_folder = '/addons/amxmodx/plugins'
|
|
if not len(package):
|
|
package = 'base'
|
|
else:
|
|
# Ugh - statsx plugins go into a random folder.
|
|
name = os.path.basename(amxx_file)
|
|
if name == package + 'stats.amxx' or name in StatsPlugins:
|
|
output_folder = '/addons/amxmodx/data'
|
|
|
|
builder.AddCopy(amxx_entry, folder_map[package + output_folder])
|
|
|
|
# If it was in a mod package, we can cheat and copy it to scripting since
|
|
# none of them are multi-file.
|
|
if package != 'base':
|
|
base_file, _ = os.path.splitext(os.path.basename(amxx_file))
|
|
source_file = os.path.join(
|
|
builder.sourcePath,
|
|
'plugins',
|
|
package,
|
|
base_file + '.sma'
|
|
)
|
|
builder.AddCopy(source_file, folder_map[package + '/addons/amxmodx/scripting'])
|
|
|
|
# Copy the generated version .inc.
|
|
for generated_header in AMXX.generated_headers:
|
|
if 'amxmodx_version.inc' in generated_header.path:
|
|
builder.AddCopy(generated_header, folder_map['base/addons/amxmodx/scripting/include'])
|
|
break
|
|
|
|
# Copy WinCSX.
|
|
if builder.target_platform == 'windows':
|
|
builder.AddCopy(AMXX.csx_app.binary, folder_map['cstrike/addons/amxmodx/data'])
|
|
|
|
# Copy configuration files for each mod.
|
|
configs = [
|
|
'amxx.cfg',
|
|
'clcmds.ini',
|
|
'cmds.ini',
|
|
'configs.ini',
|
|
'core.ini',
|
|
'custommenuitems.cfg',
|
|
'cvars.ini',
|
|
'hamdata.ini',
|
|
'maps.ini',
|
|
'miscstats.ini',
|
|
'modules.ini',
|
|
'plugins.ini',
|
|
'speech.ini',
|
|
'sql.cfg',
|
|
'users.ini',
|
|
'cstrike/amxx.cfg',
|
|
'cstrike/cmds.ini',
|
|
'cstrike/core.ini',
|
|
'cstrike/cvars.ini',
|
|
'cstrike/maps.ini',
|
|
'cstrike/modules.ini',
|
|
'cstrike/plugins.ini',
|
|
'cstrike/stats.ini',
|
|
'dod/core.ini',
|
|
'dod/cvars.ini',
|
|
'dod/maps.ini',
|
|
'dod/modules.ini',
|
|
'dod/plugins.ini',
|
|
'esf/modules.ini',
|
|
'esf/plugins.ini',
|
|
'ns/amxx.cfg',
|
|
'ns/clcmds.ini',
|
|
'ns/cmds.ini',
|
|
'ns/cvars.ini',
|
|
'ns/maps.ini',
|
|
'ns/modules.ini',
|
|
'ns/plugins.ini',
|
|
'ns/speech.ini',
|
|
'ns/users.ini',
|
|
'tfc/core.ini',
|
|
'tfc/cvars.ini',
|
|
'tfc/maps.ini',
|
|
'tfc/modules.ini',
|
|
'tfc/plugins.ini',
|
|
'ts/core.ini',
|
|
'ts/maps.ini',
|
|
'ts/modules.ini',
|
|
'ts/plugins.ini',
|
|
]
|
|
for config in configs:
|
|
cfg_folder, cfg_file = os.path.split(config)
|
|
if len(cfg_folder):
|
|
out_folder = cfg_folder + '/addons/amxmodx/configs'
|
|
else:
|
|
out_folder = 'base/addons/amxmodx/configs'
|
|
builder.AddCopy(
|
|
source = os.path.join(builder.sourcePath, 'configs', config),
|
|
output_path = folder_map[out_folder]
|
|
)
|
|
|
|
# Copy core scripting files.
|
|
scripting_files = [
|
|
'admin.sma',
|
|
'adminchat.sma',
|
|
'admincmd.sma',
|
|
'adminhelp.sma',
|
|
'adminslots.sma',
|
|
'adminvote.sma',
|
|
'antiflood.sma',
|
|
'cmdmenu.sma',
|
|
'imessage.sma',
|
|
'mapchooser.sma',
|
|
'mapsmenu.sma',
|
|
'menufront.sma',
|
|
'multilingual.sma',
|
|
'nextmap.sma',
|
|
'pausecfg.sma',
|
|
'plmenu.sma',
|
|
'scrollmsg.sma',
|
|
'statscfg.sma',
|
|
'telemenu.sma',
|
|
'timeleft.sma',
|
|
'pluginmenu.sma',
|
|
'testsuite/admins_test.sma',
|
|
'testsuite/arraytest.sma',
|
|
'testsuite/callfunc_test.sma',
|
|
'testsuite/datapack_test.sma',
|
|
'testsuite/fakemeta_tests.sma',
|
|
'testsuite/fmttest.sma',
|
|
'testsuite/fwdtest1.sma',
|
|
'testsuite/fwdtest2.sma',
|
|
'testsuite/hashing_test.sma',
|
|
'testsuite/logtest.sma',
|
|
'testsuite/menutest.sma',
|
|
'testsuite/native_test.sma',
|
|
'testsuite/nvault_test.sma',
|
|
'testsuite/regex_test.sma',
|
|
'testsuite/sorttest.sma',
|
|
'testsuite/strbreak.sma',
|
|
'testsuite/sqlxtest.sma',
|
|
'testsuite/sqlxtest.sq3',
|
|
'testsuite/sqlxtest.sql',
|
|
'testsuite/trietest.sma',
|
|
'testsuite/utf8test.sma',
|
|
'testsuite/stacktest.sma',
|
|
'testsuite/textparse_test.sma',
|
|
'testsuite/textparse_test.cfg',
|
|
'testsuite/textparse_test.ini',
|
|
'include/amxconst.inc',
|
|
'include/amxmisc.inc',
|
|
'include/amxmodx.inc',
|
|
'include/core.inc',
|
|
'include/csstats.inc',
|
|
'include/cstrike.inc',
|
|
'include/csx.inc',
|
|
'include/cvars.inc',
|
|
'include/datapack.inc',
|
|
'include/dbi.inc',
|
|
'include/dodconst.inc',
|
|
'include/dodfun.inc',
|
|
'include/dodstats.inc',
|
|
'include/dodx.inc',
|
|
'include/engine.inc',
|
|
'include/engine_const.inc',
|
|
'include/engine_stocks.inc',
|
|
'include/esf.inc',
|
|
'include/esf_const.inc',
|
|
'include/fakemeta.inc',
|
|
'include/fakemeta_const.inc',
|
|
'include/fakemeta_stocks.inc',
|
|
'include/file.inc',
|
|
'include/float.inc',
|
|
'include/fun.inc',
|
|
'include/gameconfig.inc',
|
|
'include/geoip.inc',
|
|
'include/lang.inc',
|
|
'include/ns.inc',
|
|
'include/ns_const.inc',
|
|
'include/nvault.inc',
|
|
'include/regex.inc',
|
|
'include/sockets.inc',
|
|
'include/string.inc',
|
|
'include/tfcconst.inc',
|
|
'include/tfcstats.inc',
|
|
'include/tfcx.inc',
|
|
'include/tsconst.inc',
|
|
'include/tsfun.inc',
|
|
'include/tsstats.inc',
|
|
'include/tsx.inc',
|
|
'include/vault.inc',
|
|
'include/xs.inc',
|
|
'include/cellarray.inc',
|
|
'include/cellstack.inc',
|
|
'include/celltrie.inc',
|
|
'include/fakemeta_util.inc',
|
|
'include/ham_const.inc',
|
|
'include/hamsandwich.inc',
|
|
'include/hlsdk_const.inc',
|
|
'include/message_const.inc',
|
|
'include/message_stocks.inc',
|
|
'include/messages.inc',
|
|
'include/newmenus.inc',
|
|
'include/sorting.inc',
|
|
'include/sqlx.inc',
|
|
'include/textparse_ini.inc',
|
|
'include/textparse_smc.inc',
|
|
'include/time.inc',
|
|
'include/vector.inc',
|
|
]
|
|
for filename in scripting_files:
|
|
output_folder = 'base/addons/amxmodx/scripting'
|
|
inner_folder = os.path.dirname(filename)
|
|
if len(inner_folder):
|
|
output_folder += '/' + inner_folder
|
|
builder.AddCopy(
|
|
source = os.path.join(builder.sourcePath, 'plugins', filename),
|
|
output_path = folder_map[output_folder]
|
|
)
|
|
|
|
# Copy weird things.
|
|
weirdfiles = [
|
|
('modules/geoip/GeoLite2-Country.mmdb', 'base/addons/amxmodx/data'),
|
|
('plugins/esf/ESF_mod_tutorial.txt', 'esf/addons/amxmodx/scripting'),
|
|
]
|
|
|
|
if builder.target_platform == 'windows':
|
|
weirdfiles += [
|
|
('plugins/compile.exe', 'base/addons/amxmodx/scripting'),
|
|
]
|
|
else:
|
|
weirdfiles += [
|
|
('plugins/compile.sh', 'base/addons/amxmodx/scripting'),
|
|
]
|
|
|
|
for source, dest in weirdfiles:
|
|
builder.AddCopy(
|
|
source = os.path.join(builder.sourcePath, source),
|
|
output_path = folder_map[dest]
|
|
)
|
|
|
|
# Copy language data.
|
|
datafiles = [
|
|
'admin.txt',
|
|
'adminchat.txt',
|
|
'admincmd.txt',
|
|
'adminhelp.txt',
|
|
'adminslots.txt',
|
|
'adminvote.txt',
|
|
'antiflood.txt',
|
|
'cmdmenu.txt',
|
|
'common.txt',
|
|
'imessage.txt',
|
|
'languages.txt',
|
|
'mapchooser.txt',
|
|
'mapsmenu.txt',
|
|
'menufront.txt',
|
|
'miscstats.txt',
|
|
'multilingual.txt',
|
|
'nextmap.txt',
|
|
'pausecfg.txt',
|
|
'plmenu.txt',
|
|
'restmenu.txt',
|
|
'scrollmsg.txt',
|
|
'stats_dod.txt',
|
|
'statscfg.txt',
|
|
'statsx.txt',
|
|
'telemenu.txt',
|
|
'timeleft.txt',
|
|
'time.txt',
|
|
]
|
|
for datafile in datafiles:
|
|
builder.AddCopy(
|
|
source = os.path.join(builder.sourcePath, 'plugins', 'lang', datafile),
|
|
output_path = folder_map['base/addons/amxmodx/data/lang']
|
|
)
|
|
|
|
|
|
CopyFiles('gamedata/modules.games', 'base/addons/amxmodx/data/gamedata/modules.games',
|
|
[
|
|
'master.games.txt',
|
|
'game.cstrike.txt',
|
|
]
|
|
)
|
|
|
|
CopyFiles('gamedata/common.games', 'base/addons/amxmodx/data/gamedata/common.games',
|
|
[
|
|
'master.games.txt',
|
|
'globalvars.engine.txt',
|
|
]
|
|
)
|
|
|
|
CopyFiles('gamedata/common.games/hostages.games/cstrike', 'base/addons/amxmodx/data/gamedata/common.games/hostages.games/cstrike',
|
|
[
|
|
'offsets-chostageimprov.txt',
|
|
'offsets-chostagemanager.txt',
|
|
'offsets-hostagefollowstate.txt',
|
|
'offsets-simplestatemachine.txt',
|
|
]
|
|
)
|
|
|
|
CopyFiles('gamedata/common.games/others.games/cstrike', 'base/addons/amxmodx/data/gamedata/common.games/others.games/cstrike',
|
|
[
|
|
'offsets-csound.txt',
|
|
'offsets-cunifiedsignals.txt',
|
|
'offsets-cvoicegamemgr.txt',
|
|
]
|
|
)
|
|
|
|
CopyFiles('gamedata/common.games/entities.games/cstrike', 'base/addons/amxmodx/data/gamedata/common.games/entities.games/cstrike',
|
|
[
|
|
'offsets-cairtank.txt',
|
|
'offsets-cak47.txt',
|
|
'offsets-cambientgeneric.txt',
|
|
'offsets-carmoury.txt',
|
|
'offsets-caug.txt',
|
|
'offsets-cautotrigger.txt',
|
|
'offsets-cawp.txt',
|
|
'offsets-cbaseanimating.txt',
|
|
'offsets-cbasebutton.txt',
|
|
'offsets-cbasedelay.txt',
|
|
'offsets-cbasedoor.txt',
|
|
'offsets-cbaseentity.txt',
|
|
'offsets-cbasegrencatch.txt',
|
|
'offsets-cbasemonster.txt',
|
|
'offsets-cbaseplattrain.txt',
|
|
'offsets-cbaseplayer.txt',
|
|
'offsets-cbaseplayeritem.txt',
|
|
'offsets-cbaseplayerweapon.txt',
|
|
'offsets-cbasetoggle.txt',
|
|
'offsets-cbombglow.txt',
|
|
'offsets-cbot.txt',
|
|
'offsets-cbreakable.txt',
|
|
'offsets-cbubbling.txt',
|
|
'offsets-cc4.txt',
|
|
'offsets-cchangelevel.txt',
|
|
'offsets-cclientfog.txt',
|
|
'offsets-ccsbot.txt',
|
|
'offsets-ccycler.txt',
|
|
'offsets-ccyclersprite.txt',
|
|
'offsets-cdeadhev.txt',
|
|
'offsets-cdeagle.txt',
|
|
'offsets-celite.txt',
|
|
'offsets-cenvexplosion.txt',
|
|
'offsets-cenvfunnel.txt',
|
|
'offsets-cenvglobal.txt',
|
|
'offsets-cenvsound.txt',
|
|
'offsets-cenvspark.txt',
|
|
'offsets-cfamas.txt',
|
|
'offsets-cfiveseven.txt',
|
|
'offsets-cfrictionmodifier.txt',
|
|
'offsets-cfuncmortarfield.txt',
|
|
'offsets-cfuncplatrot.txt',
|
|
'offsets-cfuncrotating.txt',
|
|
'offsets-cfunctank.txt',
|
|
'offsets-cfunctankcontrols.txt',
|
|
'offsets-cfunctanklaser.txt',
|
|
'offsets-cfunctrackchange.txt',
|
|
'offsets-cfunctracktrain.txt',
|
|
'offsets-cfunctrain.txt',
|
|
'offsets-cfuncvehicle.txt',
|
|
'offsets-cfuncweaponcheck.txt',
|
|
'offsets-cg3sg1.txt',
|
|
'offsets-cgalil.txt',
|
|
'offsets-cgameplayerequip.txt',
|
|
'offsets-cgameplayerzone.txt',
|
|
'offsets-cgameteammaster.txt',
|
|
'offsets-cgametext.txt',
|
|
'offsets-cgib.txt',
|
|
'offsets-cgibshooter.txt',
|
|
'offsets-cglock18.txt',
|
|
'offsets-cglow.txt',
|
|
'offsets-cgrenade.txt',
|
|
'offsets-cguntarget.txt',
|
|
'offsets-chegrenade.txt',
|
|
'offsets-chostage.txt',
|
|
'offsets-cknife.txt',
|
|
'offsets-claser.txt',
|
|
'offsets-clight.txt',
|
|
'offsets-clightning.txt',
|
|
'offsets-cm249.txt',
|
|
'offsets-cm3.txt',
|
|
'offsets-cm4a1.txt',
|
|
'offsets-cmac10.txt',
|
|
'offsets-cmapinfo.txt',
|
|
'offsets-cmomentarydoor.txt',
|
|
'offsets-cmomentaryrotbutton.txt',
|
|
'offsets-cmortar.txt',
|
|
'offsets-cmp5n.txt',
|
|
'offsets-cmultimanager.txt',
|
|
'offsets-cmultisource.txt',
|
|
'offsets-cp228.txt',
|
|
'offsets-cp90.txt',
|
|
'offsets-cpathcorner.txt',
|
|
'offsets-cpathtrack.txt',
|
|
'offsets-cpendulum.txt',
|
|
'offsets-cplattrigger.txt',
|
|
'offsets-cpushable.txt',
|
|
'offsets-crecharge.txt',
|
|
'offsets-crevertsaved.txt',
|
|
'offsets-cruleentity.txt',
|
|
'offsets-cscout.txt',
|
|
'offsets-csg550.txt',
|
|
'offsets-csg552.txt',
|
|
'offsets-csmokegrenade.txt',
|
|
'offsets-csoundent.txt',
|
|
'offsets-cspeaker.txt',
|
|
'offsets-csprite.txt',
|
|
'offsets-ctesteffect.txt',
|
|
'offsets-ctmp.txt',
|
|
'offsets-ctriggercamera.txt',
|
|
'offsets-ctriggerchangetarget.txt',
|
|
'offsets-ctriggerrelay.txt',
|
|
'offsets-cump45.txt',
|
|
'offsets-cusp.txt',
|
|
'offsets-cwallhealth.txt',
|
|
'offsets-cweaponbox.txt',
|
|
'offsets-cweaponcycler.txt',
|
|
'offsets-cworlditem.txt',
|
|
'offsets-cwreckage.txt',
|
|
'offsets-cwshield.txt',
|
|
'offsets-cxm1014.txt',
|
|
]
|
|
)
|
|
|
|
# Copy license files
|
|
licenses = [
|
|
'ACKNOWLEDGEMENTS.txt',
|
|
'GPLv2.txt',
|
|
'GPLv3.txt',
|
|
'LICENSE.txt',
|
|
]
|
|
|
|
for license in licenses:
|
|
builder.AddCopy(
|
|
source = os.path.join(builder.sourcePath, 'public', 'licenses', license),
|
|
output_path = folder_map['base/addons/amxmodx']
|
|
)
|