Salome HOME
Copyright update 2021
[tools/configuration.git] / cmake / SalomeMacros.cmake
index d1cefe1c4ca6655a6740cec51cfb2ec8d1e68e6d..e67a6d9122105a62b25968984d980f06d503af9e 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+# Copyright (C) 2012-2021  CEA/DEN, EDF R&D, OPEN CASCADE
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
 # Author: A.Geay, V. Sandler, A. Bruneton
 #
 
+#----------------------------------------------------------------------------
+# Set-up global policies
+#----------------------------------------------------------------------------
+CMAKE_POLICY(SET CMP0003 NEW)   # Ensure proper linker behavior
+IF(WIN32)
+  CMAKE_POLICY(SET CMP0020 OLD) # Disable automatic linking to qtmain.lib
+ENDIF(WIN32)
+CMAKE_POLICY(SET CMP0053 NEW)   # For correct Qt 5 detection procedure
+IF(CMAKE_VERSION VERSION_GREATER_EQUAL 3.12)
+  CMAKE_POLICY(SET CMP0074 NEW) # Use ROOT variables when detecting packages
+ENDIF()
+
 #----------------------------------------------------------------------------
 # LIST_CONTAINS is a macro useful for determining whether a list has a 
 # particular entry
@@ -93,7 +105,7 @@ ENDMACRO(PARSE_ARGUMENTS)
 #----------------------------------------------------------------------------
 # SALOME_INSTALL_SCRIPTS is a macro useful for installing scripts.
 #
-# USAGE: SALOME_INSTALL_SCRIPTS(file_list path [WORKING_DIRECTORY dir] [DEF_PERMS])
+# USAGE: SALOME_INSTALL_SCRIPTS(file_list path [WORKING_DIRECTORY dir] [DEF_PERMS] [TARGET_NAME name])
 #
 # ARGUMENTS:
 # file_list: IN : list of files to be installed. This list should be quoted.
@@ -101,26 +113,30 @@ ENDMACRO(PARSE_ARGUMENTS)
 # 
 # By default files to be installed as executable scripts.
 # If DEF_PERMS option is provided, than permissions for installed files are
-# only OWNER_WRITE, OWNER_READ, GROUP_READ, and WORLD_READ. 
+# only OWNER_WRITE, OWNER_READ, GROUP_READ, and WORLD_READ.
+# WORKING_DIRECTORY option may be used to specify the relative or absolute
+# path to the directory containing source files listed in file_list argument.
+# If TARGET_NAME option is specified, the name of the target being created
+# with this macro is returned via the given variable.
 #----------------------------------------------------------------------------
 MACRO(SALOME_INSTALL_SCRIPTS file_list path)
