xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/os_release_info.cmake (revision 35ffd701415c9e32e53136d61a677a8d0a8fc4a5)
1*35ffd701SAndroid Build Coastguard Worker# Copyright (c) 2018, Intel Corporation
2*35ffd701SAndroid Build Coastguard Worker#
3*35ffd701SAndroid Build Coastguard Worker# Permission is hereby granted, free of charge, to any person obtaining a
4*35ffd701SAndroid Build Coastguard Worker# copy of this software and associated documentation files (the "Software"),
5*35ffd701SAndroid Build Coastguard Worker# to deal in the Software without restriction, including without limitation
6*35ffd701SAndroid Build Coastguard Worker# the rights to use, copy, modify, merge, publish, distribute, sublicense,
7*35ffd701SAndroid Build Coastguard Worker# and/or sell copies of the Software, and to permit persons to whom the
8*35ffd701SAndroid Build Coastguard Worker# Software is furnished to do so, subject to the following conditions:
9*35ffd701SAndroid Build Coastguard Worker#
10*35ffd701SAndroid Build Coastguard Worker# The above copyright notice and this permission notice shall be included
11*35ffd701SAndroid Build Coastguard Worker# in all copies or substantial portions of the Software.
12*35ffd701SAndroid Build Coastguard Worker#
13*35ffd701SAndroid Build Coastguard Worker# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14*35ffd701SAndroid Build Coastguard Worker# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15*35ffd701SAndroid Build Coastguard Worker# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
16*35ffd701SAndroid Build Coastguard Worker# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
17*35ffd701SAndroid Build Coastguard Worker# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
18*35ffd701SAndroid Build Coastguard Worker# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
19*35ffd701SAndroid Build Coastguard Worker# OTHER DEALINGS IN THE SOFTWARE.
20*35ffd701SAndroid Build Coastguard Worker
21*35ffd701SAndroid Build Coastguard Worker
22*35ffd701SAndroid Build Coastguard Worker# os_release_info.cmake - Function to dump OS name and version
23*35ffd701SAndroid Build Coastguard Worker
24*35ffd701SAndroid Build Coastguard Worker# This file has no dependencies on other files (e.g., functions or definitions)
25*35ffd701SAndroid Build Coastguard Worker# of the local cmake environment.
26*35ffd701SAndroid Build Coastguard Worker
27*35ffd701SAndroid Build Coastguard Workerif(NOT DEFINED _os_release_info)
28*35ffd701SAndroid Build Coastguard Workerset(_os_release_info TRUE)
29*35ffd701SAndroid Build Coastguard Worker
30*35ffd701SAndroid Build Coastguard Worker# Set cmake policies for at least this level:
31*35ffd701SAndroid Build Coastguard Workercmake_minimum_required(VERSION 2.8.12)
32*35ffd701SAndroid Build Coastguard Worker
33*35ffd701SAndroid Build Coastguard Workerif(POLICY CMP0054)
34*35ffd701SAndroid Build Coastguard Worker    cmake_policy(SET CMP0054 NEW)
35*35ffd701SAndroid Build Coastguard Workerendif()
36*35ffd701SAndroid Build Coastguard Worker
37*35ffd701SAndroid Build Coastguard Worker
38*35ffd701SAndroid Build Coastguard Worker# Function get_os_release_info - Determine and return OS name and version
39*35ffd701SAndroid Build Coastguard Worker#
40*35ffd701SAndroid Build Coastguard Worker# Args:
41*35ffd701SAndroid Build Coastguard Worker# 1.  the name of a variable to receive os_name
42*35ffd701SAndroid Build Coastguard Worker# 2.  the name of a variable to receive os_version
43*35ffd701SAndroid Build Coastguard Worker#
44*35ffd701SAndroid Build Coastguard Worker# Return values: (Quotation marks are always stripped).
45*35ffd701SAndroid Build Coastguard Worker# Upon failure, return values are null strings.
46*35ffd701SAndroid Build Coastguard Worker#
47*35ffd701SAndroid Build Coastguard Worker# Examples:
48*35ffd701SAndroid Build Coastguard Worker#   os_name           os_version
49*35ffd701SAndroid Build Coastguard Worker#   --------------    -------
50*35ffd701SAndroid Build Coastguard Worker#   clear-linux-os    21180          (Changes twice daily)
51*35ffd701SAndroid Build Coastguard Worker#   ubuntu            12.04  16.04  17.10  18.04
52*35ffd701SAndroid Build Coastguard Worker#   fedora            27
53*35ffd701SAndroid Build Coastguard Worker#   centos            6.9  7.4.1708
54*35ffd701SAndroid Build Coastguard Worker#
55*35ffd701SAndroid Build Coastguard Worker# Potential sources are tried (in order of preference) until a
56*35ffd701SAndroid Build Coastguard Worker# suitable one is found.
57*35ffd701SAndroid Build Coastguard Worker
58*35ffd701SAndroid Build Coastguard Worker# Implementation documentation:
59*35ffd701SAndroid Build Coastguard Worker#
60*35ffd701SAndroid Build Coastguard Worker# The potential sources, in order, are as follows.
61*35ffd701SAndroid Build Coastguard Worker# - /etc/centos-release
62*35ffd701SAndroid Build Coastguard Worker#       Centos 7 also has /etc/os-release.  File /etc/os-release is less
63*35ffd701SAndroid Build Coastguard Worker#       precise about the Centos version (e.g., "7" instead of "7.4.1708").
64*35ffd701SAndroid Build Coastguard Worker#       For that reason, this file is checked first.
65*35ffd701SAndroid Build Coastguard Worker#       Examples:
66*35ffd701SAndroid Build Coastguard Worker#       CentOS release 6.9 (Final)
67*35ffd701SAndroid Build Coastguard Worker#       CentOS Linux release 7.4.1708 (Core)
68*35ffd701SAndroid Build Coastguard Worker# - /usr/lib/os-release
69*35ffd701SAndroid Build Coastguard Worker#       Present for Clear Linux, modern Fedora, and Ubuntu since some time
70*35ffd701SAndroid Build Coastguard Worker#       between 14.04 and 16.04.  The ID and VERSION_ID values are used.
71*35ffd701SAndroid Build Coastguard Worker#       Examples:
72*35ffd701SAndroid Build Coastguard Worker#       ID=clear-linux-os      VERSION_ID=21180
73*35ffd701SAndroid Build Coastguard Worker#       ID=fedora              VERSION_ID=27
74*35ffd701SAndroid Build Coastguard Worker#       ID=ubuntu              VERSION_ID="14.04"
75*35ffd701SAndroid Build Coastguard Worker#       ID=ubuntu              VERSION_ID="16.04"
76*35ffd701SAndroid Build Coastguard Worker#       ID="ubuntu"            VERSION_ID="17.10"
77*35ffd701SAndroid Build Coastguard Worker# - /etc/os-release - Same form as (sometimes a link to) /usr/lib/os-release
78*35ffd701SAndroid Build Coastguard Worker#       ID="Ubuntu"            VERSION_ID="12.04"
79*35ffd701SAndroid Build Coastguard Worker#       ID="Ubuntu"            VERSION_ID="14.04"
80*35ffd701SAndroid Build Coastguard Worker#           with a symbolic link: /etc/os-release -> ../usr/lib/os-release
81*35ffd701SAndroid Build Coastguard Worker#       ID="CentOS Linux"      VERSION_ID="7"    Also: ID_LIKE="rhel fedora"
82*35ffd701SAndroid Build Coastguard Worker# - /etc/lsb-release
83*35ffd701SAndroid Build Coastguard Worker#       For Centos, not too meaningful.
84*35ffd701SAndroid Build Coastguard Worker#       Other "OS"s are more reasonable:
85*35ffd701SAndroid Build Coastguard Worker#       DISTRIB_ID=Ubuntu      DISTRIB_RELEASE=12.04
86*35ffd701SAndroid Build Coastguard Worker#       DISTRIB_ID=Ubuntu      DISTRIB_RELEASE=14.04
87*35ffd701SAndroid Build Coastguard Worker#       DISTRIB_ID=Ubuntu      DISTRIB_RELEASE=17.10
88*35ffd701SAndroid Build Coastguard Worker
89*35ffd701SAndroid Build Coastguard Worker
90*35ffd701SAndroid Build Coastguard Workerfunction(get_os_release_info _vn_id _vn_version_id)
91*35ffd701SAndroid Build Coastguard Worker    set(_var_id "")
92*35ffd701SAndroid Build Coastguard Worker    set(_var_version_id "")
93*35ffd701SAndroid Build Coastguard Worker
94*35ffd701SAndroid Build Coastguard Worker    if("${_var_id}" STREQUAL "")
95*35ffd701SAndroid Build Coastguard Worker        set(file_path "/etc/centos-release")
96*35ffd701SAndroid Build Coastguard Worker        if(EXISTS "${file_path}")
97*35ffd701SAndroid Build Coastguard Worker            # Example: CentOS release 6.9 (Final)
98*35ffd701SAndroid Build Coastguard Worker            file(STRINGS "${file_path}" file_list LIMIT_COUNT 1)
99*35ffd701SAndroid Build Coastguard Worker            list(GET file_list 0 file_line)
100*35ffd701SAndroid Build Coastguard Worker
101*35ffd701SAndroid Build Coastguard Worker            # Remove all parenthesized items.
102*35ffd701SAndroid Build Coastguard Worker            string(REGEX REPLACE "\\([^)]+\\)" "" file_line "${file_line}")
103*35ffd701SAndroid Build Coastguard Worker
104*35ffd701SAndroid Build Coastguard Worker            # Extract start and end, discard optional "version" or "release"
105*35ffd701SAndroid Build Coastguard Worker            string(REGEX MATCH "^([A-Za-z0-9_]+)( +(version|release))? +(.*)$" _dummy "${file_line}")
106*35ffd701SAndroid Build Coastguard Worker            #                    1              2  3                    4
107*35ffd701SAndroid Build Coastguard Worker
108*35ffd701SAndroid Build Coastguard Worker            set(_var_id "${CMAKE_MATCH_1}")
109*35ffd701SAndroid Build Coastguard Worker            set(_var_version_id "${CMAKE_MATCH_4}")
110*35ffd701SAndroid Build Coastguard Worker        endif()
111*35ffd701SAndroid Build Coastguard Worker    endif()
112*35ffd701SAndroid Build Coastguard Worker
113*35ffd701SAndroid Build Coastguard Worker    if("${_var_id}" STREQUAL "")
114*35ffd701SAndroid Build Coastguard Worker        if(EXISTS "/usr/lib/os-release")
115*35ffd701SAndroid Build Coastguard Worker            set(file_path "/usr/lib/os-release")
116*35ffd701SAndroid Build Coastguard Worker        elseif(EXISTS "/etc/os-release")
117*35ffd701SAndroid Build Coastguard Worker            set(file_path "/etc/os-release")
118*35ffd701SAndroid Build Coastguard Worker        else()
119*35ffd701SAndroid Build Coastguard Worker            set(file_path "")
120*35ffd701SAndroid Build Coastguard Worker        endif()
121*35ffd701SAndroid Build Coastguard Worker
122*35ffd701SAndroid Build Coastguard Worker        if(NOT "${file_path}" STREQUAL "")
123*35ffd701SAndroid Build Coastguard Worker            file(STRINGS "${file_path}" data_list REGEX "^(ID|VERSION_ID)=")
124*35ffd701SAndroid Build Coastguard Worker
125*35ffd701SAndroid Build Coastguard Worker            # Look for lines like "ID="..." and VERSION_ID="..."
126*35ffd701SAndroid Build Coastguard Worker            foreach(_var ${data_list})
127*35ffd701SAndroid Build Coastguard Worker                if("${_var}" MATCHES "^(ID)=(.*)$")
128*35ffd701SAndroid Build Coastguard Worker                    set(_var_id "${CMAKE_MATCH_2}")
129*35ffd701SAndroid Build Coastguard Worker                elseif("${_var}" MATCHES "^(VERSION_ID)=(.*)$")
130*35ffd701SAndroid Build Coastguard Worker                    set(_var_version_id "${CMAKE_MATCH_2}")
131*35ffd701SAndroid Build Coastguard Worker                endif()
132*35ffd701SAndroid Build Coastguard Worker            endforeach()
133*35ffd701SAndroid Build Coastguard Worker        endif()
134*35ffd701SAndroid Build Coastguard Worker    endif()
135*35ffd701SAndroid Build Coastguard Worker
136*35ffd701SAndroid Build Coastguard Worker    if("${_var_id}" STREQUAL "")
137*35ffd701SAndroid Build Coastguard Worker        set(file_path "/etc/lsb-release")
138*35ffd701SAndroid Build Coastguard Worker        if(EXISTS "${file_path}")
139*35ffd701SAndroid Build Coastguard Worker            file(STRINGS "${file_path}" data_list REGEX "^(DISTRIB_ID|DISTRIB_RELEASE)=")
140*35ffd701SAndroid Build Coastguard Worker
141*35ffd701SAndroid Build Coastguard Worker            # Look for lines like "DISTRIB_ID="..." and DISTRIB_RELEASE="..."
142*35ffd701SAndroid Build Coastguard Worker            foreach(_var ${data_list})
143*35ffd701SAndroid Build Coastguard Worker                if("${_var}" MATCHES "^(DISTRIB_ID)=(.*)$")
144*35ffd701SAndroid Build Coastguard Worker                    set(_var_id "${CMAKE_MATCH_2}")
145*35ffd701SAndroid Build Coastguard Worker                elseif("${_var}" MATCHES "^(DISTRIB_RELEASE)=(.*)$")
146*35ffd701SAndroid Build Coastguard Worker                    set(_var_version_id "${CMAKE_MATCH_2}")
147*35ffd701SAndroid Build Coastguard Worker                endif()
148*35ffd701SAndroid Build Coastguard Worker            endforeach()
149*35ffd701SAndroid Build Coastguard Worker        endif()
150*35ffd701SAndroid Build Coastguard Worker    endif()
151*35ffd701SAndroid Build Coastguard Worker
152*35ffd701SAndroid Build Coastguard Worker    string(TOLOWER "${_var_id}" "_var_id")
153*35ffd701SAndroid Build Coastguard Worker
154*35ffd701SAndroid Build Coastguard Worker    string(STRIP "${_var_id}" _var_id)
155*35ffd701SAndroid Build Coastguard Worker    string(STRIP "${_var_version_id}" _var_version_id)
156*35ffd701SAndroid Build Coastguard Worker
157*35ffd701SAndroid Build Coastguard Worker    # Remove any enclosing quotation marks
158*35ffd701SAndroid Build Coastguard Worker    string(REGEX REPLACE "^\"(.*)\"$" "\\1" _var_id "${_var_id}")
159*35ffd701SAndroid Build Coastguard Worker    string(REGEX REPLACE "^\"(.*)\"$" "\\1" _var_version_id "${_var_version_id}")
160*35ffd701SAndroid Build Coastguard Worker
161*35ffd701SAndroid Build Coastguard Worker    if(NOT "${_vn_id}" STREQUAL "")
162*35ffd701SAndroid Build Coastguard Worker        set(${_vn_id} "${_var_id}" PARENT_SCOPE)
163*35ffd701SAndroid Build Coastguard Worker    endif()
164*35ffd701SAndroid Build Coastguard Worker
165*35ffd701SAndroid Build Coastguard Worker    if(NOT "${_vn_version_id}" STREQUAL "")
166*35ffd701SAndroid Build Coastguard Worker        set(${_vn_version_id} "${_var_version_id}" PARENT_SCOPE)
167*35ffd701SAndroid Build Coastguard Worker    endif()
168*35ffd701SAndroid Build Coastguard Worker
169*35ffd701SAndroid Build Coastguard Workerendfunction()
170*35ffd701SAndroid Build Coastguard Worker
171*35ffd701SAndroid Build Coastguard Worker
172*35ffd701SAndroid Build Coastguard Workerendif(NOT DEFINED _os_release_info)
173