Salome HOME
sat #18868 : complément pour pouvoir produite et utiliser des archives produites...
authorcrouzet <nicolas.crouzet@cea.fr>
Thu, 4 Mar 2021 13:50:50 +0000 (14:50 +0100)
committercrouzet <nicolas.crouzet@cea.fr>
Thu, 4 Mar 2021 13:50:50 +0000 (14:50 +0100)
commands/package.py
src/product.py

index 1e275cf99d7bdb38b84b416e91f1eaacacf976b5..5cc26e6933f176bd40c44781e3ec4489b190f713 100644 (file)
@@ -235,8 +235,8 @@ def produce_relative_launcher(config,
     # get KERNEL installation path 
     kernel_info = src.product.get_product_config(config, "KERNEL")
     kernel_base_name=os.path.basename(kernel_info.install_dir)
-    if kernel_base_name.startswith("config"):
-        # case of kernel installed in base. We remove "config-i"
+    if kernel_info.install_mode == "base":
+        # case of kernel installed in base. the kernel install dir name is different in the archive
         kernel_base_name=os.path.basename(os.path.dirname(kernel_info.install_dir))
     
     kernel_root_dir = os.path.join(binaries_dir_name, kernel_base_name)
@@ -383,6 +383,14 @@ def produce_relative_env_files(config,
     :return: the list of path of the produced environment files
     :rtype: List
     '''  
+
+    # set base mode to "no" for the archive - save current mode to restore it at the end
+    if "base" in config.APPLICATION:
+        base_setting=config.APPLICATION.base 
+    else:
+        base_setting="maybe"
+    config.APPLICATION.base="no"
+
     # create an environment file writer
     writer = src.environment.FileEnvWriter(config,
                                            logger,
@@ -432,6 +440,9 @@ def produce_relative_env_files(config,
              stat.S_IXGRP |
              stat.S_IXOTH)
     
+    # restore modified setting by its initial value
+    config.APPLICATION.base=base_setting
+
     return filepath
 
 def produce_install_bin_file(config,
@@ -591,6 +602,8 @@ def binary_package(config, logger, options, tmp_working_dir):
         config.APPLICATION.properties.mesa_launcher_in_package == "yes") :
             generate_mesa_launcher=True
 
+    # first loop on products : filter products, analyse properties,
+    # and store the information that will be used to create the archive in the second loop 
     for prod_name, prod_info in l_product_info:
         # skip product with property not_in_package set to yes
         if src.get_property_in_product_cfg(prod_info, "not_in_package") == "yes":
@@ -611,11 +624,12 @@ def binary_package(config, logger, options, tmp_working_dir):
                 or not src.product.product_compiles(prod_info)):
             continue
         # 
-        # products with single_fir property will be installed in the PRODUCTS directory of the archive
+        # products with single_dir property will be installed in the PRODUCTS directory of the archive
         is_single_dir=(src.appli_test_property(config,"single_install_dir", "yes") and \
                        src.product.product_test_property(prod_info,"single_install_dir", "yes"))
         if src.product.check_installation(config, prod_info):
-            l_install_dir.append((prod_name, prod_info.name, prod_info.install_dir, is_single_dir))
+            l_install_dir.append((prod_name, prod_info.name, prod_info.install_dir,
+                                  is_single_dir, prod_info.install_mode))
         else:
             l_not_installed.append(prod_name)
         
@@ -627,7 +641,7 @@ def binary_package(config, logger, options, tmp_working_dir):
                                            config.INTERNAL.config.install_dir,
                                            name_cpp) 
                 if os.path.exists(install_dir):
-                    l_install_dir.append((name_cpp, name_cpp, install_dir, False))
+                    l_install_dir.append((name_cpp, name_cpp, install_dir, False, "value"))
                 else:
                     l_not_installed.append(name_cpp)
         
@@ -690,11 +704,12 @@ WARNING: existing binaries directory from previous detar installation:
     # construct the correlation table between the product names, there 
     # actual install directories and there install directory in archive
     d_products = {}
-    for prod_name, prod_info_name, install_dir, is_single_dir in l_install_dir:
+    for prod_name, prod_info_name, install_dir, is_single_dir, install_mode in l_install_dir:
         prod_base_name=os.path.basename(install_dir)
-        if prod_base_name.startswith("config"):
-            # case of a products installed in base. Because the archive is in base:no mode, 
-            # we replace "config-i" by the product name or by PRODUCTS if single-dir
+        if install_mode == "base":
+            # case of a products installed in base. 
+            # because the archive is in base:no mode, the name of the install dir is different inside archive
+            # we set it to the product name or by PRODUCTS if single-dir
             if is_single_dir:
                 prod_base_name=config.INTERNAL.config.single_install_dir
             else:
index c5e956bb8c7203658a1238b425be43910b10af1c..5bb0c16153a09b983554f4dc9029d2ae45c0fdc2 100644 (file)
@@ -204,6 +204,7 @@ def get_product_config(config, product_name, with_install_dir=True):
            # message to the user in case of non existing path.)
             prod_info.install_dir = version
             prod_info.get_source = "fixed"
+            prod_info.install_mode = "fixed"
         
         # Check if the product is defined as native in the application
         if prod_info is not None:
@@ -367,7 +368,7 @@ Please provide a 'compil_script' key in its definition.""") % product_name
             prod_info.install_dir = prod_info.install_dir_save
         
         # Set the install_dir key
-        prod_info.install_dir = get_install_dir(config, version, prod_info)
+        prod_info.install_dir,prod_info.install_mode = get_install_dir(config, version, prod_info)
                 
     return prod_info
 
@@ -493,11 +494,12 @@ def get_install_dir(config, version, prod_info):
     :param product_info Config: The configuration specific to 
                                the product
     
-    :return: The path of the product installation
-    :rtype: str
+    :return: The path of the product installation and the mode of the install directory (base/implicit/fixed/value)
+    :rtype: str,str
     """
     install_dir = ""
     in_base = False
+    
     # prod_info.base : corresponds to what is specified in application pyconf (either from the global key base, or from a product dict)
     # prod_info.install_dir : corresponds to what is specified in product pyconf (usually "base" for prerequisites)
     if ( ("install_dir" in prod_info and prod_info.install_dir == "base") # product is declared as base in its own config 
@@ -511,9 +513,15 @@ def get_install_dir(config, version, prod_info):
 
     if in_base:
         install_dir = get_base_install_dir(config, prod_info, version)
+        install_mode = "base"
     else:
-        if "install_dir" not in prod_info or prod_info.install_dir == "base":
+        if ("install_mode" in prod_info and prod_info.install_mode in ["implicit", "base"]) or\
+           ("install_dir" not in prod_info or prod_info.install_dir == "base"):
+            # the check to "base" comes from the package case were base mode is changed dynamically 
+            # to create a package launcher.
+
             # Set it to the default value (in application directory)
+            install_mode = "implicit"
             if ( src.appli_test_property(config,"single_install_dir", "yes") and 
                  src.product.product_test_property(prod_info,"single_install_dir", "yes")):
                 # when single_install_dir mode is activated in tha application
@@ -537,8 +545,9 @@ def get_install_dir(config, version, prod_info):
                                            prod_info.name)
         else:
             install_dir = prod_info.install_dir
+            install_mode = "value"
 
-    return install_dir
+    return install_dir,install_mode
 
 def get_base_install_dir(config, prod_info, version):
     """Compute the installation directory of a product in base