Salome HOME
Copyright update 2022
[tools/configuration.git] / cmake / SalomeMacros.cmake
index 79c77e06442e7aa080990769324f34d1a7be1921..3c1a9ff5729a2d4b40e421c3a707adcb0661e098 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2012-2019  CEA/DEN, EDF R&D, OPEN CASCADE
+# Copyright (C) 2012-2022  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()
+IF(CMAKE_VERSION VERSION_GREATER_EQUAL 3.18)
+  CMAKE_POLICY(SET CMP0057 NEW)
+ENDIF()
 #----------------------------------------------------------------------------
 # LIST_CONTAINS is a macro useful for determining whether a list has a 
 # particular entry
@@ -321,11 +335,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")
@@ -345,9 +359,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)
@@ -573,12 +587,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()
@@ -747,8 +761,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})
@@ -1127,3 +1144,80 @@ MACRO(SALOME_DO_VAR_SUBSTITUTION env variable value)
        SET(${env} "${${env}} export ${_item}=${_val}:\${${_item}}\n")
   ENDIF()
 ENDMACRO(SALOME_DO_VAR_SUBSTITUTION)
+
+#########################################################################
+# SALOME_SETUP_VERSION()
+#
+# USAGE: SALOME_SETUP_VERSION(version [DEVELOPMENT])
+#
+# ARGUMENTS:
+#   version   [in] Version decriptor (string).
+#
+# OPTIONS:
+#   DEVELOPMENT    Forces setting development flag.
+#
+# The macro sets the following variables:
+# - PROJECTNAME_MAJOR_VERSION - major version number
+# - PROJECTNAME_MINOR_VERSION - minor version number
+# - PROJECTNAME_PATCH_VERSION - release version number
+# - PROJECTNAME_VERSION       - full qualified version
+# - PROJECTNAME_VERSION_DEV   - development flag (0 value for released version)
+# - PROJECTNAME_XVERSION      - hexadecimal representation of version
+# - PROJECTNAME_GIT_SHA1      - git commit's sha1
+#
+FUNCTION(SALOME_SETUP_VERSION version)
+  # parse arguments
+  PARSE_ARGUMENTS(SALOME_SETUP_VERSION "" "DEVELOPMENT" ${ARGN})
+  # project name in upper case (if not set in master CMakeLists.txt)
+  STRING(TOUPPER ${PROJECT_NAME} _pkg_uc)
+  # parse version component
+  STRING(REGEX MATCHALL "[^.]" _components "${version}")
+  LIST(LENGTH _components _length)
+  IF(${_length} GREATER 0)
+    LIST(GET _components 0 _major)
+    LIST(REMOVE_AT _components 0)
+  ELSE()
+    SET(_major 0)
+  ENDIF()
+  LIST(LENGTH _components _length)
+  IF(${_length} GREATER 0)
+    LIST(GET _components 0 _minor)
+    LIST(REMOVE_AT _components 0)
+  ELSE()
+    SET(_minor 0)
+  ENDIF()
+  LIST(LENGTH _components _length)
+  IF(${_length} GREATER 0)
+    LIST(GET _components 0 _patch)
+    LIST(REMOVE_AT _components 0)
+  ELSE()
+    SET(_patch 0)
+  ENDIF()
+  # set project version: 'major', 'minor' and 'patch' components
+  SET(${_pkg_uc}_MAJOR_VERSION ${_major} PARENT_SCOPE)
+  SET(${_pkg_uc}_MINOR_VERSION ${_minor} PARENT_SCOPE)
+  SET(${_pkg_uc}_PATCH_VERSION ${_patch} PARENT_SCOPE)
+  SET(${_pkg_uc}_VERSION       ${_major}.${_minor}.${_patch} PARENT_SCOPE)
+  # set 'development' flag
+  IF(SALOME_SETUP_VERSION_DEVELOPMENT)
+    SET(${_pkg_uc}_VERSION_DEV 1 PARENT_SCOPE)
+  ELSE()
+    SET(${_pkg_uc}_VERSION_DEV 0 PARENT_SCOPE)
+  ENDIF()
+  # set hexa representation of version
+  SALOME_TOHEXA(${_major} _major_h)
+  SALOME_TOHEXA(${_minor} _minor_h)
+  SALOME_TOHEXA(${_patch} _patch_h)
+  SET(${_pkg_uc}_XVERSION "0x${_major_h}${_minor_h}${_patch_h}" PARENT_SCOPE)
+  # detect git sha1
+  EXECUTE_PROCESS(COMMAND git describe --dirty --tags --match=V* --always
+    WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
+    OUTPUT_VARIABLE _git_version
+    ERROR_QUIET
+    OUTPUT_STRIP_TRAILING_WHITESPACE)
+  IF(_git_version)
+    SET(${_pkg_uc}_GIT_SHA1 "${_git_version}" PARENT_SCOPE)
+  ELSE(_)
+    SET(${_pkg_uc}_GIT_SHA1 "unknown" PARENT_SCOPE)
+  ENDIF()
+ENDFUNCTION()