# 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-cbaseanimating.txt', 'offsets-cpendulum.txt', 'offsets-cfuncrotating.txt', 'offsets-cbasebutton.txt', 'offsets-cenvspark.txt', 'offsets-cmomentaryrotbutton.txt', 'offsets-cmultisource.txt', 'offsets-cenvglobal.txt', 'offsets-cbaseentity.txt', 'offsets-csound.txt', 'offsets-cgib.txt', 'offsets-cmomentarydoor.txt', 'offsets-cbasedoor.txt', 'offsets-cenvfunnel.txt', 'offsets-ctesteffect.txt', 'offsets-cgibshooter.txt', 'offsets-csprite.txt', 'offsets-cbombglow.txt', 'offsets-cglow.txt', 'offsets-claser.txt', 'offsets-clightning.txt', 'offsets-cbubbling.txt', 'offsets-cenvexplosion.txt', 'offsets-cpushable.txt', 'offsets-cbreakable.txt', 'offsets-cfunctankcontrols.txt', 'offsets-cfunctank.txt', 'offsets-cfunctanklaser.txt', 'offsets-cgrenade.txt', 'offsets-crecharge.txt', 'offsets-cwreckage.txt', 'offsets-cweaponcycler.txt', 'offsets-ccyclersprite.txt', 'offsets-ccycler.txt', 'offsets-cwallhealth.txt', 'offsets-cworlditem.txt', 'offsets-clight.txt', 'offsets-cgameplayerequip.txt', 'offsets-cgameplayerzone.txt', 'offsets-cgameteammaster.txt', 'offsets-cgametext.txt', 'offsets-cruleentity.txt', 'offsets-cmortar.txt', 'offsets-cfuncmortarfield.txt', 'offsets-cbasemonster.txt', 'offsets-cmapinfo.txt', 'offsets-cpathtrack.txt', 'offsets-cpathcorner.txt', 'offsets-cguntarget.txt', 'offsets-cfunctrackchange.txt', 'offsets-cfuncplatrot.txt', 'offsets-cfunctracktrain.txt', 'offsets-cfunctrain.txt', 'offsets-cbaseplattrain.txt', 'offsets-cplattrigger.txt', 'offsets-cbaseplayer.txt', 'offsets-crevertsaved.txt', 'offsets-cdeadhev.txt', 'offsets-cwshield.txt', 'offsets-cspeaker.txt', 'offsets-cenvsound.txt', 'offsets-cambientgeneric.txt', 'offsets-csoundent.txt', 'offsets-cbasetoggle.txt', 'offsets-cbasedelay.txt', 'offsets-cpointentity.txt', 'offsets-cfuncweaponcheck.txt', 'offsets-cbasegrencatch.txt', 'offsets-cclientfog.txt', 'offsets-ctriggercamera.txt', 'offsets-ctriggerchangetarget.txt', 'offsets-ctriggerendsection.txt', 'offsets-cchangelevel.txt', 'offsets-cmultimanager.txt', 'offsets-ctriggerrelay.txt', 'offsets-cfrictionmodifier.txt', 'offsets-cfuncvehicle.txt', 'offsets-carmoury.txt', 'offsets-cweaponbox.txt', 'offsets-cbaseplayeritem.txt', 'offsets-cbaseplayerammo.txt', 'offsets-cbaseplayerweapon.txt', 'offsets-caug.txt', 'offsets-cawp.txt', 'offsets-cdeagle.txt', 'offsets-celite.txt', 'offsets-cfiveseven.txt', 'offsets-cflashbang.txt', 'offsets-cg3sg1.txt', 'offsets-cglock18.txt', 'offsets-chegrenade.txt', 'offsets-cknife.txt', 'offsets-cm3.txt', 'offsets-cmac10.txt', 'offsets-cp228.txt', 'offsets-cp90.txt', 'offsets-cscout.txt', 'offsets-csmokegrenade.txt', 'offsets-ctmp.txt', 'offsets-cusp.txt', 'offsets-cfamas.txt', 'offsets-cgalil.txt', 'offsets-cxm1014.txt', 'offsets-chostage.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'] )