#
# Copyright (C) 2020-2021 Intel Corporation
#
# SPDX-License-Identifier: MIT
#

if(NOT DEFINED _os_release_info)
  set(_os_release_info TRUE)

  # os_release_info.cmake - Function to dump OS name and version

  # This file has no dependencies on other files (e.g., functions or definitions)
  # of the local cmake environment.

  # Set cmake policies for at least this level:
  cmake_minimum_required(VERSION 3.2.0)

  # Function get_os_release_info - Determine and return OS name and version
  #
  # Args:
  # 1.  the name of a variable to receive os_name
  # 2.  the name of a variable to receive os_version
  #
  # Return values: (Quotation marks are always stripped).
  # Upon failure, return values are null strings.
  #
  # Examples:
  #   os_name           os_version
  #   --------------    -------
  #   clear-linux-os    21180          (Changes twice daily)
  #   ubuntu            12.04  16.04  17.10  18.04
  #   fedora            27
  #   centos            6.9  7.4.1708
  #
  # Potential sources are tried (in order of preference) until a
  # suitable one is found.

  # Implementation documentation:
  #
  # The potential sources, in order, are as follows.
  # - /etc/centos-release
  #       Centos 7 also has /etc/os-release.  File /etc/os-release is less
  #       precise about the Centos version (e.g., "7" instead of "7.4.1708").
  #       For that reason, this file is checked first.
  #       Examples:
  #       CentOS release 6.9 (Final)
  #       CentOS Linux release 7.4.1708 (Core)
  # - /usr/lib/os-release
  #       Present for Clear Linux, modern Fedora, and Ubuntu since some time
  #       between 14.04 and 16.04.  The ID and VERSION_ID values are used.
  #       Examples:
  #       ID=clear-linux-os      VERSION_ID=21180
  #       ID=fedora              VERSION_ID=27
  #       ID=ubuntu              VERSION_ID="14.04"
  #       ID=ubuntu              VERSION_ID="16.04"
  #       ID="ubuntu"            VERSION_ID="17.10"
  # - /etc/os-release - Same form as (sometimes a link to) /usr/lib/os-release
  #       ID="Ubuntu"            VERSION_ID="12.04"
  #       ID="Ubuntu"            VERSION_ID="14.04"
  #           with a symbolic link: /etc/os-release -> ../usr/lib/os-release
  #       ID="CentOS Linux"      VERSION_ID="7"    Also: ID_LIKE="rhel fedora"
  # - /etc/lsb-release
  #       For Centos, not too meaningful.
  #       Other "OS"s are more reasonable:
  #       DISTRIB_ID=Ubuntu      DISTRIB_RELEASE=12.04
  #       DISTRIB_ID=Ubuntu      DISTRIB_RELEASE=14.04
  #       DISTRIB_ID=Ubuntu      DISTRIB_RELEASE=17.10

  function(get_os_release_info _vn_id _vn_version_id _vn_codename)
    set(_var_id "")
    set(_var_version_id "")
    set(_var_codename "")

    if("${_var_id}" STREQUAL "")
      set(file_path "/etc/centos-release")
      if(EXISTS "${file_path}")
        # Example: CentOS release 6.9 (Final)
        file(STRINGS "${file_path}" file_list LIMIT_COUNT 1)
        list(GET file_list 0 file_line)

        # Remove all parenthesized items.
        string(REGEX REPLACE "\\([^)]+\\)" "" file_line "${file_line}")

        # Extract start and end, discard optional "version" or "release"
        string(REGEX MATCH "^([A-Za-z0-9_]+)( +(version|release))? +(.*)$" _dummy "${file_line}")
        #                    1              2  3                    4

        set(_var_id "${CMAKE_MATCH_1}")
        set(_var_version_id "${CMAKE_MATCH_4}")
      endif()
    endif()

    if("${_var_id}" STREQUAL "")
      if(EXISTS "/usr/lib/os-release")
        set(file_path "/usr/lib/os-release")
      elseif(EXISTS "/etc/os-release")
        set(file_path "/etc/os-release")
      else()
        set(file_path "")
      endif()

      if(NOT "${file_path}" STREQUAL "")
        file(STRINGS "${file_path}" data_list REGEX "^(ID|VERSION_ID|VERSION_CODENAME)=")

        # Look for lines like "ID="..." and VERSION_ID="..."
        foreach(_var ${data_list})
          if("${_var}" MATCHES "^(ID)=(.*)$")
            set(_var_id "${CMAKE_MATCH_2}")
          elseif("${_var}" MATCHES "^(VERSION_ID)=(.*)$")
            set(_var_version_id "${CMAKE_MATCH_2}")
          elseif("${_var}" MATCHES "^(VERSION_CODENAME)=(.*)$")
            set(_var_codename "${CMAKE_MATCH_2}")
          endif()
        endforeach()
      endif()
    endif()

    if("${_var_id}" STREQUAL "")
      set(file_path "/etc/lsb-release")
      if(EXISTS "${file_path}")
        file(STRINGS "${file_path}" data_list REGEX "^(DISTRIB_ID|DISTRIB_RELEASE|DISTRIB_CODENAME)=")

        # Look for lines like "DISTRIB_ID="..." and DISTRIB_RELEASE="..."
        foreach(_var ${data_list})
          if("${_var}" MATCHES "^(DISTRIB_ID)=(.*)$")
            set(_var_id "${CMAKE_MATCH_2}")
          elseif("${_var}" MATCHES "^(DISTRIB_RELEASE)=(.*)$")
            set(_var_version_id "${CMAKE_MATCH_2}")
          elseif("${_var}" MATCHES "^(DISTRIB_CODENAME)=(.*)$")
            set(_var_codename "${CMAKE_MATCH_2}")
          endif()
        endforeach()
      endif()
    endif()

    string(TOLOWER "${_var_id}" "_var_id")

    string(STRIP "${_var_id}" _var_id)
    string(STRIP "${_var_version_id}" _var_version_id)
    string(STRIP "${_var_codename}" _var_codename)

    # Remove any enclosing quotation marks
    string(REGEX REPLACE "^\"(.*)\"$" "\\1" _var_id "${_var_id}")
    string(REGEX REPLACE "^\"(.*)\"$" "\\1" _var_version_id "${_var_version_id}")
    string(REGEX REPLACE "^\"(.*)\"$" "\\1" _var_codename "${_var_codename}")

    if(NOT "${_vn_id}" STREQUAL "")
      set(${_vn_id} "${_var_id}" PARENT_SCOPE)
    endif()

    if(NOT "${_vn_version_id}" STREQUAL "")
      set(${_vn_version_id} "${_var_version_id}" PARENT_SCOPE)
    endif()

    if(NOT "${_vn_codename}" STREQUAL "")
      set(${_vn_codename} "${_var_codename}" PARENT_SCOPE)
    endif()
  endfunction()

endif()
