Salome HOME
spns #42205 [SAT][Windows] support different values for CMAKE_BUILD_TYPE - define...
[tools/sat.git] / src / compilation.py
index 4951c554ac6d9be7dea5b86327eecc05a99fe0d8..6d06b352875d8985f6df5c14f103c8903074406e 100644 (file)
@@ -38,25 +38,57 @@ class Builder:
     def __init__(self,
                  config,
                  logger,
+                 product_name,
                  product_info,
                  options = src.options.OptResult(),
                  check_src=True):
         self.config = config
         self.logger = logger
         self.options = options
+        self.product_name = product_name
         self.product_info = product_info
         self.build_dir = src.Path(self.product_info.build_dir)
         self.source_dir = src.Path(self.product_info.source_dir)
         self.install_dir = src.Path(self.product_info.install_dir)
         self.header = ""
         self.debug_mode = False
+        self.cmake_build_type = 'Release'
+        if "cmake_build_type" in self.config.APPLICATION:
+            self.set_cmake_build_type(self.config.APPLICATION.cmake_build_type)
+        # keep backward compatibility
+        if "debug" in self.config.APPLICATION and self.config.APPLICATION.debug == "yes":
+            self.debug_mode = True
+            self.cmake_build_type = 'Debug'
+
+        # in case a product defines its own configuration, then use it
+        if "cmake_build_type" in self.product_info:
+            self.set_cmake_build_type(self.product_info.cmake_build_type)
+        # keep backward compatibility
         if "debug" in self.product_info and self.product_info.debug == "yes":
             self.debug_mode = True
+            self.cmake_build_type = 'Debug'
+
         self.verbose_mode = False
         if "verbose" in self.product_info and self.product_info.verbose == "yes":
             self.verbose_mode = True
 
-    ##
+
+    # set cmake build type
+    def set_cmake_build_type(self, build_type):
+        if build_type.lower() in ['debug', 'relwithdebinfo', 'release', 'minsizerel']:
+            if build_type.lower() ==  'debug':
+                self.cmake_build_type = 'Debug'
+                self.debug_mode = True
+            elif build_type.lower() ==  'relwithdebinfo':
+                self.cmake_build_type = 'RelWithDebInfo'
+            elif build_type.lower() ==  'release':
+                self.cmake_build_type = 'Release'
+            elif build_type.lower() ==  'minsizerel':
+                self.cmake_build_type = 'MinSizeRel'
+            else:
+                raise src.SatException("Unknown cmake build mode: {}. Supported values are: Debug, RelWithDebInfo, Release or MinSizeRel".format(build_type))
+        return
+
     # Shortcut method to log in log file.
     def log(self, text, level, showInfo=True):
         self.logger.write(text, level, showInfo)
@@ -71,7 +103,7 @@ class Builder:
     ##
     # Prepares the environment.
     # Build two environment: one for building and one for testing (launch).
-    def prepare(self):
+    def prepare(self, add_env_launch=False):
 
         if not self.build_dir.exists():
             # create build dir
@@ -83,6 +115,7 @@ class Builder:
 
         # add products in depend and opt_depend list recursively
         environ_info = src.product.get_product_dependencies(self.config,
+                                                            self.product_name,
                                                             self.product_info)
         #environ_info.append(self.product_info.name)
 
@@ -93,12 +126,13 @@ class Builder:
         self.build_environ.silent = (self.config.USER.output_verbose_level < 5)
         self.build_environ.set_full_environ(self.logger, environ_info)
         
+        if add_env_launch:
         # create runtime environment