-  PARSE_ARGUMENTS(SALOME_INSTALL_SCRIPTS "WORKING_DIRECTORY" "DEF_PERMS" ${ARGN})
+  PARSE_ARGUMENTS(SALOME_INSTALL_SCRIPTS "WORKING_DIRECTORY;TARGET_NAME;EXTRA_DPYS" "DEF_PERMS" ${ARGN})
   SET(PERMS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
   IF(NOT SALOME_INSTALL_SCRIPTS_DEF_PERMS)
     SET(PERMS ${PERMS} OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE)
   ENDIF(NOT SALOME_INSTALL_SCRIPTS_DEF_PERMS)
   SET(_all_pyc)
   SET(_all_pyo)
-  SET(_all_subdirs)
   FOREACH(file ${file_list})
     SET(PREFIX "")
     SET(_source_prefix "")
     GET_FILENAME_COMPONENT(file_name ${file} NAME)
     IF(NOT IS_ABSOLUTE ${file})
+      SET(_source_prefix "${CMAKE_CURRENT_SOURCE_DIR}/")
       IF(SALOME_INSTALL_SCRIPTS_WORKING_DIRECTORY)
-           SET(PREFIX "${SALOME_INSTALL_SCRIPTS_WORKING_DIRECTORY}/")
+        SET(PREFIX "${SALOME_INSTALL_SCRIPTS_WORKING_DIRECTORY}/")
+        SET(_source_prefix "${SALOME_INSTALL_SCRIPTS_WORKING_DIRECTORY}/")
       ENDIF(SALOME_INSTALL_SCRIPTS_WORKING_DIRECTORY)
-      SET(_source_prefix "${CMAKE_CURRENT_SOURCE_DIR}/")
     ENDIF(NOT IS_ABSOLUTE ${file})
     INSTALL(FILES ${PREFIX}${file} DESTINATION ${path} PERMISSIONS ${PERMS})
     GET_FILENAME_COMPONENT(ext ${file} EXT)
@@ -130,28 +146,22 @@ MACRO(SALOME_INSTALL_SCRIPTS file_list path)
       # Generate and install the pyc and pyo
       # [ABN] Important: we avoid references or usage of CMAKE_INSTALL_PREFIX which is not correctly set 
       # when using CPack.       
-      SET(_pyc_file "${CMAKE_CURRENT_BINARY_DIR}/${we_ext}.pyc")
-      SET(_pyo_file "${CMAKE_CURRENT_BINARY_DIR}/${we_ext}.pyo")
+      SET(_pyc_file "${CMAKE_CURRENT_BINARY_DIR}/${we_ext}.cpython-${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}.pyc")
+      SET(_pyo_file "${CMAKE_CURRENT_BINARY_DIR}/${we_ext}.cpython-${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}.opt-1.pyc")
       LIST(APPEND _all_pyc ${_pyc_file})
       LIST(APPEND _all_pyo ${_pyo_file})
       ADD_CUSTOM_COMMAND(
-           OUTPUT ${_pyc_file}
-           COMMAND ${PYTHON_EXECUTABLE} -c "import py_compile ; py_compile.compile('${_source_prefix}${file}', '${_pyc_file}', doraise=True )"
-           DEPENDS ${PREFIX}${file}
-           VERBATIM
-       )
-      ADD_CUSTOM_COMMAND(
-           OUTPUT ${_pyo_file}
-           COMMAND ${PYTHON_EXECUTABLE} -O -c "import py_compile ; py_compile.compile('${_source_prefix}${file}', '${_pyo_file}', doraise=True )"
-           DEPENDS ${PREFIX}${file}
-           VERBATIM
-       )
+        OUTPUT ${_pyc_file} ${_pyo_file}
+        COMMAND ${PYTHON_EXECUTABLE} -c "from py_compile import compile; compile('${_source_prefix}${file}', '${_pyc_file}', doraise=True, optimize=0); compile('${_source_prefix}${file}', '${_pyo_file}', doraise=True, optimize=1)"
+        DEPENDS ${PREFIX}${file}
+        VERBATIM
+      )
       # Install the .pyo and the .pyc
-      INSTALL(FILES ${_pyc_file} DESTINATION ${path} PERMISSIONS ${PERMS})
-      INSTALL(FILES ${_pyo_file} DESTINATION ${path} PERMISSIONS ${PERMS})
+      INSTALL(FILES ${_pyc_file} DESTINATION ${path}/__pycache__ PERMISSIONS ${PERMS})
+      INSTALL(FILES ${_pyo_file} DESTINATION ${path}/__pycache__ PERMISSIONS ${PERMS})
     ENDIF(ext STREQUAL .py)
 
-  # get relativa path (from CMAKE_SOURCE_DIR to CMAKE_CURRENT_SOURCE_DIR)
+  # get relative path (from CMAKE_SOURCE_DIR to CMAKE_CURRENT_SOURCE_DIR)
   STRING(REGEX REPLACE ${CMAKE_SOURCE_DIR} "" rel_dir ${CMAKE_CURRENT_SOURCE_DIR})
   # convert "/" to "_"
   IF(rel_dir)
@@ -168,7 +178,14 @@ MACRO(SALOME_INSTALL_SCRIPTS file_list path)
      WHILE(TARGET "PYCOMPILE${unique_name}_${_cnt}")
        MATH(EXPR _cnt ${_cnt}+1)
      ENDWHILE()
