Salome HOME
gestion de path multiples dans la configuration projet
[tools/sat.git] / src / fileEnviron.py
index e43e0e5e72da8abdfdd45385d8f45b421b0a2652..3fe41c87945290dc5524abfb57bf98f015cc91e8 100644 (file)
@@ -210,7 +210,10 @@ class FileEnviron(object):
         
         :param key str: the environment variable
         """
-        return '${%s}' % key
+        if src.architecture.is_windows():
+            return '%' + key + '%'
+        else:
+            return '${%s}' % key
 
     def get_value(self, key):
         """Get the real value of the environment variable "key"
@@ -237,9 +240,6 @@ class FileEnviron(object):
 
     def value_filter(self, value):
         res=value
-        # on windows platform, replace / by \
-        if src.architecture.is_windows():
-            res = value.replace("/","\\")
         return res
 
 
@@ -277,7 +277,6 @@ class TclFileEnviron(FileEnviron):
         :param key str: the environment variable to set
         :param value str: the value
         """
-        #print "CNC TclFileEnviron set ", key, " to ", value
         self.output.write('setenv  %s "%s"\n' % (key, value))
         self.environ.set(key, value)
         
@@ -459,7 +458,6 @@ class LauncherFileEnviron(FileEnviron):
         self._do_init(output, environ)
         self.python_version=self.environ.get("sat_python_version")
         self.bin_kernel_root_dir=self.environ.get("sat_bin_kernel_install_dir")
-        self.app_root_dir=self.environ.get("sat_app_root_dir")
 
         # four whitespaces for first indentation in a python script
         self.indent="    "
@@ -474,6 +472,9 @@ class LauncherFileEnviron(FileEnviron):
             launcher_header=launcher_header2
         else:
             launcher_header=launcher_header3
+        # in case of Windows OS, Python scripts are not executable.  PyExe ?
+        if src.architecture.is_windows():
+            launcher_header = launcher_header.replace("#! /usr/bin/env python3",'')
         self.output.write(launcher_header\
                           .replace("BIN_KERNEL_INSTALL_DIR", self.bin_kernel_root_dir))
 
@@ -503,16 +504,45 @@ class LauncherFileEnviron(FileEnviron):
         """
         self.output.write('# "WARNING %s"\n' % warning)
 
-    def append_value(self, key, value, sep=":"):
+    def append_value(self, key, value, sep=os.pathsep):
         """append value to key using sep,
         if value contains ":" or ";" then raise error
         
-        :param key str: the environment variable to append
-        :param value str: the value to append to key
+        :param key str: the environment variable to prepend
+        :param value str: the value to prepend to key
         :param sep str: the separator string
         """
-        # append is not defined in context api
-        self.prepend_value(key, value)
+        # check that value so no contain the system separator
+        separator=os.pathsep
+        msg="LauncherFileEnviron append key '%s' value '%s' contains forbidden character '%s'"
+        if separator in value:
+            raise Exception(msg % (key, value, separator))
+
+        if (self.init_path and (not self.environ.is_defined(key))):
+            # reinitialisation mode set to true (the default)
+            # for the first occurrence of key, we set it.
+            # therefore key will not be inherited from environment
+            self.set(key, value)
+            return
+
+        # in all other cases we use append (except if value is already the key
+        do_append=True
+        if self.environ.is_defined(key):
+            value_list = self.environ.get(key).split(sep)
+            # rem : value cannot be expanded (unlike bash/bat case) - but it doesn't matter.
+            if value in value_list:
+                do_append=False  # value is already in key path : we don't append it again
+            
+        if do_append:
+            self.environ.append_value(key, value,sep) # register value in self.environ
+            if key in self.specialKeys.keys():
+                #for these special keys we use the specific salomeContext function
+                self.output.write(self.begin+'addTo%s(r"%s")\n' % 
+                                  (self.specialKeys[key], self.value_filter(value)))
+            else:
+                # else we use the general salomeContext addToVariable function
+                self.output.write(self.indent+'appendPath(r"%s", r"%s",separator="%s")\n' 
+                                  % (key, self.value_filter(value), sep))
 
     def append(self, key, value, sep=":"):
         """Same as append_value but the value argument can be a list
@@ -594,7 +624,7 @@ class LauncherFileEnviron(FileEnviron):
     
 
     def add_comment(self, comment):
-        # Special comment in case of the distène licence
+        # Special comment in case of the DISTENE licence
         if comment=="DISTENE license":
             self.output.write(self.indent+
                               "#"+
@@ -699,6 +729,15 @@ tcl_header="""\
 
 bash_header="""\
 #!/bin/bash
+if [ "$BASH" = "" ]
+then
+  # check that the user is not using another shell
+  echo
+  echo "Warning! SALOME environment not initialized"
+  echo "You must run this script in a bash shell."
+  echo "As you are using another shell. Please first run: bash"
+  echo
+fi
 ##########################################################################
 #
 # This line is used only in case of a sat package
@@ -731,7 +770,7 @@ out_dir_Path=os.path.dirname(os.path.realpath(__file__))
 # Preliminary work to initialize path to SALOME Python modules
 def __initialize():
 
-  sys.path[:0] = [ 'BIN_KERNEL_INSTALL_DIR' ]  # to get salomeContext
+  sys.path[:0] = [ r'BIN_KERNEL_INSTALL_DIR' ]  # to get salomeContext
   
   # define folder to store omniorb config (initially in virtual application folder)
   try:
@@ -805,7 +844,7 @@ out_dir_Path=os.path.dirname(os.path.realpath(__file__))
 # Preliminary work to initialize path to SALOME Python modules
 def __initialize():
 
-  sys.path[:0] = [ 'BIN_KERNEL_INSTALL_DIR' ]
+  sys.path[:0] = [ r'BIN_KERNEL_INSTALL_DIR' ]
   
   # define folder to store omniorb config (initially in virtual application folder)
   try:
@@ -878,6 +917,18 @@ launcher_tail_py2="""\
     logging.getLogger("salome").error(e)
     sys.exit(1)
 #
+# salomeContext only prepend variables, we use our own appendPath when required
+def appendPath(name, value, separator=os.pathsep):
+    if value == '':
+      return
+
+    value = os.path.expandvars(value) # expand environment variables
+    env = os.getenv(name, None)
+    if env is None:
+      os.environ[name] = value
+    else:
+      os.environ[name] = env + separator + value
+
 
 if __name__ == "__main__":
   args = sys.argv[1:]
@@ -898,7 +949,19 @@ launcher_tail_py3="""\
     import logging
     logging.getLogger("salome").error(e)
     sys.exit(1)
-#
+# salomeContext only prepend variables, we use our own appendPath when required
+def appendPath(name, value, separator=os.pathsep):
+    if value == '':
+      return
+
+    value = os.path.expandvars(value) # expand environment variables
+    env = os.getenv(name, None)
+    if env is None:
+      os.environ[name] = value
+    else:
+      os.environ[name] = env + separator + value
+
 
 if __name__ == "__main__":
   args = sys.argv[1:]