Salome HOME
bos #26523 EDF 24234 - Viscous Layer
[modules/smesh.git] / bin / smesh_setenv.py
1 #!/usr/bin/env python3
2 # Copyright (C) 2007-2021  CEA/DEN, EDF R&D, OPEN CASCADE
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20
21 """
22 Set-up additional environment needed for SMESH module and meshing plugins.
23 """
24
25 import os
26 import os.path as osp
27 import sys
28 from xml.dom.minidom import parse
29 from setenv import add_path, get_lib_dir, salome_subdir
30
31 # -----------------------------------------------------------------------------
32
33 def set_env(args):
34     """Set-up additional environment needed for SMESH module and plugins"""
35     py_version = 'python{}.{}'.format(*sys.version_info[:2])
36
37     # search and set-up meshing plugins
38     plugins = []
39     resource_dirs = []
40     for var in [i for i in os.environ if i.endswith('_ROOT_DIR') and os.environ[i]]:
41         plugin_root = os.environ[var]
42         plugin_name = var[:-9] # plugin name as extracted from environment variable
43         plugin_lname = plugin_name.lower() # plugin name in lowercase
44
45         # look for NAMEOFPlugin.xml file among resource files
46         # resource dir must be <plugin_root>/share/salome/resources/<plugin_name_lowercase>
47         resource_dir = osp.join(plugin_root, 'share', salome_subdir, 'resources', plugin_lname)
48         if not os.access(resource_dir, os.F_OK):
49             continue # directory does not exist or isn't accessible
50
51         for resource_file in [i for i in os.listdir(resource_dir) \
52                                   if osp.isfile(os.path.join(resource_dir, i))]:
53             # look for resource file (XML) to extract valid plugin name
54             if resource_file.lower() == '{plugin_lname}.xml'.format(plugin_lname=plugin_lname):
55                 try:
56                     # get plugin name from 'resources' attribute of 'meshers-group' xml node
57                     # as name extracted from environment variable can be in wrong case
58                     xml_doc = parse(osp.join(resource_dir, resource_file))
59                     plugin_name = xml_doc.getElementsByTagName('meshers-group')[0].getAttribute('resources')
60
61                     # add plugin to the list of available meshing plugins
62                     plugins.append(plugin_name)
63                     resource_dirs.append(resource_dir)
64
65                     # setup environment needed for plugin
66                     add_path(osp.join(plugin_root, 'bin', salome_subdir), 'PATH')
67                     add_path(osp.join(plugin_root, get_lib_dir(), salome_subdir), 'PATH' \
68                                  if sys.platform == 'win32' else 'LD_LIBRARY_PATH')
69                     add_path(osp.join(plugin_root, 'bin', salome_subdir), 'PYTHONPATH')
70                     add_path(osp.join(plugin_root, get_lib_dir(), salome_subdir), 'PYTHONPATH')
71                     add_path(osp.join(plugin_root, get_lib_dir(), py_version, 'site-packages',
72                                       salome_subdir), 'PYTHONPATH')
73
74                     break # one resource file is enough!
75                 except:
76                     continue # invalid resource valid
77
78     # full list of known meshers
79     os.environ['SMESH_MeshersList'] = os.pathsep.join(['StdMeshers'] + plugins)
80     # access to resources
81     os.environ['SalomeAppConfig'] = os.pathsep.join(os.environ['SalomeAppConfig'].split(os.pathsep) + resource_dirs)