-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathcreate-efi.sh
executable file
·403 lines (371 loc) · 12.8 KB
/
create-efi.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
#!/usr/bin/env bash
#
# Assemble OpenCore based EFI folder.
# Write safe shell scripts
set -euf -o pipefail
# Set locale
export LC_ALL="en_US.UTF-8"
# Directories
BASE_DIR="$(dirname "$(realpath "$0")")"
BASE_EFI_DIR="${BASE_DIR}/EFI"
BASE_OC_DIR="${BASE_EFI_DIR}/OC"
TMP_DIR="$(mktemp -d)"
readonly BASE_DIR BASE_EFI_DIR BASE_OC_DIR TMP_DIR
# Keep environment clean
trap 'run-on-trap $?' EXIT SIGHUP SIGINT SIGQUIT SIGPIPE SIGTERM
function run-on-trap() {
echo "Removing temporary directory '${TMP_DIR}'..."
rm -rf "${TMP_DIR}"
if [[ $1 -ne 0 ]]; then
echo "Removing EFI directory '${BASE_EFI_DIR}'..."
rm -fr "${BASE_EFI_DIR}"
fi
}
# Package versions. Set desired versions here.
readonly OPENCORE_VERSION="1.0.3"
readonly KEXT_APPLEALC_VERSION="1.9.3"
readonly KEXT_INTELMAUSI_VERSION="1.0.8"
readonly KEXT_LILU_VERSION="1.7.0"
readonly KEXT_VIRTUALSMC_VERSION="1.3.4"
readonly KEXT_WHATEVERGREEN_VERSION="1.6.9"
# Installation settings
# Any non-zero value turns on local file copy, instead of downloading.
readonly LOCAL_RUN=${LOCAL_RUN:-0}
# Use release or debug variant
readonly OC_PKG_VARIANT=${OC_PKG_VARIANT:-RELEASE}
# Download locations
#
# Packages
# Base URL
readonly OC_BASE_URL="https://github.com/acidanthera"
# Package names
readonly PKG_OC="OpenCore-${OPENCORE_VERSION}-${OC_PKG_VARIANT}"
readonly PKG_OC_BINDATA="master"
readonly PKG_KEXT_APPLEALC="AppleALC-${KEXT_APPLEALC_VERSION}-${OC_PKG_VARIANT}"
readonly PKG_KEXT_INTELMAUSI="IntelMausi-${KEXT_INTELMAUSI_VERSION}-${OC_PKG_VARIANT}"
readonly PKG_KEXT_LILU="Lilu-${KEXT_LILU_VERSION}-${OC_PKG_VARIANT}"
readonly PKG_KEXT_VIRTUALSMC="VirtualSMC-${KEXT_VIRTUALSMC_VERSION}-${OC_PKG_VARIANT}"
readonly PKG_KEXT_WHATEVERGREEN="WhateverGreen-${KEXT_WHATEVERGREEN_VERSION}-${OC_PKG_VARIANT}"
# Download package list
declare -ar PKG_DOWNLOAD_LIST=(
# OpenCore
"${OC_BASE_URL}/OpenCorePkg/releases/download/${OPENCORE_VERSION}/${PKG_OC}.zip"
# OpenCore binary data
"${OC_BASE_URL}/OcBinaryData/archive/${PKG_OC_BINDATA}.zip"
# Kext
"${OC_BASE_URL}/AppleALC/releases/download/${KEXT_APPLEALC_VERSION}/${PKG_KEXT_APPLEALC}.zip"
"${OC_BASE_URL}/IntelMausi/releases/download/${KEXT_INTELMAUSI_VERSION}/${PKG_KEXT_INTELMAUSI}.zip"
"${OC_BASE_URL}/Lilu/releases/download/${KEXT_LILU_VERSION}/${PKG_KEXT_LILU}.zip"
"${OC_BASE_URL}/VirtualSMC/releases/download/${KEXT_VIRTUALSMC_VERSION}/${PKG_KEXT_VIRTUALSMC}.zip"
"${OC_BASE_URL}/WhateverGreen/releases/download/${KEXT_WHATEVERGREEN_VERSION}/${PKG_KEXT_WHATEVERGREEN}.zip"
)
# Package list
declare -ar PKG_LIST=(
# OpenCore
"$PKG_OC"
"$PKG_OC_BINDATA"
# Kext
"$PKG_KEXT_APPLEALC"
"$PKG_KEXT_INTELMAUSI"
"$PKG_KEXT_LILU"
"$PKG_KEXT_VIRTUALSMC"
"$PKG_KEXT_WHATEVERGREEN"
)
# Configuration
#
# GitHub repository content base URL
GITHUB_HEAD_REF="${GITHUB_HEAD_REF:-master}" # https://docs.github.com/en/actions/learn-github-actions/environment-variables#default-environment-variables
GH_REPO_CONTENT_BASE_URL="https://raw.githubusercontent.com/vovinacci/OpenCore-ASUS-ROG-MAXIMUS-XI-HERO/${GITHUB_HEAD_REF}"
readonly GITHUB_HEAD_REF GH_REPO_CONTENT_BASE_URL
# ACPI SSDT
declare -ar ACPI_SSDT_DOWNLOAD_LIST=(
"${GH_REPO_CONTENT_BASE_URL}/assets/ACPI/SSDT-AWAC.aml"
"${GH_REPO_CONTENT_BASE_URL}/assets/ACPI/SSDT-EC-USBX.aml"
"${GH_REPO_CONTENT_BASE_URL}/assets/ACPI/SSDT-PLUG.aml"
"${GH_REPO_CONTENT_BASE_URL}/assets/ACPI/SSDT-PMC.aml"
)
# Additional Kexts
declare -Ar EXTRA_KEXTS_DOWNLOAD_LIST=(
[USBMap.kext]="${GH_REPO_CONTENT_BASE_URL}/Kexts/USBMap.kext/Contents/Info.plist"
)
# OpenCore configuration
readonly OC_CONFIG_PLIST="${GH_REPO_CONTENT_BASE_URL}/OC/config.plist"
# OpenCanopy theme background
# For the details see, https://github.com/vovinacci/OpenCore-ASUS-ROG-MAXIMUS-XI-HERO/tree/master/assets#opencanopy-background-images
readonly OC_THEME_BACKGROUND_URL="${GH_REPO_CONTENT_BASE_URL}/assets/Background.icns"
# Additional tools
declare -ar TOOLS_MEMTEST=(
"${GH_REPO_CONTENT_BASE_URL}/tools/memtest86/blacklist.cfg"
"${GH_REPO_CONTENT_BASE_URL}/tools/memtest86/BOOTX64.efi"
"${GH_REPO_CONTENT_BASE_URL}/tools/memtest86/mt86.png"
"${GH_REPO_CONTENT_BASE_URL}/tools/memtest86/unifont.bin"
)
## Functions
# Print error message to stderr and exit with code 1
# Arguments:
# Error message
function fail() {
(echo >&2 "[$(date +'%Y-%m-%dT%H:%M:%S%z')] [FATAL]: $*")
exit 1
}
# Perform sanity checks prior doing anything and print runtime information
# Globals:
# LOCAL_RUN
# OC_PKG_VARIANT
# Outputs:
# PATH
function __preflight_checks() {
# Check if Homebrew is installed
if [[ ! -x "$(command -v brew)" ]]; then
fail "Homebrew is not installed."
fi
# Check if OC_PKG_VARIANT is set correctly
[[ $OC_PKG_VARIANT =~ ^(DEBUG|RELEASE)$ ]] ||
fail "Unsupported OpenCore package variant \"${OC_PKG_VARIANT}\"." \
"OC_PKG_VARIANT should be set to \"DEBUG\" or \"RELEASE\"."
echo "OpenCore package variant: \"${OC_PKG_VARIANT}\"."
# Check if local run is preferred
if [[ $LOCAL_RUN != 0 ]]; then
echo "Local run: Don't download Kexts, tools and config.plist."
fi
}
# Download all ACPI SSDT to 'ACPI' directory in TMP_DIR
# Globals:
# ACPI_SSDT_DOWNLOAD_LIST
# TMP_DIR
function download_acpi_ssdt() {
echo "Downloading ACPI SSDTs..."
mkdir -p "${TMP_DIR}/ACPI"
for i in "${ACPI_SSDT_DOWNLOAD_LIST[@]}"; do
wget -nv -c -P "${TMP_DIR}/ACPI/" "$i"
done
}
# Download extra Kexts to 'Kexts' directory in TMP_DIR
# Globals:
# EXTRA_KEXTS_DOWNLOAD_LIST
# TMP_DIR
function download_extra_kexts() {
if [[ $LOCAL_RUN == 0 ]]; then
echo "Downloading extra Kexts..."
for k in "${!EXTRA_KEXTS_DOWNLOAD_LIST[@]}"; do
wget -nv -c --cut-dirs=5 -nH -P "${TMP_DIR}/Kexts/${k}" -r -np "${EXTRA_KEXTS_DOWNLOAD_LIST[$k]}"
done
else
echo "Copying extra Kexts..."
cp -rv "${BASE_DIR}/Kexts/" "${TMP_DIR}/"
fi
}
# Download OpenCore 'config.plist' to TMP_DIR
# Globals:
# BASE_DIR
# LOCAL_RUN
# OC_CONFIG_PLIST
# TMP_DIR
function download_oc_config() {
if [[ $LOCAL_RUN == 0 ]]; then
echo "Downloading config.plist..."
wget -nv -c -P "${TMP_DIR}/" "${OC_CONFIG_PLIST}"
else
echo "Copying config.plist..."
cp -v "${BASE_DIR}/OC/config.plist" "${TMP_DIR}/"
fi
}
# Download OpenCore theme background to TMP_DIR
# Globals:
# BASE_DIR
# LOCAL_RUN
# OC_THEME_BACKGROUND_URL
# TMP_DIR
function download_oc_theme_background() {
if [[ $LOCAL_RUN == 0 ]]; then
echo "Downloading theme background image..."
wget -nv -c -P "${TMP_DIR}/" "${OC_THEME_BACKGROUND_URL}"
else
echo "Copying theme background image..."
cp -v "${BASE_DIR}/assets/Background.icns" "${TMP_DIR}/"
fi
}
# Download all required packages to TMP_DIR
# Globals:
# PKG_DOWNLOAD_LIST
# TMP_DIR
function download_pkg() {
echo "Downloading packages..."
for i in "${PKG_DOWNLOAD_LIST[@]}"; do
wget -nv -c -P "${TMP_DIR}" "$i"
done
}
# Download tools to TMP_DIR
# Globals:
# BASE_DIR
# LOCAL_RUN
# TMP_DIR
# TOOLS_MEMTEST
function download_tools() {
if [[ $LOCAL_RUN == 0 ]]; then
echo "Downloading tools..."
mkdir -p "${TMP_DIR}/tools/memtest86"
for i in "${TOOLS_MEMTEST[@]}"; do
wget -nv -c -P "${TMP_DIR}/tools/memtest86" "$i"
done
wget -nv -c -P "${TMP_DIR}/" "${OC_CONFIG_PLIST}"
else
echo "Copying tools..."
cp -rv "${BASE_DIR}/tools" "${TMP_DIR}/"
fi
}
# Unarchive all downloaded packages in TMP_DIR and delete archives
# Globals:
# PKG_LIST
# TMP_DIR
function unarchive_pkg() {
echo "Unarchiving packages..."
pushd "${TMP_DIR}" >/dev/null || fail "Cannot 'pushd ${TMP_DIR}'"
for i in "${PKG_LIST[@]}"; do
unzip -q "${i}.zip" -d "${i}"
done
popd >/dev/null
}
# Create EFI directory structure
# Globals:
# BASE_EFI_DIR
# BASE_OC_DIR
function create_efi_dirs() {
echo "Deleting EFI directory..."
rm -rfv "${BASE_EFI_DIR}"
echo "Creating EFI directory structure..."
mkdir -pv "${BASE_EFI_DIR}"
mkdir -pv "${BASE_EFI_DIR}"/BOOT
mkdir -pv "${BASE_OC_DIR}"
mkdir -pv "${BASE_OC_DIR}"/{ACPI,Drivers,Kexts,Resources,Tools}
mkdir -pv "${BASE_OC_DIR}"/Resources/{Audio,Font,Image,Label}
}
# Copy OpenCore binaries to 'EFI' directory
# Globals:
# BASE_EFI_DIR
# BASE_OC_DIR
# PKG_OC
# TMP_DIR
function copy_oc_bin() {
echo "Copying OpenCore binaries to EFI directories..."
cp -v "${TMP_DIR}/${PKG_OC}/X64/EFI/BOOT/BOOTx64.efi" "${BASE_EFI_DIR}"/BOOT/
cp -v "${TMP_DIR}/${PKG_OC}/X64/EFI/OC/OpenCore.efi" "${BASE_OC_DIR}"/
cp -v "${TMP_DIR}/${PKG_OC}/X64/EFI/OC/Tools/"{OpenControl.efi,OpenShell.efi,ResetSystem.efi} "${BASE_OC_DIR}"/Tools/
}
# Copy OpenCore configuration template to 'EFI' directory
# Globals:
# BASE_OC_DIR
# TMP_DIR
function copy_oc_config() {
echo "Copying OpenCore configuration template..."
cp -v "${TMP_DIR}/config.plist" "${BASE_OC_DIR}"/
}
# Copy 'ocvalidate' utility to 'util' if running locally
# Globals:
# BASE_DIR
# LOCAL_RUN
# TMP_DIR
function copy_ocvalidate() {
if [[ $LOCAL_RUN != 0 ]]; then
echo "Local run: Copy OpenCore configuration validation utility (ocvalidate)..."
cp -v "${TMP_DIR}/${PKG_OC}/Utilities/ocvalidate/ocvalidate" "${BASE_DIR}/util/"
fi
}
# Copy ACPI SSDT to 'EFI/ACPI' directory
# Globals:
# BASE_OC_DIR
# TMP_DIR
function copy_acpi_ssdt() {
echo "Copying ACPI SSTDs to EFI/ACPI directory..."
cp -rv "${TMP_DIR}/ACPI"/{SSDT-AWAC.aml,SSDT-EC-USBX.aml,SSDT-PLUG.aml,SSDT-PMC.aml} "${BASE_OC_DIR}"/ACPI
}
# Copy OpenCore drivers to 'EFI/Drivers' directory
# Globals:
# BASE_OC_DIR
# PKG_OC
# PKG_OC_BINDATA
# TMP_DIR
function copy_oc_drivers() {
echo "Copying OpenCore drivers to EFI/Drivers directory..."
cp -v "${TMP_DIR}/${PKG_OC}/X64/EFI/OC/Drivers/"{FirmwareSettingsEntry.efi,OpenCanopy.efi,OpenRuntime.efi,ResetNvramEntry.efi,ToggleSipEntry.efi} \
"${BASE_OC_DIR}"/Drivers/
cp -v "${TMP_DIR}/${PKG_OC_BINDATA}/OcBinaryData-master/Drivers/HfsPlus.efi" "${BASE_OC_DIR}"/Drivers/
}
# Copy Kexts to EFI directory
# Globals:
# BASE_OC_DIR
# PKG_KEXT_APPLEALC
# PKG_KEXT_INTELMAUSI
# PKG_KEXT_LILU
# PKG_KEXT_VIRTUALSMC
# PKG_KEXT_WHATEVERGREEN
# TMP_DIR
function copy_kexts() {
echo "Copying Kexts to EFI/Kexts directory..."
cp -vr "${TMP_DIR}/Kexts" "${BASE_OC_DIR}"/
cp -vr "${TMP_DIR}/${PKG_KEXT_APPLEALC}"/AppleALC.kext "${BASE_OC_DIR}"/Kexts/
cp -vr "${TMP_DIR}/${PKG_KEXT_INTELMAUSI}"/IntelMausi.kext "${BASE_OC_DIR}"/Kexts/
cp -vr "${TMP_DIR}/${PKG_KEXT_LILU}"/Lilu.kext "${BASE_OC_DIR}"/Kexts/
cp -vr "${TMP_DIR}/${PKG_KEXT_VIRTUALSMC}"/Kexts/{SMCProcessor.kext,SMCSuperIO.kext,VirtualSMC.kext} "${BASE_OC_DIR}"/Kexts/
cp -vr "${TMP_DIR}/${PKG_KEXT_WHATEVERGREEN}"/WhateverGreen.kext "${BASE_OC_DIR}"/Kexts/
}
# Copy OpenCore resource files to 'EFI/Resources/{Audio,Font,Image,Label}' directories
# Globals:
# BASE_OC_DIR
# PKG_OC_BINDATA
# TMP_DIR
function copy_oc_resources() {
echo "Copying OpenCore resource files to EFI/Resources directories..."
# Enable globbing for file copy
set +f
# Copy files
cp -v "${TMP_DIR}/${PKG_OC_BINDATA}/OcBinaryData-master/Resources/Audio/"{AXEFIAudio_Beep.mp3,AXEFIAudio_Click.mp3,AXEFIAudio_VoiceOver_Boot.mp3} \
"${BASE_OC_DIR}"/Resources/Audio/
cp -v "${TMP_DIR}/${PKG_OC_BINDATA}/OcBinaryData-master/Resources/Audio/OCEFIAudio_VoiceOver_Boot.mp3" "${BASE_OC_DIR}"/Resources/Audio/
cp -v "${TMP_DIR}/${PKG_OC_BINDATA}/OcBinaryData-master/Resources/Audio/"AXEFIAudio_en_*.mp3 "${BASE_OC_DIR}"/Resources/Audio/
cp -v "${TMP_DIR}/${PKG_OC_BINDATA}/OcBinaryData-master/Resources/Audio/"OCEFIAudio_en_*.mp3 "${BASE_OC_DIR}"/Resources/Audio/
cp -v "${TMP_DIR}/${PKG_OC_BINDATA}/OcBinaryData-master/Resources/Font/"* "${BASE_OC_DIR}"/Resources/Font/
cp -vr "${TMP_DIR}/${PKG_OC_BINDATA}/OcBinaryData-master/Resources/Image/"* "${BASE_OC_DIR}"/Resources/Image/
cp -v "${TMP_DIR}/${PKG_OC_BINDATA}/OcBinaryData-master/Resources/Label/"* "${BASE_OC_DIR}"/Resources/Label/
# Disable globbing back
set -f
}
# Copy OpenCore theme background to 'EFI/Resources/Image/Acidanthera/GoldenGate' directory
# Globals:
# BASE_OC_DIR
function copy_oc_theme_background() {
echo "Copying OpenCore theme to EFI/Resources/Image/Acidanthera/GoldenGate' directory..."
cp -v "${TMP_DIR}/Background.icns" "${BASE_OC_DIR}"/Resources/Image/Acidanthera/GoldenGate/
}
# Copy tools to 'EFI/OC/Tools' directory
function copy_tools() {
echo "Copying tools to EFI/Tools directory..."
cp -rv "${TMP_DIR}/tools/memtest86" "${BASE_OC_DIR}"/Tools/
}
## Start the ball
__preflight_checks
# Extend PATH to always use Coreutils and Homebrew supplied utilities first instead of BSD ones.
PATH="$(brew --prefix)/opt/coreutils/libexec/gnubin:/usr/local/bin:/usr/local/sbin:${PATH}"
export PATH
## Main section
# Download all required data
download_acpi_ssdt
download_extra_kexts
download_oc_config
download_oc_theme_background
download_pkg
download_tools
unarchive_pkg
copy_ocvalidate
# Create folders
create_efi_dirs
# Copy data
copy_oc_bin
copy_oc_config
copy_acpi_ssdt
copy_oc_drivers
copy_kexts
copy_oc_resources
copy_oc_theme_background
copy_tools
# EOF