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: