Salome HOME
Copyright update 2021
[tools/configuration.git] / cmake / SalomeMacros.cmake
index f6e9388710e42d317fb2d643594524bf49bd3b4e..e67a6d9122105a62b25968984d980f06d503af9e 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2019  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
@@ -120,10 +132,11 @@ MACRO(SALOME_INSTALL_SCRIPTS file_list path)
     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(_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)
@@ -320,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")
@@ -344,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)
@@ -572,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()
@@ -746,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})
@@ -792,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()
@@ -812,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)
 
 #########################################################################
@@ -1041,3 +1102,43 @@ MACRO(SWIG_CHECK_GENERATION swig_module)
   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)