-     ADD_CUSTOM_TARGET("PYCOMPILE${unique_name}_${_cnt}" ALL DEPENDS ${_all_pyc} ${_all_pyo})
+     SET(_target_name "PYCOMPILE${unique_name}_${_cnt}")
+     ADD_CUSTOM_TARGET(${_target_name} ALL DEPENDS ${_all_pyc} ${_all_pyo})
+     IF(SALOME_INSTALL_SCRIPTS_TARGET_NAME)
+       SET(${SALOME_INSTALL_SCRIPTS_TARGET_NAME} ${_target_name})
+     ENDIF(SALOME_INSTALL_SCRIPTS_TARGET_NAME)
+     IF(SALOME_INSTALL_SCRIPTS_EXTRA_DPYS)
+       ADD_DEPENDENCIES(${_target_name} ${SALOME_INSTALL_SCRIPTS_EXTRA_DPYS})
+     ENDIF(SALOME_INSTALL_SCRIPTS_EXTRA_DPYS)
   ENDIF()
 ENDMACRO(SALOME_INSTALL_SCRIPTS)
 
@@ -176,12 +193,13 @@ ENDMACRO(SALOME_INSTALL_SCRIPTS)
 # SALOME_CONFIGURE_FILE is a macro useful for copying a file to another location 
 # and modify its contents.
 #
-# USAGE: SALOME_CONFIGURE_FILE(in_file out_file [INSTALL dir])
+# USAGE: SALOME_CONFIGURE_FILE(in_file out_file [INSTALL dir [EXEC_PERMS]])
 #
 # ARGUMENTS:
 # in_file: IN : input file (if relative path is given, full file path is computed from current source dir).
 # out_file: IN : output file (if relative path is given, full file path is computed from current build dir).
 # If INSTALL is specified, then 'out_file' will be installed to the 'dir' directory.
+# In this case, EXEC_PERMS can be used to set execution permission for installed file.
 #----------------------------------------------------------------------------
 MACRO(SALOME_CONFIGURE_FILE IN_FILE OUT_FILE)
   IF(IS_ABSOLUTE ${IN_FILE})
@@ -196,9 +214,13 @@ MACRO(SALOME_CONFIGURE_FILE IN_FILE OUT_FILE)
   ENDIF()
   MESSAGE(STATUS "Creation of ${_out_file}")
   CONFIGURE_FILE(${_in_file} ${_out_file} @ONLY)
-  PARSE_ARGUMENTS(SALOME_CONFIGURE_FILE "INSTALL" "" ${ARGN})
+  PARSE_ARGUMENTS(SALOME_CONFIGURE_FILE "INSTALL" "EXEC_PERMS" ${ARGN})
   IF(SALOME_CONFIGURE_FILE_INSTALL)
