diff options
Diffstat (limited to 'modules/mono/config.py')
| -rw-r--r-- | modules/mono/config.py | 34 | 
1 files changed, 30 insertions, 4 deletions
diff --git a/modules/mono/config.py b/modules/mono/config.py index 8b52d77f80..ebf8512fb6 100644 --- a/modules/mono/config.py +++ b/modules/mono/config.py @@ -4,7 +4,7 @@ import os  import sys  import subprocess -from SCons.Script import BoolVariable, Dir, Environment, PathVariable, Variables +from SCons.Script import BoolVariable, Dir, Environment, File, PathVariable, SCons, Variables  monoreg = imp.load_source('mono_reg_utils', 'modules/mono/mono_reg_utils.py') @@ -42,13 +42,24 @@ def copy_file(src_dir, dst_dir, name):      copyfile(src_path, dst_path) +def custom_path_is_dir_create(key, val, env): +    """Validator to check if Path is a directory, creating it if it does not exist. +       Similar to PathIsDirCreate, except it uses SCons.Script.Dir() and +       SCons.Script.File() in order to support the '#' top level directory token. +       """ +    # Dir constructor will throw an error if the path points to a file +    fsDir = Dir(val) +    if not fsDir.exists: +        os.makedirs(fsDir.abspath) + +  def configure(env):      env.use_ptrcall = True      env.add_module_version_string("mono")      envvars = Variables()      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.Add(PathVariable('mono_assemblies_output_dir', 'Path to the assemblies output directory', '#bin', custom_path_is_dir_create))      envvars.Update(env)      bits = env['bits'] @@ -135,6 +146,22 @@ def configure(env):              if os.getenv('MONO64_PREFIX'):                  mono_root = os.getenv('MONO64_PREFIX') +        # We can't use pkg-config to link mono statically, +        # but we can still use it to find the mono root directory +        if not mono_root and mono_static: +            def pkgconfig_try_find_mono_root(): +                tmpenv = Environment() +                tmpenv.AppendENVPath('PKG_CONFIG_PATH', os.getenv('PKG_CONFIG_PATH')) +                tmpenv.ParseConfig('pkg-config monosgen-2 --libs-only-L') +                for hint_dir in tmpenv['LIBPATH']: +                    name_found = find_file_in_dir(hint_dir, mono_lib_names, prefix='lib', extension=sharedlib_ext) +                    if name_found and os.path.isdir(os.path.join(hint_dir, '..', 'include', 'mono-2.0')): +                        return os.path.join(hint_dir, '..') +                return '' +            mono_root = pkgconfig_try_find_mono_root() +            if not mono_root: +                raise RuntimeError('Building with mono_static=yes, but failed to find the mono prefix with pkg-config. Specify one manually') +          if mono_root:              mono_lib_path = os.path.join(mono_root, 'lib') @@ -175,8 +202,7 @@ def configure(env):              copy_file(os.path.join(mono_lib_path, 'mono', '4.5'), assemblies_output_dir, 'mscorlib.dll')          else: -            if mono_static: -                raise RuntimeError('mono-static: Not supported with pkg-config. Specify a mono prefix manually') +            assert not mono_static              env.ParseConfig('pkg-config monosgen-2 --cflags --libs')  |