-        self.launch_environ = src.environment.SalomeEnviron(self.config,
+            self.launch_environ = src.environment.SalomeEnviron(self.config,
                                       src.environment.Environ(dict(os.environ)),
                                       False)
-        self.launch_environ.silent = True # no need to show here
-        self.launch_environ.set_full_environ(self.logger, environ_info)
+            self.launch_environ.silent = True # no need to show here
+            self.launch_environ.set_full_environ(self.logger, environ_info)
 
         for ee in C_COMPILE_ENV_LIST:
             vv = self.build_environ.get(ee)
@@ -112,16 +146,19 @@ class Builder:
     def cmake(self, options=""):
 
         cmake_option = options
-        # cmake_option +=' -DCMAKE_VERBOSE_MAKEFILE=ON -DSALOME_CMAKE_DEBUG=ON'
+        if "cmake_build_type" in self.config.APPLICATION:
+            self.set_cmake_build_type(self.config.APPLICATION.cmake_build_type)
+        # keep backward compatibility
+        if "debug" in self.config.APPLICATION and self.config.APPLICATION.debug == "yes":
+            self.debug_mode = True
+            self.cmake_build_type = 'Debug'
+
         if 'cmake_options' in self.product_info:
             cmake_option += " %s " % " ".join(
                                         self.product_info.cmake_options.split())
 
-        # add debug option
-        if self.debug_mode:
-            cmake_option += " -DCMAKE_BUILD_TYPE=Debug"
-        else :
-            cmake_option += " -DCMAKE_BUILD_TYPE=Release"
+        # add cmake build_type options
+        cmake_option += " -DCMAKE_BUILD_TYPE=" + self.cmake_build_type
 
         # add verbose option if specified in application for this product.
         if self.verbose_mode:
@@ -130,9 +167,7 @@ class Builder:
         # In case CMAKE_GENERATOR is defined in environment, 
         # use it in spite of automatically detect it
         if 'cmake_generator' in self.config.APPLICATION:
-            cmake_option += " -DCMAKE_GENERATOR=%s" \
-                                       % self.config.APPLICATION.cmake_generator
-        
+            cmake_option += " -G \"%s\" -A x64 " % self.config.APPLICATION.cmake_generator
         command = ("cmake %s -DCMAKE_INSTALL_PREFIX=%s %s" %
                             (cmake_option, self.install_dir, self.source_dir))
 
@@ -261,11 +296,8 @@ CC=\\"hack_libtool\\"%g" libtool'''
             hh += " " + src.printcolors.printcWarning("DEBUG")
         # make
         command = 'msbuild'
-        command = command + " /maxcpucount:" + str(nb_proc)
-        if self.debug_mode:
-            command = command + " /p:Configuration=Debug"
-        else:
-            command = command + " /p:Configuration=Release"
+        command+= " /maxcpucount:" + str(nb_proc)
+        command+= " /p:Configuration={}  /p:Platform=x64 ".format(self.cmake_build_type)
         command = command + " ALL_BUILD.vcxproj"
 
         self.log_command(command)
@@ -285,15 +317,11 @@ CC=\\"hack_libtool\\"%g" libtool'''
     ##
     # Runs 'make install'.
     def install(self):
-        if self.config.VARS.dist_name=="Win":
+        if src.architecture.is_windows():
             command = 'msbuild INSTALL.vcxproj'
-            if self.debug_mode:
-                command = command + " /p:Configuration=Debug"
-            else:
-                command = command + " /p:Configuration=Release"
+            command+= ' /p:Configuration={}  /p:Platform=x64 '.format(self.cmake_build_type)
         else :
             command = 'make install'
-
         self.log_command(command)
 
         res = subprocess.call(command,
@@ -338,7 +366,7 @@ CC=\\"hack_libtool\\"%g" libtool'''
     # Runs 'make_check'.
     def check(self, command=""):
         if src.architecture.is_windows():
-            cmd = 'msbuild RUN_TESTS.vcxproj'
+            cmd = 'msbuild RUN_TESTS.vcxproj /p:Configuration={}  /p:Platform=x64 '.format(self.cmake_build_type)
         else :
             if self.product_info.build_source=="autotools" :
                 cmd = 'make check'
@@ -438,7 +466,7 @@ CC=\\"hack_libtool\\"%g" libtool'''
             pymodule = imp.load_source(product + "_compile_script", script)
             self.nb_proc = nb_proc
             retcode = pymodule.compil(self.config, self, self.logger)
-        except:
+        except Exception:
             __, exceptionValue, exceptionTraceback = sys.exc_info()
             self.logger.write(str(exceptionValue), 1)
             import traceback
@@ -454,6 +482,7 @@ CC=\\"hack_libtool\\"%g" libtool'''
         assert self.build_environ is not None
         # pass additional variables to environment 
         # (may be used by the build script)
+        self.build_environ.set("APPLICATION_NAME", self.config.APPLICATION.name)
         self.build_environ.set("SOURCE_DIR", str(self.source_dir))
         self.build_environ.set("INSTALL_DIR", str(self.install_dir))
         self.build_environ.set("PRODUCT_INSTALL", str(self.install_dir))
@@ -468,6 +497,14 @@ CC=\\"hack_libtool\\"%g" libtool'''
         # in order for the compilation script to take it into account
         if src.product.product_is_hpc(self.product_info):
             self.build_environ.set("SAT_HPC", "1")
+        if self.debug_mode:
+            self.build_environ.set("SAT_DEBUG", "1")
+        if "cmake_build_type" in self.config.APPLICATION:
+            self.set_cmake_build_type(self.config.APPLICATION.cmake_build_type)
+            self.build_environ.set("SAT_CMAKE_BUILD_TYPE", self.cmake_build_type)
+        if self.verbose_mode:
+            self.build_environ.set("SAT_VERBOSE", "1")
+
 
     def do_batch_script_build(self, script, nb_proc):