-    INSTALL(FILES ${_out_file} DESTINATION ${SALOME_CONFIGURE_FILE_INSTALL})
+    SET(PERMS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
+    IF(SALOME_CONFIGURE_FILE_EXEC_PERMS)
+      SET(PERMS ${PERMS} OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE)
+    ENDIF(SALOME_CONFIGURE_FILE_EXEC_PERMS)
+    INSTALL(FILES ${_out_file} DESTINATION ${SALOME_CONFIGURE_FILE_INSTALL} PERMISSIONS ${PERMS})
   ENDIF(SALOME_CONFIGURE_FILE_INSTALL)
 ENDMACRO(SALOME_CONFIGURE_FILE)
 
@@ -311,11 +333,11 @@ MACRO(SALOME_PACKAGE_REPORT_AND_CHECK)
   ELSE()
     SET(_length 23)
   ENDIF()
-  MESSAGE(STATUS "") 
-  MESSAGE(STATUS "  Optional packages - Detection report ")
-  MESSAGE(STATUS "  ==================================== ")
-  MESSAGE(STATUS "")
   IF(DEFINED _SALOME_OPTIONAL_PACKAGES_names)
+    MESSAGE(STATUS "") 
+    MESSAGE(STATUS "  Optional packages - Detection report ")
+    MESSAGE(STATUS "  ==================================== ")
+    MESSAGE(STATUS "")
     LIST(LENGTH _SALOME_OPTIONAL_PACKAGES_names _list_len)
     # Another CMake stupidity - FOREACH(... RANGE r) generates r+1 numbers ...
     MATH(EXPR _range "${_list_len}-1")
@@ -335,9 +357,9 @@ MACRO(SALOME_PACKAGE_REPORT_AND_CHECK)
     
       MESSAGE(STATUS "  * ${_pkg_name}  ->  ${_found_msg}${_flag_msg}")
     ENDFOREACH()
+    MESSAGE(STATUS "")
+    MESSAGE(STATUS "")
   ENDIF(DEFINED _SALOME_OPTIONAL_PACKAGES_names)
-  MESSAGE(STATUS "")
-  MESSAGE(STATUS "")
   
   # Failure if some packages were missing:
   IF(_will_fail)
@@ -563,12 +585,12 @@ MACRO(SALOME_FIND_PACKAGE_AND_DETECT_CONFLICTS pkg referenceVariable upCount)
        #  Note the double de-reference of "referenceVariable":
        SET(_tmp_ROOT_DIR "${${referenceVariable}}")
     ENDIF()
-    # Up cound can be reset by detection procedure
+    # Up count can be reset by detection procedure
     SET(_upCount ${upCount})
     IF(DEFINED ${pkg_UC}_UPCOUNT)
       SET(_upCount ${${pkg_UC}_UPCOUNT})
     ENDIF()
-    IF(${_upCount}) 
+    IF(${_upCount} GREATER 0
       FOREACH(_unused RANGE 1 ${_upCount})        
         GET_FILENAME_COMPONENT(_tmp_ROOT_DIR "${_tmp_ROOT_DIR}" PATH)
       ENDFOREACH()
@@ -737,8 +759,11 @@ MACRO(SALOME_ACCUMULATE_ENVIRONMENT envvar)
       IF(_is_check)
         IF(NOT IS_DIRECTORY ${_item})
           IF(TARGET ${_item})
-            GET_TARGET_PROPERTY(_item ${_item} LOCATION)
-          ENDIF()        
+            GET_TARGET_PROPERTY(_target_type ${_item} TYPE)
+            IF(NOT ${_target_type} STREQUAL "INTERFACE_LIBRARY")
+              GET_TARGET_PROPERTY(_item ${_item} LOCATION)
+            ENDIF()
+          ENDIF()
           GET_FILENAME_COMPONENT(_item ${_item} PATH)
         ENDIF()    
         IF(EXISTS ${_item})
@@ -783,13 +808,39 @@ ENDMACRO(SALOME_ACCUMULATE_ENVIRONMENT)
 # Macro generates environement script using previously created variables
 # _${PROJECT_NAME}_EXTRA_ENV_<var>, where <var> is name of variable and
 # _${PROJECT_NAME}_EXTRA_ENV (see marco SALOME_ACCUMULATE_ENVIRONMENT);
-# and puts generated command in proper environment into <output> argument.
-# 
+# and puts generated command in proper environment into <output> argument. To ignore
+# _${PROJECT_NAME}_EXTRA_ENV_<var> and _${PROJECT_NAME}_EXTRA_ENV variables set 
+# environment variable 'SALOME_HAS_GLOBAL_ENV=1'
+#
+# NAMED ARGUMENTS:
+#  CONTEXT: is used under Windows platform only to generate command file. See explanations 
+#           below.
+#  CONTEXT_NAME: is used under Windows platform only to generate command file. See 
+#                explanations below. 
+#  ADDITIONAL_VARIABLES: list of the additional variables to write into environment script.
+#                        Each item of this list should be in the 'Variable=Value' format.
+#
+#
 # Notes:
 # - If <script> is specified as relative path, it is computed from the current build
 #   directory.
+# - If CONTEXT variables is passed into this macro, then on 
+#   Windows platform command file looks like:
+#   =================================================
+#   IF SET_${CONTEXT}_VARS == 1 GOTO ${CONTEXT_NAME}
+#    @SET VAR1=VAR1_VALUE;%VAR1%
+#    .........
+#    .........
+#    .........
+#    @SET VARN=VARN_VALUE;%VARN%
+#    @SET SET_${CONTEXT}_VARS = 1
+#   :${CONTEXT_NAME}
+#   ================================================= 
+#   By default CONTEXT_NAME is equal to 'END'
 #
 MACRO(SALOME_GENERATE_ENVIRONMENT_SCRIPT output script cmd opts)
+  PARSE_ARGUMENTS(SALOME_GENERATE_ENVIRONMENT_SCRIPT "CONTEXT;CONTEXT_NAME;ADDITIONAL_VARIABLES" "" ${ARGN})
+  
   IF(IS_ABSOLUTE ${script})
     SET(_script ${script})
   ELSE()
@@ -803,32 +854,51 @@ MACRO(SALOME_GENERATE_ENVIRONMENT_SCRIPT output script cmd opts)
     SET(_ext "sh")
     SET(_call_cmd ".")
   ENDIF()
+
+  SET(_ctx "END")
+  IF(SALOME_GENERATE_ENVIRONMENT_SCRIPT_CONTEXT_NAME)
+    SET(_ctx "${SALOME_GENERATE_ENVIRONMENT_SCRIPT_CONTEXT_NAME}")
+  ENDIF()
   
-  SET(_env)
-  FOREACH(_item ${_${PROJECT_NAME}_EXTRA_ENV})
-    FOREACH(_val ${_${PROJECT_NAME}_EXTRA_ENV_${_item}})
-      IF(WIN32)
-        IF(${_item} STREQUAL "LD_LIBRARY_PATH")
-          SET(_item PATH)
-        ENDIF()
-        STRING(REPLACE "/" "\\" _env "${_env} @SET ${_item}=${_val};%${_item}%\n")        
-      ELSEIF(APPLE)
-        IF(${_item} STREQUAL "LD_LIBRARY_PATH")
-          SET(_env "${_env} export DYLD_LIBRARY_PATH=${_val}:\${DYLD_LIBRARY_PATH}\n")
-        ELSE()
-          SET(_env "${_env} export ${_item}=${_val}:\${${_item}}\n")
-        ENDIF()
-      ELSE()
-        SET(_env "${_env} export ${_item}=${_val}:\${${_item}}\n")
+  SET(_env "")
+  IF(WIN32 AND SALOME_GENERATE_ENVIRONMENT_SCRIPT_CONTEXT)
+    SET(_env "IF ${_env}\"%SET_${SALOME_GENERATE_ENVIRONMENT_SCRIPT_CONTEXT}_VARS%\"==\"1\" GOTO ${_ctx}\n")
+  ENDIF()
+  IF (NOT "$ENV{SALOME_HAS_GLOBAL_ENV}" STREQUAL "1")
+    FOREACH(_item ${_${PROJECT_NAME}_EXTRA_ENV})
+      FOREACH(_val ${_${PROJECT_NAME}_EXTRA_ENV_${_item}})
+        SALOME_DO_VAR_SUBSTITUTION(_env ${_item} ${_val})
+      ENDFOREACH()
+    ENDFOREACH()
+  ENDIF()
+
+  # Additional variables
+  IF(SALOME_GENERATE_ENVIRONMENT_SCRIPT_ADDITIONAL_VARIABLES)
+    FOREACH(_item ${SALOME_GENERATE_ENVIRONMENT_SCRIPT_ADDITIONAL_VARIABLES})
+      STRING(REGEX MATCHALL "([^=]+|[^=]+$)" a_list "${_item}")
+      LIST(LENGTH a_list a_list_len)
+      IF(NOT ${a_list_len} EQUAL 2) 
+        MESSAGE(FATAL_ERROR  "Each item of ${ADDITIONAL_VARIABLES} list should be in 'Variable=Value' format")
       ENDIF()
+      LIST(GET a_list 0 _item)
+      LIST(GET a_list 1 _val)
+      SALOME_DO_VAR_SUBSTITUTION(_env ${_item} ${_val})
     ENDFOREACH()
-  ENDFOREACH()
-  
-  SET(_script ${_script}.${_ext})
-  FILE(WRITE ${_script} "${_env}")
-  
-  SET(${output} ${_call_cmd} ${_script} && ${cmd} ${opts})
-  
+  ENDIF()
+
+  IF(WIN32 AND SALOME_GENERATE_ENVIRONMENT_SCRIPT_CONTEXT)
+     SET(_env "${_env}@SET SET_${SALOME_GENERATE_ENVIRONMENT_SCRIPT_CONTEXT}_VARS=1\n")
+     SET(_env "${_env}:${_ctx}\n" )
+  ENDIF()
+
+  IF(NOT "${_env}" STREQUAL "")
+    SET(_script ${_script}.${_ext})
+    FILE(WRITE ${_script} "${_env}")
+    SET(${output} ${_call_cmd} ${_script} && ${cmd} ${opts})
+  ELSE()
+    SET(${output} ${cmd} ${opts})
+  ENDIF()
+    
 ENDMACRO(SALOME_GENERATE_ENVIRONMENT_SCRIPT)
 
 #########################################################################
@@ -970,13 +1040,13 @@ ENDMACRO(SALOME_CONFIGURE_PREPARE)
 # version 2.7.12+ and the interp is 2.7.12 ...
 #
 MACRO(SALOME_EXTRACT_VERSION version_string major minor patch)
-  IF(${version_string} MATCHES "[0-9]+[^0-9]*\\.[0-9]+[^0-9]*\\.*[0-9]*[^0-9]*")
-    STRING(REGEX REPLACE "^([0-9]+)[^0-9]*\\.[0-9]+[^0-9]*\\.*[0-9]*[^0-9]*" "\\1" ${major} "${version_string}")
-    STRING(REGEX REPLACE "^[0-9]+[^0-9]*\\.([0-9]+)[^0-9]*\\.*[0-9]*[^0-9]*" "\\1" ${minor} "${version_string}")
+  IF(${version_string} MATCHES "[0-9]+[^0-9.]*\\.[0-9]+[^0-9.]*\\.*[0-9]*[^0-9]*[0-9]*")
+    STRING(REGEX REPLACE "^([0-9]+)[^0-9.]*\\.[0-9]+[^0-9.]*\\.*[0-9]*[^0-9]*[0-9]*$" "\\1" ${major} "${version_string}")
+    STRING(REGEX REPLACE "^[0-9]+[^0-9.]*\\.([0-9]+)[^0-9.]*\\.*[0-9]*[^0-9]*[0-9]*$" "\\1" ${minor} "${version_string}")
 
-    IF(${version_string} MATCHES "[0-9]+[^0-9]*\\.[0-9]+[^0-9]*\\.[0-9]+[^0-9]*")
+    IF(${version_string} MATCHES "[0-9]+[^0-9.]*\\.[0-9]+[^0-9.]*\\.[0-9]+[^0-9]*[0-9]*")
         # X.Y.Z format (python 3.5.2 ...)
-        STRING(REGEX REPLACE "^[0-9]+[^0-9]*\\.[0-9]+[^0-9]*\\.([0-9]+)[^0-9]*" "\\1" ${patch} "${version_string}")
+        STRING(REGEX REPLACE "^[0-9]+[^0-9.]*\\.[0-9]+[^0-9.]*\\.([0-9]+)[^0-9]*[0-9]*$" "\\1" ${patch} "${version_string}")
     ELSE()
         # X.Y format (python 3.5 ...)
         SET(${patch} "0")
@@ -986,3 +1056,89 @@ MACRO(SALOME_EXTRACT_VERSION version_string major minor patch)
     MESSAGE(FATAL_ERROR "Problem parsing version string, I can't parse it properly.")
   ENDIF()
 ENDMACRO(SALOME_EXTRACT_VERSION)
+
+#######################################################################
+#
+# This macro checks that swig files were generated.
+# It is requared under Windows platform, because sometimes under Windows platform
+# the genetarion of the swig wrappings tooks long time. And seems swig opens 
+# file at the begining of generation process and after that swig 
+# begins the generation of the content. In its turn Microsoft Visual Studio
+# tryes to compile file immediately after creation and as a result compilation breaks.
+MACRO(SWIG_CHECK_GENERATION swig_module)
+  IF(WIN32)
+    SET(SCRIPT 
+"@echo off
+:check
+( (call ) >> @SWIG_GEN_FILE_NAME@ ) 2>null && (
+  echo The file @SWIG_GEN_FILE_NAME@ was created. & goto :eof
+) || (
+  echo The file @SWIG_GEN_FILE_NAME@ is still being created !!! & goto :check
+)
+:eof")
+    SET(W_LIST)
+    LIST(LENGTH swig_generated_sources NB_GEN_FILES)  
+    IF(NOT ${NB_GEN_FILES})
+      LIST(LENGTH swig_generated_file_fullname NB_GEN_FILES)
+      SET(W_LIST ${swig_generated_file_fullname})
+    ELSE()
+      SET(W_LIST ${swig_generated_sources})
+    ENDIF()
+    IF(${NB_GEN_FILES})
+      LIST(GET W_LIST 0 SWIG_GEN_FILE_NAME)
+      STRING(CONFIGURE ${SCRIPT} SCRIPT)
+      GET_FILENAME_COMPONENT(SWIG_GEN_FILE_NAME_DIR ${SWIG_GEN_FILE_NAME} DIRECTORY)
+      GET_FILENAME_COMPONENT(SWIG_GEN_FILE_NAME_WE ${SWIG_GEN_FILE_NAME} NAME_WE)
+      SET(SCRIPT_FILE_NAME ${SWIG_GEN_FILE_NAME_DIR}/${SWIG_GEN_FILE_NAME_WE}.bat)
+      FILE(WRITE ${SCRIPT_FILE_NAME} ${SCRIPT})
+      ADD_CUSTOM_TARGET(${SWIG_MODULE_${swig_module}_REAL_NAME}_ready
+                        DEPENDS ${SWIG_GEN_FILE_NAME}
+                        COMMAND ${SCRIPT_FILE_NAME}
+                        COMMENT "Waiting for swig wrappings !!!")
+      ADD_DEPENDENCIES(${SWIG_MODULE_${swig_module}_REAL_NAME} ${SWIG_MODULE_${swig_module}_REAL_NAME}_ready)
+    ELSE()
+       MESSAGE(FATAL "swig sources for targer ${swig_module} are not found !!!")
+     ENDIF()
+  ENDIF()
+ENDMACRO(SWIG_CHECK_GENERATION)
+
+#########################################################################
+# SALOME_DO_VAR_SUBSTITUTION()
+#
+# USAGE: SALOME_DO_VAR_SUBSTITUTION(env variable value)
+#
+# ARGUMENTS:
+#   env      [out]: output script.
+#   variable  [in]: varable name
+#   value     [in]: variable value
+#
+# This macro concatenate variable value into script, like this:
+# on Linux:
+# export variable=value:${varuable}
+#
+# or on Windows:
+# SET variable=value;${varuable}
+#
+# Platform dependat variables PATH (Windows), 
+# DYLD_LIBRARY_PATH (Apple), LD_LIBRARY_PATH (Linux), should be
+# passed in Linux naming style, i.e. LD_LIBRARY_PATH. Macro 
+# converts this variable into platform scpecific variable.
+#
+MACRO(SALOME_DO_VAR_SUBSTITUTION env variable value)
+  SET(_item ${variable})
+  SET(_val ${value})
+  IF(WIN32)
+    IF(${_item} STREQUAL "LD_LIBRARY_PATH")
+      SET(_item PATH)
+    ENDIF()
+      STRING(REPLACE "/" "\\" ${env} "${${env}}@SET ${_item}=${_val};%${_item}%\n")        
+    ELSEIF(APPLE)
+      IF(${_item} STREQUAL "LD_LIBRARY_PATH")
+        SET(${env} "${${env}} export DYLD_LIBRARY_PATH=${_val}:\${DYLD_LIBRARY_PATH}\n")
+      ELSE()
+        SET(${env} "${${env}} export ${_item}=${_val}:\${${_item}}\n")
+      ENDIF()
+    ELSE()
+       SET(${env} "${${env}} export ${_item}=${_val}:\${${_item}}\n")
+  ENDIF()
+ENDMACRO(SALOME_DO_VAR_SUBSTITUTION)