Add parameters to FML install to enable/disable certian aspects. Applying patches, running transformer/merger, and decompiling server.

This commit is contained in:
LexManos 2013-01-24 03:08:19 -08:00
parent 1b332fc1ea
commit d9db242f4c
4 changed files with 107 additions and 78 deletions

View File

@ -18,18 +18,7 @@
if not os.path.exists(os.path.join(binlk[side], os.path.normpath(testlk[side] + '.class'))):
return False
return True
@@ -1029,6 +1033,10 @@
pathsrclk = {CLIENT: self.srcclient, SERVER: self.srcserver}
pathlog = {CLIENT: self.clientrecomplog, SERVER: self.serverrecomplog}
+ if side == SERVER: #Disable server because FML recombines it into client
+ self.logger.info('Server side recompiling skipped, this is normal')
+ return
+
if not os.path.exists(pathbinlk[side]):
os.makedirs(pathbinlk[side])
@@ -1062,7 +1070,7 @@
@@ -1062,7 +1066,7 @@
raise
def startserver(self):
@ -38,7 +27,7 @@
classpath = [os.path.join('..', p) for p in classpath]
classpath = os.pathsep.join(classpath)
os.chdir(self.dirjars)
@@ -1070,7 +1078,7 @@
@@ -1070,7 +1074,7 @@
self.runmc(forkcmd)
def startclient(self):
@ -47,7 +36,7 @@
classpath = [os.path.join('..', p) for p in classpath]
classpath = os.pathsep.join(classpath)
natives = os.path.join('..', self.dirnatives)
@@ -1197,20 +1205,20 @@
@@ -1197,20 +1201,20 @@
with open(self.csvmethods, 'rb') as fh:
methodsreader = csv.DictReader(fh)
for row in methodsreader:
@ -71,7 +60,7 @@
names['params'][row['param']] = row['name']
regexps = {
@@ -1344,13 +1352,13 @@
@@ -1344,13 +1348,13 @@
methods = {}
for row in methodsreader:
#HINT: Only include methods that have a non-empty description
@ -87,7 +76,7 @@
fields[row['searge']] = row['desc'].replace('*/', '* /')
regexps = {
@@ -1427,7 +1435,7 @@
@@ -1427,7 +1431,7 @@
self.runcmd(forkcmd)
return True
@ -96,7 +85,7 @@
if not reobf:
md5lk = {CLIENT: self.md5client, SERVER: self.md5server}
else:
@@ -1442,6 +1450,9 @@
@@ -1442,6 +1446,9 @@
class_path = ''
else:
class_path += '/'
@ -106,7 +95,7 @@
for class_file in fnmatch.filter(filelist, '*.class'):
class_name = class_path + os.path.splitext(class_file)[0]
bin_file = os.path.normpath(os.path.join(path, class_file))
@@ -1535,6 +1546,8 @@
@@ -1535,6 +1542,8 @@
if not os.path.exists(outpathlk[side]):
os.makedirs(outpathlk[side])
@ -115,7 +104,7 @@
# HINT: We extract the modified class files
with closing(zipfile.ZipFile(jarlk[side])) as zipjar:
for in_class in trgclasses:
@@ -1548,6 +1561,23 @@
@@ -1548,6 +1557,23 @@
out_class = out_class.replace(self.nullpkg, '')
if out_class[0] == '/':
out_class = out_class[1:]
@ -139,7 +128,7 @@
try:
zipjar.extract(out_class, outpathlk[side])
self.logger.info('> Outputted %s to %s as %s', in_class.ljust(35), outpathlk[side], out_class)
@@ -1594,6 +1624,9 @@
@@ -1594,6 +1620,9 @@
sys.exit(1)
for entry in newfiles:
@ -149,7 +138,7 @@
if entry[3] == 'U':
self.logger.info('Retrieving file from server : %s', entry[0])
cur_file = os.path.normpath(entry[0])
@@ -1614,6 +1647,9 @@
@@ -1614,6 +1643,9 @@
md5reoblk = {CLIENT: self.md5reobfclient, SERVER: self.md5reobfserver}
outpathlk = {CLIENT: self.srcmodclient, SERVER: self.srcmodserver}
src = {CLIENT: self.srcclient, SERVER: self.srcserver}
@ -159,7 +148,7 @@
# HINT: We need a table for the old md5 and the new ones
md5table = {}
@@ -1656,3 +1692,6 @@
@@ -1656,3 +1688,6 @@
except IOError:
self.logger.error('* File %s copy failed', in_class)

View File

@ -219,7 +219,9 @@ def cleanup_source(path):
src_file = os.path.normpath(os.path.join(path, cur_file))
updatefile(src_file)
def setup_fml(fml_dir, mcp_dir):
compile_tools = True
def setup_fml(fml_dir, mcp_dir, disable_at=False, disable_merge=False, enable_server=False, disable_client=False):
global compile_tools
sys.path.append(mcp_dir)
from runtime.decompile import decompile
from runtime.cleanup import cleanup
@ -241,7 +243,10 @@ def setup_fml(fml_dir, mcp_dir):
if not download_deps(mcp_dir):
sys.exit(1)
compile_tools = True
def applyrg_shunt(self, side, reobf=False, applyrg_real = Commands.applyrg):
global compile_tools
if not self.has_wine and not self.has_astyle:
self.logger.error('!! Please install either wine or astyle for source cleanup !!')
self.logger.error('!! This is REQUIRED by FML/Forge Cannot proceed !!')
@ -258,7 +263,7 @@ def setup_fml(fml_dir, mcp_dir):
cmd_compile = '"%s" -Xlint:-options -deprecation -g -source 1.6 -target 1.6 -classpath "{classpath}" -sourcepath "{sourcepath}" -d "{outpath}" "{target}"' % self.cmdjavac
cmd_compile = cmd_compile.format(classpath=class_path, sourcepath=dir_common, outpath=dir_bin, target="{target}")
if (side == CLIENT):
if compile_tools:
self.logger.info('> Compiling AccessTransformer')
if not runcmd(self, cmd_compile.format(target=os.path.join(dir_trans, 'AccessTransformer.java')), echo=False):
sys.exit(1)
@ -266,32 +271,41 @@ def setup_fml(fml_dir, mcp_dir):
self.logger.info('> Compiling MCPMerger')
if not runcmd(self, cmd_compile.format(target=os.path.join(dir_trans, 'MCPMerger.java')), echo=False):
sys.exit(1)
self.logger.info('> Running MCPMerger')
forkcmd = ('"%s" -classpath "{classpath}" cpw.mods.fml.common.asm.transformers.MCPMerger "{mergecfg}" "{client}" "{server}"' % self.cmdjava).format(
classpath=class_path, mergecfg=os.path.join(fml_dir, 'mcp_merge.cfg'), client=jars[CLIENT], server=jars[SERVER])
compile_tools = False
if side == CLIENT:
if not disable_merge:
self.logger.info('> Running MCPMerger')
forkcmd = ('"%s" -classpath "{classpath}" cpw.mods.fml.common.asm.transformers.MCPMerger "{mergecfg}" "{client}" "{server}"' % self.cmdjava).format(
classpath=class_path, mergecfg=os.path.join(fml_dir, 'mcp_merge.cfg'), client=jars[CLIENT], server=jars[SERVER])
if not runcmd(self, forkcmd):
sys.exit(1)
else:
self.logger.info('> MCPMerge disabled')
if not disable_at:
self.logger.info('> Running AccessTransformer')
forkcmd = ('"%s" -classpath "{classpath}" cpw.mods.fml.common.asm.transformers.AccessTransformer "{jar}" "{fmlconfig}"' % self.cmdjava).format(
classpath=class_path, jar=jars[side], fmlconfig=os.path.join(fml_dir, 'common', 'fml_at.cfg'))
forge_cfg = os.path.join(fml_dir, '..', 'common', 'forge_at.cfg')
if os.path.isfile(forge_cfg):
self.logger.info(' Forge config detected')
forkcmd += ' "%s"' % forge_cfg
for dirname, dirnames, filenames in os.walk(os.path.join(fml_dir, '..', 'accesstransformers')):
for filename in filenames:
accesstransformer = os.path.join(dirname, filename)
if os.path.isfile(accesstransformer):
self.logger.info(' Access Transformer "%s" detected' % filename)
forkcmd += ' "%s"' % accesstransformer
if not runcmd(self, forkcmd):
sys.exit(1)
self.logger.info('> Running AccessTransformer')
forkcmd = ('"%s" -classpath "{classpath}" cpw.mods.fml.common.asm.transformers.AccessTransformer "{jar}" "{fmlconfig}"' % self.cmdjava).format(
classpath=class_path, jar=jars[side], fmlconfig=os.path.join(fml_dir, 'common', 'fml_at.cfg'))
forge_cfg = os.path.join(fml_dir, '..', 'common', 'forge_at.cfg')
if os.path.isfile(forge_cfg):
self.logger.info(' Forge config detected')
forkcmd += ' "%s"' % forge_cfg
for dirname, dirnames, filenames in os.walk(os.path.join(fml_dir, '..', 'accesstransformers')):
for filename in filenames:
accesstransformer = os.path.join(dirname, filename)
if os.path.isfile(accesstransformer):
self.logger.info(' Access Transformer "%s" detected' % filename)
forkcmd += ' "%s"' % accesstransformer
if not runcmd(self, forkcmd):
sys.exit(1)
else:
self.logger.info('> Access Transformer disabled')
self.logger.info('> Really Applying Retroguard')
applyrg_real(self, side, reobf)
@ -314,8 +328,8 @@ def setup_fml(fml_dir, mcp_dir):
Commands.applyrg = applyrg_shunt
Commands.checkjars = checkjars_shunt
#decompile -d -n -r
# Conf JAD CSV -r -d -a -n -p -o -l -g -c -s
decompile(None, False, False, True, True, False, True, False, False, False, False, True, False)
# Conf JAD CSV -r -d -a -n -p -o -l -g -c -s
decompile(None, False, False, True, True, False, True, False, False, False, False, not disable_client, enable_server)
reset_logger()
os.chdir(fml_dir)
@ -334,8 +348,14 @@ def setup_fml(fml_dir, mcp_dir):
os.chdir(mcp_dir)
commands = Commands(verify=True)
updatemd5_side(mcp_dir, commands, CLIENT)
reset_logger()
if not disable_client:
updatemd5_side(mcp_dir, commands, CLIENT)
reset_logger()
if enable_server:
updatemd5_side(mcp_dir, commands, CLIENT)
reset_logger()
os.chdir(fml_dir)
@ -409,16 +429,16 @@ def apply_fml_patches(fml_dir, mcp_dir, src_dir, copy_files=True):
if os.path.isdir(os.path.join(src_dir, 'minecraft', 'argo')):
shutil.rmtree(os.path.join(src_dir, 'minecraft', 'argo'))
def finish_setup_fml(fml_dir, mcp_dir):
def finish_setup_fml(fml_dir, mcp_dir, enable_server=False, disable_client=False):
sys.path.append(mcp_dir)
from runtime.updatenames import updatenames
from runtime.updatemd5 import updatemd5
from runtime.updatemcp import updatemcp
os.chdir(mcp_dir)
updatenames(None, True, True, False)
updatenames(None, True, not disable_client, enable_server)
reset_logger()
updatemd5(None, True, True, False)
updatemd5(None, True, not disable_client, enable_server)
reset_logger()
os.chdir(fml_dir)
@ -940,18 +960,21 @@ def gen_renamed_conf(mcp_dir, fml_dir):
cls = repackage_class(pkgs, cls)
outf.write('%s.%s%s=%s\n' % (cls, func, sig, named))
print 'Creating re-packaged MCP patch'
patch_in = os.path.join(mcp_dir, 'conf', 'patches', 'minecraft_ff.patch')
patch_tmp = os.path.join(mcp_dir, 'conf', 'patches', 'minecraft_ff.patch.tmp')
print 'Creating re-packaged MCP patches'
regnms = re.compile(r'net\\minecraft\\src\\(\w+)')
with open(patch_in, 'r') as fh:
buf = fh.read()
def mapname(match):
return repackage_class(pkgs, match.group(0).replace('\\', '/')).replace('/', '\\')
buf = regnms.sub(mapname, buf)
with open(patch_tmp, 'w') as fh:
fh.write(buf)
shutil.move(patch_tmp, patch_in)
def fix_patches(patch_in, patch_tmp):
regnms = re.compile(r'net\\minecraft\\src\\(\w+)')
with open(patch_in, 'r') as fh:
buf = fh.read()
def mapname(match):
return repackage_class(pkgs, match.group(0).replace('\\', '/')).replace('/', '\\')
buf = regnms.sub(mapname, buf)
with open(patch_tmp, 'w') as fh:
fh.write(buf)
shutil.move(patch_tmp, patch_in)
patch_dir = os.path.join(mcp_dir, 'conf', 'patches')
fix_patches(os.path.join(patch_dir, 'minecraft_ff.patch' ), os.path.join(patch_dir, 'tmp.patch'))
fix_patches(os.path.join(patch_dir, 'minecraft_server_ff.patch'), os.path.join(patch_dir, 'tmp.patch'))

View File

@ -1,4 +1,4 @@
echo off
@set PATH=%PATH%;%SystemDir%\system32;%SystemRoot%\System32;.\python\
python_fml install.py
python_fml install.py %*
pause

View File

@ -3,24 +3,41 @@ from optparse import OptionParser
from fml import setup_fml, finish_setup_fml, apply_fml_patches, setup_mcp
def fml_main(fml_dir, mcp_dir, dont_gen_conf=True):
def fml_main(fml_dir, mcp_dir, dont_gen_conf=True, disable_patches=False, disable_at=False, disable_merge=False, enable_server=False, disable_client=False):
print '================ Forge ModLoader Setup Start ==================='
setup_mcp(fml_dir, mcp_dir, dont_gen_conf)
setup_fml(fml_dir, mcp_dir)
apply_fml_patches(fml_dir, mcp_dir, os.path.join(mcp_dir, 'src'))
finish_setup_fml(fml_dir, mcp_dir)
setup_fml(fml_dir, mcp_dir, disable_at=disable_at, disable_merge=disable_merge, enable_server=enable_server, disable_client=disable_client)
if disable_patches:
print 'Patching disabled'
else:
apply_fml_patches(fml_dir, mcp_dir, os.path.join(mcp_dir, 'src'))
finish_setup_fml(fml_dir, mcp_dir, enable_server=enable_server, disable_client=disable_client)
print '================ Forge ModLoader Setup End ==================='
if __name__ == '__main__':
parser = OptionParser()
parser.add_option('-m', '--mcp-dir', action='store_true', dest='mcp_dir', help='Path to download/extract MCP to', default=None)
parser.add_option('-m', '--mcp-dir', action='store_true', dest='mcp_dir', help='Path to download/extract MCP to', default=None )
parser.add_option('-p', '--no-patch', action="store_true", dest='no_patch', help='Disable application of FML patches', default=False)
parser.add_option('-a', '--no-access', action="store_true", dest='no_access', help='Disable access transformers', default=False)
parser.add_option('-s', '--server', action="store_true", dest='enable_server', help='Enable decompilation of server', default=False)
parser.add_option('-c', '--no-client', action="store_true", dest='no_client', help='Disable decompilation of server', default=False)
parser.add_option('-e', '--no-merge', action="store_true", dest='no_merge', help='Disable merging server code into client', default=False)
options, _ = parser.parse_args()
fml_dir = os.path.dirname(os.path.abspath(__file__))
mcp_dir = os.path.abspath('mcp')
if not options.mcp_dir is None:
fml_main(fml_dir, os.path.abspath(options.mcp_dir))
mcp_dir = os.path.abspath(options.mcp_dir)
elif os.path.isfile(os.path.join('..', 'runtime', 'commands.py')):
fml_main(fml_dir, os.path.abspath('..'))
else:
fml_main(fml_dir, os.path.abspath('mcp'))
mcp_dir = os.path.abspath('..')
if options.no_client:
options.no_patch = True
if options.no_merge:
options.no_patch = True
fml_main(fml_dir, mcp_dir, disable_patches=options.no_patch,
disable_at=options.no_access, disable_merge=options.no_merge,
enable_server=options.enable_server, disable_client=options.no_client)