mirror of
https://github.com/acidanthera/OpenCorePkg.git
synced 2025-12-08 19:25:01 +00:00
Updates build script according recent changes in efibuild. We need to specify OpenCorePkg to be removed while build because currently this package is present as submodule in audk and conflicts
170 lines
4.7 KiB
Bash
Executable File
170 lines
4.7 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
imgbuild() {
|
|
local arch="$1"
|
|
|
|
echo "Erasing older files..."
|
|
rm -f "${BUILD_DIR}/FV/DUETEFIMAINFV${arch}.z" \
|
|
"${BUILD_DIR}/FV/DxeMain${arch}.z" \
|
|
"${BUILD_DIR}/FV/DxeIpl${arch}.z" \
|
|
"${BUILD_DIR_ARCH}/EfiLoaderRebased.efi" \
|
|
"${BUILD_DIR}/FV/Efildr${arch}" \
|
|
"${BUILD_DIR}/FV/Efildr${arch}Pure" \
|
|
"${BUILD_DIR}/FV/Efildr${arch}Out" \
|
|
"${BUILD_DIR_ARCH}/boot"
|
|
|
|
echo "Compressing DUETEFIMainFv.FV..."
|
|
LzmaCompress -e -o "${BUILD_DIR}/FV/DUETEFIMAINFV${arch}.z" \
|
|
"${BUILD_DIR}/FV/DUETEFIMAINFV${arch}.Fv" || exit 1
|
|
|
|
echo "Compressing DxeCore.efi..."
|
|
LzmaCompress -e -o "${BUILD_DIR}/FV/DxeMain${arch}.z" \
|
|
"${BUILD_DIR_ARCH}/DxeCore.efi" || exit 1
|
|
|
|
echo "Compressing DxeIpl.efi..."
|
|
LzmaCompress -e -o "${BUILD_DIR}/FV/DxeIpl${arch}.z" \
|
|
"$BUILD_DIR_ARCH/DxeIpl.efi" || exit 1
|
|
|
|
echo "Generating Loader Image..."
|
|
|
|
ImageTool "${arch}" Rebase 0x10000 "${BUILD_DIR_ARCH}/EfiLoader.efi" "${BUILD_DIR_ARCH}/EfiLoaderRebased.efi" || exit 1
|
|
|
|
"${FV_TOOLS}/EfiLdrImage" -o "${BUILD_DIR}/FV/Efildr${arch}" \
|
|
"${BUILD_DIR_ARCH}/EfiLoaderRebased.efi" "${BUILD_DIR}/FV/DxeIpl${arch}.z" \
|
|
"${BUILD_DIR}/FV/DxeMain${arch}.z" "${BUILD_DIR}/FV/DUETEFIMAINFV${arch}.z" || exit 1
|
|
|
|
# Calculate page table location for 64-bit builds.
|
|
# Page table must be 4K aligned, bootsectors are 4K each, and 0x20000 is base address.
|
|
if [ "${arch}" = "X64" ]; then
|
|
if [ "$(uname)" = "Darwin" ]; then
|
|
EL_SIZE=$(stat -f "%z" "${BUILD_DIR}/FV/Efildr${arch}")
|
|
else
|
|
EL_SIZE=$(stat --printf="%s\n" "${BUILD_DIR}/FV/Efildr${arch}")
|
|
fi
|
|
PAGE_TABLE_OFF=$( printf "0x%x" $(( (EL_SIZE + 0x2000 + 0xFFF) & ~0xFFF )) )
|
|
PAGE_TABLE=$( printf "0x%x" $(( PAGE_TABLE_OFF + 0x20000 )) )
|
|
|
|
export PAGE_TABLE_OFF
|
|
export PAGE_TABLE
|
|
|
|
BOOTSECTOR_SUFFIX="_${PAGE_TABLE}"
|
|
else
|
|
BOOTSECTOR_SUFFIX=""
|
|
fi
|
|
|
|
# Build bootsectors.
|
|
mkdir -p "${BOOTSECTORS}" || exit 1
|
|
cd "${BOOTSECTORS}"/.. || exit 1
|
|
make || exit 1
|
|
cd - || exit 1
|
|
|
|
# Concatenate bootsector into the resulting image.
|
|
cat "${BOOTSECTORS}/Start${arch}${BOOTSECTOR_SUFFIX}.com" "${BOOTSECTORS}/Efi${arch}.com" \
|
|
"${BUILD_DIR}/FV/Efildr${arch}" > "${BUILD_DIR}/FV/Efildr${arch}Pure" || exit 1
|
|
|
|
# Append page table and skip empty data in 64-bit mode.
|
|
if [ "${arch}" = "X64" ]; then
|
|
"${FV_TOOLS}/GenPage" "${BUILD_DIR}/FV/Efildr${arch}Pure" \
|
|
-b "${PAGE_TABLE}" -f "${PAGE_TABLE_OFF}" \
|
|
-o "${BUILD_DIR}/FV/Efildr${arch}Out" || exit 1
|
|
|
|
dd if="${BUILD_DIR}/FV/Efildr${arch}Out" of="${BUILD_DIR_ARCH}/boot" bs=512 skip=1 || exit 1
|
|
else
|
|
cp "${BUILD_DIR}/FV/Efildr${arch}Pure" "${BUILD_DIR_ARCH}/boot" || exit 1
|
|
fi
|
|
}
|
|
|
|
package() {
|
|
if [ ! -d "$1" ]; then
|
|
echo "Missing package directory $1 at $(pwd)"
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -d "$1"/../FV ]; then
|
|
echo "Missing FV directory $1/../FV at $(pwd)"
|
|
exit 1
|
|
fi
|
|
|
|
pushd "$1" || exit 1
|
|
|
|
# Switch to parent directory.
|
|
pushd .. || exit 1
|
|
BUILD_DIR=$(pwd)
|
|
|
|
for arch in "${ARCHS[@]}"; do
|
|
pushd "${arch}" || exit 1
|
|
BUILD_DIR_ARCH=$(pwd)
|
|
imgbuild "${arch}"
|
|
popd || exit 1
|
|
done
|
|
|
|
popd || exit 1
|
|
popd || exit 1
|
|
}
|
|
|
|
cd "$(dirname "$0")" || exit 1
|
|
|
|
BOOTSECTORS="$(pwd)/Legacy/BootSector/bin"
|
|
UNAME="$(uname)"
|
|
if [ "$(echo "${UNAME}" | grep MINGW)" != "" ] || [ "$(echo "${UNAME}" | grep MSYS)" != "" ]; then
|
|
UNAME="Windows"
|
|
fi
|
|
|
|
FV_TOOLS_BUILDDIR="$(pwd)/Utilities/BaseTools"
|
|
FV_TOOLS="$(pwd)/Utilities/BaseTools/bin.${UNAME}"
|
|
|
|
echo "Compiling BaseTools for your platform..."
|
|
if [ "$UNAME" != "Windows" ]; then
|
|
make -C "$FV_TOOLS_BUILDDIR" || exit 1
|
|
else
|
|
CC=gcc DIST=Windows make -C "$FV_TOOLS_BUILDDIR" || exit 1
|
|
fi
|
|
|
|
if [ ! -d "${FV_TOOLS}" ]; then
|
|
echo "ERROR: Something goes wrong while compiling BaseTools for your platform!"
|
|
exit 1
|
|
fi
|
|
|
|
if [ "${INTREE}" != "" ]; then
|
|
# In-tree compilation is merely for packing.
|
|
cd .. || exit 1
|
|
|
|
if [ "${TARGETARCH}" = "" ]; then
|
|
TARGETARCH="X64"
|
|
fi
|
|
|
|
if [ "${TARGET}" = "" ]; then
|
|
TARGET="RELEASE"
|
|
fi
|
|
|
|
if [ "${TARGETCHAIN}" = "" ]; then
|
|
TARGETCHAIN="XCODE5"
|
|
fi
|
|
|
|
build -a "${TARGETARCH}" -b "${TARGET}" -t "${TARGETCHAIN}" -p OpenCorePkg/OpenDuetPkg.dsc || exit 1
|
|
BUILD_DIR="${WORKSPACE}/Build/OpenDuetPkg/${TARGET}_${TARGETCHAIN}"
|
|
BUILD_DIR_ARCH="${BUILD_DIR}/${TARGETARCH}"
|
|
imgbuild "${TARGETARCH}"
|
|
else
|
|
if [ "$TARGETS" = "" ]; then
|
|
TARGETS=(DEBUG RELEASE)
|
|
export TARGETS
|
|
fi
|
|
if [ "$ARCHS" = "" ]; then
|
|
ARCHS=(X64 IA32)
|
|
export ARCHS
|
|
fi
|
|
|
|
DISCARD_PACKAGES=OpenCorePkg
|
|
SELFPKG_DIR="OpenCorePkg"
|
|
SELFPKG=OpenDuetPkg
|
|
NO_ARCHIVES=1
|
|
|
|
export DISCARD_PACKAGES
|
|
export SELFPKG_DIR
|
|
export SELFPKG
|
|
export NO_ARCHIVES
|
|
|
|
src=$(curl -Lfs https://raw.githubusercontent.com/acidanthera/ocbuild/master/efibuild.sh) && eval "$src" || exit 1
|
|
fi
|