Mono: Buildsystem improvements

- Bundle with mscorlib.dll to avoid compatibilities issues
- Add build option 'mono_assemblies_output_dir' to specify the output directory where the assemblies will be copied to. '#bin' by default.

(cherry picked from commit a45697d8df)
This commit is contained in:
Ignacio Etcheverry 2018-01-12 22:44:22 +01:00 committed by Rémi Verschelde
parent 990bddcf36
commit f6c65d9d15
3 changed files with 24 additions and 12 deletions

View File

@ -209,10 +209,16 @@ def mono_build_solution(source, target, env):
copyfile(os.path.join(src_dir, asm_file), os.path.join(dst_dir, asm_file)) copyfile(os.path.join(src_dir, asm_file), os.path.join(dst_dir, asm_file))
output_dir = Dir('#bin').abspath
assemblies_output_dir = Dir(env['mono_assemblies_output_dir']).abspath
mono_sln_builder = Builder(action = mono_build_solution) mono_sln_builder = Builder(action=mono_build_solution)
env_mono.Append(BUILDERS={'MonoBuildSolution': mono_sln_builder}) env_mono.Append(BUILDERS={'MonoBuildSolution': mono_sln_builder})
env_mono.MonoBuildSolution( env_mono.MonoBuildSolution(
os.path.join(Dir('#bin').abspath, 'GodotSharpTools.dll'), os.path.join(assemblies_output_dir, 'GodotSharpTools.dll'),
'editor/GodotSharpTools/GodotSharpTools.sln' 'editor/GodotSharpTools/GodotSharpTools.sln'
) )
if os.path.normpath(output_dir) != os.path.normpath(assemblies_output_dir):
rel_assemblies_output_dir = os.path.relpath(assemblies_output_dir, output_dir)
env_mono.Append(CPPDEFINES={'GD_MONO_EDITOR_ASSEMBLIES_DIR': rel_assemblies_output_dir})

View File

@ -3,7 +3,7 @@ import imp
import os import os
import sys import sys
from SCons.Script import BoolVariable, Environment, Variables from SCons.Script import BoolVariable, Dir, Environment, PathVariable, Variables
monoreg = imp.load_source('mono_reg_utils', 'modules/mono/mono_reg_utils.py') monoreg = imp.load_source('mono_reg_utils', 'modules/mono/mono_reg_utils.py')
@ -29,20 +29,16 @@ def is_enabled():
return False return False
def copy_file_no_replace(src_dir, dst_dir, name): def copy_file(src_dir, dst_dir, name):
from shutil import copyfile from shutil import copyfile
src_path = os.path.join(src_dir, name) src_path = os.path.join(src_dir, name)
dst_path = os.path.join(dst_dir, name) dst_path = os.path.join(dst_dir, name)
need_copy = True
if not os.path.isdir(dst_dir): if not os.path.isdir(dst_dir):
os.mkdir(dst_dir) os.mkdir(dst_dir)
elif os.path.exists(dst_path):
need_copy = False
if need_copy: copyfile(src_path, dst_path)
copyfile(src_path, dst_path)
def configure(env): def configure(env):
@ -51,11 +47,13 @@ def configure(env):
envvars = Variables() envvars = Variables()
envvars.Add(BoolVariable('mono_static', 'Statically link mono', False)) envvars.Add(BoolVariable('mono_static', 'Statically link mono', False))
envvars.Add(PathVariable('mono_assemblies_output_dir', 'Path to the assemblies output directory', '#bin', PathVariable.PathIsDirCreate))
envvars.Update(env) envvars.Update(env)
bits = env['bits'] bits = env['bits']
mono_static = env['mono_static'] mono_static = env['mono_static']
assemblies_output_dir = Dir(env['mono_assemblies_output_dir']).abspath
mono_lib_names = ['mono-2.0-sgen', 'monosgen-2.0'] mono_lib_names = ['mono-2.0-sgen', 'monosgen-2.0']
@ -99,11 +97,14 @@ def configure(env):
if not mono_dll_name: if not mono_dll_name:
raise RuntimeError('Could not find mono shared library in: ' + mono_bin_path) raise RuntimeError('Could not find mono shared library in: ' + mono_bin_path)
copy_file_no_replace(mono_bin_path, 'bin', mono_dll_name + '.dll') copy_file(mono_bin_path, 'bin', mono_dll_name + '.dll')
copy_file(os.path.join(mono_lib_path, 'mono', '4.5'), assemblies_output_dir, 'mscorlib.dll')
else: else:
sharedlib_ext = '.dylib' if sys.platform == 'darwin' else '.so' sharedlib_ext = '.dylib' if sys.platform == 'darwin' else '.so'
mono_root = '' mono_root = ''
mono_lib_path = ''
if bits == '32': if bits == '32':
if os.getenv('MONO32_PREFIX'): if os.getenv('MONO32_PREFIX'):
@ -148,7 +149,7 @@ def configure(env):
if not mono_so_name: if not mono_so_name:
raise RuntimeError('Could not find mono shared library in: ' + mono_lib_path) raise RuntimeError('Could not find mono shared library in: ' + mono_lib_path)
copy_file_no_replace(mono_lib_path, 'bin', 'lib' + mono_so_name + sharedlib_ext) copy_file(mono_lib_path, 'bin', 'lib' + mono_so_name + sharedlib_ext)
else: else:
if mono_static: if mono_static:
raise RuntimeError('mono-static: Not supported with pkg-config. Specify a mono prefix manually') raise RuntimeError('mono-static: Not supported with pkg-config. Specify a mono prefix manually')
@ -172,7 +173,9 @@ def configure(env):
if not mono_so_name: if not mono_so_name:
raise RuntimeError('Could not find mono shared library in: ' + str(tmpenv['LIBPATH'])) raise RuntimeError('Could not find mono shared library in: ' + str(tmpenv['LIBPATH']))
copy_file_no_replace(mono_lib_path, 'bin', 'lib' + mono_so_name + sharedlib_ext) copy_file(mono_lib_path, 'bin', 'lib' + mono_so_name + sharedlib_ext)
copy_file(os.path.join(mono_lib_path, 'mono', '4.5'), assemblies_output_dir, 'mscorlib.dll')
env.Append(LINKFLAGS='-rdynamic') env.Append(LINKFLAGS='-rdynamic')

View File

@ -102,6 +102,9 @@ MonoAssembly *GDMonoAssembly::_preload_hook(MonoAssemblyName *aname, char **asse
search_dirs.push_back(GodotSharpDirs::get_res_assemblies_dir()); search_dirs.push_back(GodotSharpDirs::get_res_assemblies_dir());
search_dirs.push_back(OS::get_singleton()->get_resource_dir()); search_dirs.push_back(OS::get_singleton()->get_resource_dir());
search_dirs.push_back(OS::get_singleton()->get_executable_path().get_base_dir()); search_dirs.push_back(OS::get_singleton()->get_executable_path().get_base_dir());
#ifdef GD_MONO_EDITOR_ASSEMBLIES_DIR
search_dirs.push_back(OS::get_singleton()->get_executable_path().get_base_dir().plus_file(_MKSTR(GD_MONO_EDITOR_ASSEMBLIES_DIR)).simplify_path());
#endif
const char *rootdir = mono_assembly_getrootdir(); const char *rootdir = mono_assembly_getrootdir();
if (rootdir) { if (rootdir) {