]>
Commit | Line | Data |
---|---|---|
1 | # Shell script that defines functions for determining some environmental | |
2 | # characteristics for the edk2 "build" utility. | |
3 | # | |
4 | # This script is meant to be sourced, in a bash environment. | |
5 | # | |
6 | # Copyright (C) 2019 Red Hat, Inc. | |
7 | # | |
8 | # This program and the accompanying materials are licensed and made available | |
9 | # under the terms and conditions of the BSD License that accompanies this | |
10 | # distribution. The full text of the license may be found at | |
11 | # <http://opensource.org/licenses/bsd-license.php>. | |
12 | # | |
13 | # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT | |
14 | # WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
15 | ||
16 | ||
17 | # Verify whether the QEMU system emulation target is supported by the UEFI spec | |
18 | # and edk2. Print a message to the standard error, and return with nonzero | |
19 | # status, if verification fails. | |
20 | # | |
21 | # Parameters: | |
22 | # $1: QEMU system emulation target | |
23 | qemu_edk2_verify_arch() | |
24 | { | |
25 | local emulation_target="$1" | |
26 | local program_name=$(basename -- "$0") | |
27 | ||
28 | case "$emulation_target" in | |
29 | (arm|aarch64|i386|x86_64) | |
30 | ;; | |
31 | (*) | |
32 | printf '%s: unknown/unsupported QEMU system emulation target "%s"\n' \ | |
33 | "$program_name" "$emulation_target" >&2 | |
34 | return 1 | |
35 | ;; | |
36 | esac | |
37 | } | |
38 | ||
39 | ||
40 | # Translate the QEMU system emulation target to the edk2 architecture | |
41 | # identifier. Print the result to the standard output. | |
42 | # | |
43 | # Parameters: | |
44 | # $1: QEMU system emulation target | |
45 | qemu_edk2_get_arch() | |
46 | { | |
47 | local emulation_target="$1" | |
48 | ||
49 | if ! qemu_edk2_verify_arch "$emulation_target"; then | |
50 | return 1 | |
51 | fi | |
52 | ||
53 | case "$emulation_target" in | |
54 | (arm) | |
55 | printf 'ARM\n' | |
56 | ;; | |
57 | (aarch64) | |
58 | printf 'AARCH64\n' | |
59 | ;; | |
60 | (i386) | |
61 | printf 'IA32\n' | |
62 | ;; | |
63 | (x86_64) | |
64 | printf 'X64\n' | |
65 | ;; | |
66 | esac | |
67 | } | |
68 | ||
69 | ||
70 | # Translate the QEMU system emulation target to the gcc cross-compilation | |
71 | # architecture identifier. Print the result to the standard output. | |
72 | # | |
73 | # Parameters: | |
74 | # $1: QEMU system emulation target | |
75 | qemu_edk2_get_gcc_arch() | |
76 | { | |
77 | local emulation_target="$1" | |
78 | ||
79 | if ! qemu_edk2_verify_arch "$emulation_target"; then | |
80 | return 1 | |
81 | fi | |
82 | ||
83 | case "$emulation_target" in | |
84 | (arm|aarch64|x86_64) | |
85 | printf '%s\n' "$emulation_target" | |
86 | ;; | |
87 | (i386) | |
88 | printf 'i686\n' | |
89 | ;; | |
90 | esac | |
91 | } | |
92 | ||
93 | ||
94 | # Determine the gcc cross-compiler prefix (if any) for use with the edk2 | |
95 | # toolchain. Print the result to the standard output. | |
96 | # | |
97 | # Parameters: | |
98 | # $1: QEMU system emulation target | |
99 | qemu_edk2_get_cross_prefix() | |
100 | { | |
101 | local emulation_target="$1" | |
102 | local gcc_arch | |
103 | local host_arch | |
104 | ||
105 | if ! gcc_arch=$(qemu_edk2_get_gcc_arch "$emulation_target"); then | |
106 | return 1 | |
107 | fi | |
108 | ||
109 | host_arch=$(uname -m) | |
110 | ||
111 | if [ "$gcc_arch" == "$host_arch" ] || | |
112 | ( [ "$gcc_arch" == i686 ] && [ "$host_arch" == x86_64 ] ); then | |
113 | # no cross-compiler needed | |
114 | : | |
115 | else | |
116 | printf '%s-linux-gnu-\n' "$gcc_arch" | |
117 | fi | |
118 | } | |
119 | ||
120 | ||
121 | # Determine the edk2 toolchain tag for the QEMU system emulation target. Print | |
122 | # the result to the standard output. Print a message to the standard error, and | |
123 | # return with nonzero status, if the (conditional) gcc version check fails. | |
124 | # | |
125 | # Parameters: | |
126 | # $1: QEMU system emulation target | |
127 | qemu_edk2_get_toolchain() | |
128 | { | |
129 | local emulation_target="$1" | |
130 | local program_name=$(basename -- "$0") | |
131 | local cross_prefix | |
132 | local gcc_version | |
133 | ||
134 | if ! qemu_edk2_verify_arch "$emulation_target"; then | |
135 | return 1 | |
136 | fi | |
137 | ||
138 | case "$emulation_target" in | |
139 | (arm|aarch64) | |
140 | printf 'GCC5\n' | |
141 | ;; | |
142 | ||
143 | (i386|x86_64) | |
144 | if ! cross_prefix=$(qemu_edk2_get_cross_prefix "$emulation_target"); then | |
145 | return 1 | |
146 | fi | |
147 | ||
148 | gcc_version=$("${cross_prefix}gcc" -v 2>&1 | tail -1 | awk '{print $3}') | |
149 | # Run "git-blame" on "OvmfPkg/build.sh" in edk2 for more information on | |
150 | # the mapping below. | |
151 | case "$gcc_version" in | |
152 | ([1-3].*|4.[0-3].*) | |
153 | printf '%s: unsupported gcc version "%s"\n' \ | |
154 | "$program_name" "$gcc_version" >&2 | |
155 | return 1 | |
156 | ;; | |
157 | (4.4.*) | |
158 | printf 'GCC44\n' | |
159 | ;; | |
160 | (4.5.*) | |
161 | printf 'GCC45\n' | |
162 | ;; | |
163 | (4.6.*) | |
164 | printf 'GCC46\n' | |
165 | ;; | |
166 | (4.7.*) | |
167 | printf 'GCC47\n' | |
168 | ;; | |
169 | (4.8.*) | |
170 | printf 'GCC48\n' | |
171 | ;; | |
172 | (4.9.*|6.[0-2].*) | |
173 | printf 'GCC49\n' | |
174 | ;; | |
175 | (*) | |
176 | printf 'GCC5\n' | |
177 | ;; | |
178 | esac | |
179 | ;; | |
180 | esac | |
181 | } | |
182 | ||
183 | ||
184 | # Determine the name of the environment variable that exposes the | |
185 | # cross-compiler prefix to the edk2 "build" utility. Print the result to the | |
186 | # standard output. | |
187 | # | |
188 | # Parameters: | |
189 | # $1: QEMU system emulation target | |
190 | qemu_edk2_get_cross_prefix_var() | |
191 | { | |
192 | local emulation_target="$1" | |
193 | local edk2_toolchain | |
194 | local edk2_arch | |
195 | ||
196 | if ! edk2_toolchain=$(qemu_edk2_get_toolchain "$emulation_target"); then | |
197 | return 1 | |
198 | fi | |
199 | ||
200 | case "$emulation_target" in | |
201 | (arm|aarch64) | |
202 | if ! edk2_arch=$(qemu_edk2_get_arch "$emulation_target"); then | |
203 | return 1 | |
204 | fi | |
205 | printf '%s_%s_PREFIX\n' "$edk2_toolchain" "$edk2_arch" | |
206 | ;; | |
207 | (i386|x86_64) | |
208 | printf '%s_BIN\n' "$edk2_toolchain" | |
209 | ;; | |
210 | esac | |
211 | } | |
212 | ||
213 | ||
214 | # Set and export the environment variable(s) necessary for cross-compilation, | |
215 | # whenever needed by the edk2 "build" utility. | |
216 | # | |
217 | # Parameters: | |
218 | # $1: QEMU system emulation target | |
219 | qemu_edk2_set_cross_env() | |
220 | { | |
221 | local emulation_target="$1" | |
222 | local cross_prefix | |
223 | local cross_prefix_var | |
224 | ||
225 | if ! cross_prefix=$(qemu_edk2_get_cross_prefix "$emulation_target"); then | |
226 | return 1 | |
227 | fi | |
228 | ||
229 | if [ -z "$cross_prefix" ]; then | |
230 | # Nothing to do. | |
231 | return 0 | |
232 | fi | |
233 | ||
234 | if ! cross_prefix_var=$(qemu_edk2_get_cross_prefix_var \ | |
235 | "$emulation_target"); then | |
236 | return 1 | |
237 | fi | |
238 | ||
239 | eval "export $cross_prefix_var=\$cross_prefix" | |
240 | } |