Back to home page

Enduro/X

 
 

    


0001 ##
0002 ## @brief Operating system versions resolver
0003 ##
0004 ## @file ex_osver.cmake
0005 ##
0006 ## -----------------------------------------------------------------------------
0007 ## Enduro/X Middleware Platform for Distributed Transaction Processing
0008 ## Copyright (C) 2009-2016, ATR Baltic, Ltd. All Rights Reserved.
0009 ## Copyright (C) 2017-2023, Mavimax, Ltd. All Rights Reserved.
0010 ## This software is released under one of the following licenses:
0011 ## AGPL (with Java and Go exceptions) or Mavimax's license for commercial use.
0012 ## See LICENSE file for full text.
0013 ## -----------------------------------------------------------------------------
0014 ## AGPL license:
0015 ##
0016 ## This program is free software; you can redistribute it and/or modify it under
0017 ## the terms of the GNU Affero General Public License, version 3 as published
0018 ## by the Free Software Foundation;
0019 ##
0020 ## This program is distributed in the hope that it will be useful, but WITHOUT ANY
0021 ## WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
0022 ## PARTICULAR PURPOSE. See the GNU Affero General Public License, version 3
0023 ## for more details.
0024 ##
0025 ## You should have received a copy of the GNU Affero General Public License along 
0026 ## with this program; if not, write to the Free Software Foundation, Inc.,
0027 ## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
0028 ##
0029 ## -----------------------------------------------------------------------------
0030 ## A commercial use license is available from Mavimax, Ltd
0031 ## contact@mavimax.com
0032 ## -----------------------------------------------------------------------------
0033 ##
0034 
0035 cmake_minimum_required (VERSION 3.5) 
0036 
0037 #
0038 # Required includes for macro package
0039 #
0040 macro(ex_osver_include)
0041     INCLUDE (${CMAKE_ROOT}/Modules/CheckTypeSize.cmake)
0042 endmacro(ex_osver_include)
0043 
0044 # for all
0045 EXEC_PROGRAM(uname ARGS -a OUTPUT_VARIABLE _TMP_CMAKE_OS_NAME)
0046 string(REGEX MATCH "^[a-zA-Z0-9-]*" _TMP_CMAKE_OS_NAME_EXTR ${_TMP_CMAKE_OS_NAME})
0047 string(TOUPPER ${_TMP_CMAKE_OS_NAME_EXTR} CMAKE_OS_NAME)
0048 
0049 #
0050 # Set operating system version flags
0051 # 
0052 macro(ex_osver)
0053 
0054     find_program(LSB_RELEASE_EXECUTABLE lsb_release)
0055     if(LSB_RELEASE_EXECUTABLE)
0056         execute_process(COMMAND ${LSB_RELEASE_EXECUTABLE} -si
0057             OUTPUT_VARIABLE _TMP_LSB_RELEASE_OUTPUT_OS
0058             ERROR_QUIET
0059             OUTPUT_STRIP_TRAILING_WHITESPACE)
0060 
0061         string(TOLOWER 
0062                 ${_TMP_LSB_RELEASE_OUTPUT_OS}
0063         LSB_RELEASE_OUTPUT_OS)
0064         string(REPLACE " " "_" LSB_RELEASE_OUTPUT_OS ${LSB_RELEASE_OUTPUT_OS})
0065 
0066         execute_process(COMMAND ${LSB_RELEASE_EXECUTABLE} -sr
0067             OUTPUT_VARIABLE _TMP_LSB_RELEASE_OUTPUT_VER
0068             ERROR_QUIET
0069             OUTPUT_STRIP_TRAILING_WHITESPACE)
0070         string(REPLACE "." "_" LSB_RELEASE_OUTPUT_VER ${_TMP_LSB_RELEASE_OUTPUT_VER})
0071         #string(REGEX MATCH "^[0-9]+" LSB_RELEASE_OUTPUT_VER ${_TMP_LSB_RELEASE_OUTPUT_VER})
0072     elseif (EXISTS /etc/os-release)
0073 
0074         execute_process(COMMAND bash -c "cat /etc/os-release | egrep '^NAME='"
0075             OUTPUT_VARIABLE _TMP_LSB_RELEASE_OUTPUT_OS
0076             OUTPUT_STRIP_TRAILING_WHITESPACE)
0077 
0078         # extract the os name by regex
0079         if (_TMP_LSB_RELEASE_OUTPUT_OS MATCHES "^NAME=[\'\"]*([^\'\"]+)")
0080             set(_TMP_LSB_RELEASE_OUTPUT_OS ${CMAKE_MATCH_1})
0081         else()
0082             message(FATAL_ERROR "Failed to extract OS version from /etc/os-release")
0083         endif()
0084 
0085         string(TOLOWER 
0086                 ${_TMP_LSB_RELEASE_OUTPUT_OS}
0087         LSB_RELEASE_OUTPUT_OS)
0088         string(REPLACE " " "_" LSB_RELEASE_OUTPUT_OS ${LSB_RELEASE_OUTPUT_OS})
0089 
0090         # fixes for CentOs 7.1810, having something like "7 (Core)" in output.
0091         execute_process(COMMAND bash -c "cat /etc/os-release | egrep '^VERSION=' | cut -d '=' -f2 | cut -d ' ' -f1 | cut -d '\"' -f2"
0092             OUTPUT_VARIABLE _TMP_LSB_RELEASE_OUTPUT_VER
0093             OUTPUT_STRIP_TRAILING_WHITESPACE)
0094         string(REPLACE "." "_" LSB_RELEASE_OUTPUT_VER ${_TMP_LSB_RELEASE_OUTPUT_VER})
0095         string(REPLACE "-" "_" LSB_RELEASE_OUTPUT_VER ${LSB_RELEASE_OUTPUT_VER})
0096     else ()
0097         set(LSB_RELEASE_OUTPUT_OS ${CMAKE_OS_NAME})
0098 
0099         string(REPLACE "." "_" _TMP_LSB_RELEASE_OUTPUT_VER ${CMAKE_SYSTEM_VERSION})
0100         string(REPLACE "-" "_" LSB_RELEASE_OUTPUT_VER ${_TMP_LSB_RELEASE_OUTPUT_VER})
0101 
0102         # If it is AIX, then we can extract version from uname
0103         if(${CMAKE_OS_NAME} STREQUAL "AIX")
0104             execute_process(COMMAND uname -v
0105                 OUTPUT_VARIABLE _TMP_OS_MAJOR_VER OUTPUT_STRIP_TRAILING_WHITESPACE)
0106             execute_process(COMMAND uname -r
0107                 OUTPUT_VARIABLE _TMP_OS_MINOR_VER OUTPUT_STRIP_TRAILING_WHITESPACE)
0108             set(LSB_RELEASE_OUTPUT_VER ${_TMP_OS_MAJOR_VER}_${_TMP_OS_MINOR_VER})
0109         endif()
0110 
0111     endif()
0112 
0113     message("LSB_RELEASE OS  = ${LSB_RELEASE_OUTPUT_OS}")
0114     message("LSB_RELEASE VER = ${LSB_RELEASE_OUTPUT_VER}")
0115     set(EX_LSB_RELEASE_VER ${LSB_RELEASE_OUTPUT_VER})
0116 
0117     string(REPLACE "_" ";" LSB_VERSION_LIST ${LSB_RELEASE_OUTPUT_VER})
0118 
0119     list( LENGTH LSB_VERSION_LIST TMP_LIST_LEN ) 
0120 
0121     if (TMP_LIST_LEN LESS 1)
0122         # No version at all!!
0123         set(EX_LSB_RELEASE_VER_MAJOR "0")
0124         set(EX_LSB_RELEASE_VER_MINOR "0")
0125     elseif (TMP_LIST_LEN LESS 2)
0126         # Bug #198 - FedoraCore do not have minor version numbers
0127         list(GET LSB_VERSION_LIST 0 EX_LSB_RELEASE_VER_MAJOR)
0128         set(EX_LSB_RELEASE_VER_MINOR "0")
0129     else ()
0130         list(GET LSB_VERSION_LIST 0 EX_LSB_RELEASE_VER_MAJOR)
0131         list(GET LSB_VERSION_LIST 1 EX_LSB_RELEASE_VER_MINOR)
0132     endif()
0133 
0134     #
0135     # This matches the standard releases made by Mavimax:
0136     # mapping table:
0137     # -------------------------------------------------------------------------
0138     # oracle_solaris11_4        -> solaris11
0139     # SUNOS5_10                 -> solaris10
0140     # sles                      -> sl
0141     # aix7_3                    -> aix72, also powerpc -> ppc
0142     # freebsd13_0_RELEASE_p7    -> freebsd13_0
0143     # -------------------------------------------------------------------------
0144     # additionally: use  lower case for binary names, for all components of the filename
0145     # 
0146     if ( (${LSB_RELEASE_OUTPUT_OS} STREQUAL "oracle_linux_server") OR
0147              (${LSB_RELEASE_OUTPUT_OS} STREQUAL "oracleserver") OR
0148              (${LSB_RELEASE_OUTPUT_OS} STREQUAL "centos") )
0149         # Common for RHEL based linux:
0150         set(LSB_RELEASE_OUTPUT_OS "el")
0151         set(LSB_RELEASE_OUTPUT_VER ${EX_LSB_RELEASE_VER_MAJOR})
0152     elseif ( (${LSB_RELEASE_OUTPUT_OS} STREQUAL "sles") OR
0153             (${LSB_RELEASE_OUTPUT_OS} STREQUAL "suse") )
0154         # Common for suse linux:
0155         set(LSB_RELEASE_OUTPUT_OS "sl")
0156         set(LSB_RELEASE_OUTPUT_VER ${EX_LSB_RELEASE_VER_MAJOR})
0157     elseif (${LSB_RELEASE_OUTPUT_OS} STREQUAL "freebsd")
0158         if (LSB_RELEASE_OUTPUT_VER MATCHES "^([0-9]+_[0-9]+).*$")
0159             set(LSB_RELEASE_OUTPUT_VER ${CMAKE_MATCH_1})
0160         endif()
0161     elseif (${LSB_RELEASE_OUTPUT_OS} STREQUAL "AIX")
0162         set(LSB_RELEASE_OUTPUT_OS "aix")
0163         set(LSB_RELEASE_OUTPUT_VER "${EX_LSB_RELEASE_VER_MAJOR}${EX_LSB_RELEASE_VER_MINOR}")
0164     elseif ( (${LSB_RELEASE_OUTPUT_OS} STREQUAL "oracle_solaris") )
0165         set(LSB_RELEASE_OUTPUT_OS "solaris")
0166         if (LSB_RELEASE_OUTPUT_VER MATCHES "^([0-9]+).*$")
0167             set(LSB_RELEASE_OUTPUT_VER ${CMAKE_MATCH_1})
0168         endif()
0169     elseif ( (${LSB_RELEASE_OUTPUT_OS} STREQUAL "SUNOS") AND ${EX_LSB_RELEASE_VER_MAJOR} STREQUAL "5")
0170         set(LSB_RELEASE_OUTPUT_OS "solaris")
0171         set(LSB_RELEASE_OUTPUT_VER "${EX_LSB_RELEASE_VER_MINOR}")
0172     endif()
0173 
0174     message("LSB_RELEASE OS  = ${LSB_RELEASE_OUTPUT_OS}")
0175     message("LSB_RELEASE VER = ${LSB_RELEASE_OUTPUT_VER}")
0176     message( "EX_LSB_RELEASE_VER_MAJOR = " ${EX_LSB_RELEASE_VER_MAJOR} )
0177     message( "EX_LSB_RELEASE_VER_MINOR = " ${EX_LSB_RELEASE_VER_MINOR} )
0178 
0179 endmacro(ex_osver)
0180 
0181 
0182 #
0183 # Common CPU architecture builder
0184 #
0185 macro(ex_cpuarch)
0186 
0187     CHECK_TYPE_SIZE("void*"  EX_OSVER_SIZEOF_VOIDPTR)
0188     MATH (EXPR EX_OSVER_PLATFORM_BITS "${EX_OSVER_SIZEOF_VOIDPTR} * 8")
0189 
0190     #
0191     # Fix arch for AIX
0192     #
0193     if(CMAKE_SYSTEM_PROCESSOR MATCHES "^powerpc")
0194         set(CPACK_RPM_PACKAGE_ARCHITECTURE "ppc")
0195     endif()
0196 
0197     set(EX_CPU_ARCH "${CMAKE_SYSTEM_PROCESSOR}_${EX_OSVER_PLATFORM_BITS}")
0198 
0199     #
0200     # MAP the CPU name
0201     #
0202     if( (${EX_CPU_ARCH} STREQUAL "x86_64_64") OR (${EX_CPU_ARCH} STREQUAL "amd64_64") OR
0203         (${EX_CPU_ARCH} STREQUAL "386_64") OR (${EX_CPU_ARCH} STREQUAL "amd64")
0204         OR (${EX_CPU_ARCH} STREQUAL "i386_64") )
0205         set(EX_CPU_ARCH "x86_64")
0206     elseif(${EX_CPU_ARCH} STREQUAL "powerpc_64")
0207         set(EX_CPU_ARCH "ppc64")
0208     elseif(${EX_CPU_ARCH} STREQUAL "arm64_64")
0209         set(EX_CPU_ARCH "arm64")
0210     elseif(${EX_CPU_ARCH} STREQUAL "powerpc")
0211         set(EX_CPU_ARCH "ppc")
0212     elseif(${EX_CPU_ARCH} STREQUAL "sparc_64")
0213         set(EX_CPU_ARCH "sparc64")
0214     endif()
0215 
0216 endmacro(ex_cpuarch)
0217 
0218 
0219 # vim: set ts=4 sw=4 et smartindent: