import sys
import os
import shutil
import sysconfig
from warnings import warn
[docs]
def get_top_dir():
"""
Return SfePy installation directory information.
"""
import os.path as op
# If installed, up_dir is '.', otherwise (in (git) source directory) '..'.
for up_dir in ['..', '.']:
top_dir = op.normpath(op.realpath(op.join(op.dirname(__file__),
up_dir)))
aux = op.join(top_dir, 'LICENSE')
if op.isfile(aux):
break
else:
print('Warning: cannot determine SfePy top level directory.')
up_dir = top_dir = ''
in_source_tree = up_dir == '..'
return top_dir, in_source_tree
top_dir, in_source_tree = get_top_dir()
msg_unknown_os = """could not determine operating system!
try setting it in site_cfg.py manually, see site_cfg_template.py"""
msg_numpydoc = """could not find numpydoc!
If it is installed in a non-standard location, try setting it in
site_cfg.py manually."""
has_attr = lambda obj, attr: obj and hasattr(obj, attr)
[docs]
def compose_system_compile_flags(is_posix: bool) -> list:
"""
Provides a list of compile flags that tries to be as similar as possible
to what Python itself was built with. This has been done historically by
numpy.distutils (now deprecated) and a squeezed version of it is brought
over to here.
"""
if not is_posix:
return []
cflags, configure_cppflags, configure_cflags = sysconfig.get_config_vars(
'CFLAGS', 'CONFIGURE_CPPFLAGS', 'CONFIGURE_CFLAGS')
return (cflags + ' ' + configure_cppflags + ' ' + configure_cflags).split()
[docs]
class Config(object):
"""
Read and access the site configuration from the current directory.
"""
def __init__(self):
from importlib.machinery import SourceFileLoader
from sfepy.base.base import sfepy_config_dir
cwd = os.getcwd()
config_filename = os.path.join(cwd, 'site_cfg.py')
if not os.path.exists(config_filename):
config_filename = os.path.join(sfepy_config_dir, 'site_cfg.py')
if not os.path.exists(config_filename):
try:
shutil.copyfile(os.path.join(top_dir,
'site_cfg_template.py'),
config_filename)
except:
pass
try:
self.site_cfg = (SourceFileLoader('site_cfg', config_filename)
.load_module())
except FileNotFoundError:
print(f'Warning: SfePy site configuration file ({config_filename})'
' not found.')
self.site_cfg = None
[docs]
def python_version(self):
if has_attr(self.site_cfg, 'python_version'):
if '*' in self.site_cfg.python_version:
return "%d.%d" % tuple(sys.version_info[:2])
else:
return self.site_cfg.python_version
else:
return "%d.%d" % tuple(sys.version_info[:2])
[docs]
def python_include(self):
if (has_attr(self.site_cfg, 'python_include')
and (self.site_cfg.python_include != 'auto')):
return self.site_cfg.python_include
else:
return sysconfig.get_config_var('INCLUDEPY')
[docs]
def system(self):
if (has_attr(self.site_cfg, 'system')
and self.site_cfg.system is not None):
return self.site_cfg.system
else:
if os.name in ['posix']:
return 'posix'
elif os.name in ['nt']:
return 'windows'
else:
raise ValueError(msg_unknown_os)
[docs]
def compile_flags(self):
if has_attr(self.site_cfg, 'compile_flags'):
flags = self.site_cfg.compile_flags
if isinstance(flags, str):
warn('Compile flags should be given as a list of strings.'
' Space-separated strings may be removed in the'
' near future.',
DeprecationWarning, stacklevel=2)
flags = flags.split()
else:
flags = ['-g', '-O2']
return flags + compose_system_compile_flags(self.system() == 'posix')
[docs]
def debug_flags(self) -> list:
if has_attr(self.site_cfg, 'debug_flags'):
return self.site_cfg.debug_flags
else:
return []
[docs]
def numpydoc_path(self):
if (has_attr(self.site_cfg, 'numpydoc_path') and
(self.site_cfg.numpydoc_path is not None)):
return self.site_cfg.numpydoc_path
else:
try:
import numpydoc; numpydoc
except ImportError:
raise ValueError(msg_numpydoc)
[docs]
def is_release(self):
if has_attr(self.site_cfg, 'is_release'):
return self.site_cfg.is_release
else:
return ''
[docs]
def tetgen_path(self):
if has_attr(self.site_cfg, 'tetgen_path'):
return self.site_cfg.tetgen_path
else:
return '/usr/bin/tetgen'
[docs]
def refmap_memory_factor(self):
if has_attr(self.site_cfg, 'refmap_memory_factor'):
return self.site_cfg.refmap_memory_factor
else:
return None
[docs]
def debug_warped_cells(self):
if has_attr(self.site_cfg, 'debug_warped_cells'):
return self.site_cfg.debug_warped_cells
else:
return False
site_config = Config()