From 80b6c1a4f39961deffde903e5b8eb9434f7e3706 Mon Sep 17 00:00:00 2001 From: Duncan Ogilvie Date: Mon, 11 Nov 2024 23:37:12 +0100 Subject: [PATCH] Add basic UEFI support --- cmake/Platform/UEFI.cmake | 13 +++++++++++++ cmake/zig-toolchain-uefi64.cmake | 2 ++ cmake/zig-toolchain.cmake | 7 +++++++ 3 files changed, 22 insertions(+) create mode 100644 cmake/Platform/UEFI.cmake create mode 100644 cmake/zig-toolchain-uefi64.cmake diff --git a/cmake/Platform/UEFI.cmake b/cmake/Platform/UEFI.cmake new file mode 100644 index 0000000..c1359bd --- /dev/null +++ b/cmake/Platform/UEFI.cmake @@ -0,0 +1,13 @@ +# References: +# - https://gitlab.kitware.com/cmake/cmake/-/merge_requests/6630 +# - https://gitlab.kitware.com/cmake/cmake/-/issues/16538 +# - https://kubasejdak.com/how-to-cross-compile-for-embedded-with-cmake-like-a-champ + +include(Platform/Generic) + +set(CMAKE_EXECUTABLE_SUFFIX ".efi") +set(CMAKE_SHARED_LIBRARY_SUFFIX ".efi") +set(CMAKE_SHARED_LIBRARY_PREFIX "") + +# UEFI APIs might expect 16-bit wchar_t +add_compile_options(-fshort-wchar) diff --git a/cmake/zig-toolchain-uefi64.cmake b/cmake/zig-toolchain-uefi64.cmake new file mode 100644 index 0000000..a60a3e1 --- /dev/null +++ b/cmake/zig-toolchain-uefi64.cmake @@ -0,0 +1,2 @@ +set(ZIG_TARGET "x86_64-uefi-gnu") +include(${CMAKE_CURRENT_LIST_DIR}/zig-toolchain.cmake) diff --git a/cmake/zig-toolchain.cmake b/cmake/zig-toolchain.cmake index 1304ae1..c7ad918 100644 --- a/cmake/zig-toolchain.cmake +++ b/cmake/zig-toolchain.cmake @@ -20,6 +20,10 @@ elseif(ZIG_OS STREQUAL "macos") set(CMAKE_SYSTEM_NAME "Darwin") elseif(ZIG_OS STREQUAL "freestanding") set(CMAKE_SYSTEM_NAME "Generic") +elseif(ZIG_OS STREQUAL "uefi") + set(CMAKE_SYSTEM_NAME "UEFI") + # Fix compiler detection (lld-link: error: : undefined symbol: EfiMain) + set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) else() # NOTE: If this happens, add a new case with one of the following system names: # https://cmake.org/cmake/help/latest/variable/CMAKE_SYSTEM_NAME.html#system-names-known-to-cmake @@ -42,3 +46,6 @@ endif() set(CMAKE_AR "${CMAKE_CURRENT_LIST_DIR}/zig-ar${SCRIPT_SUFFIX}") set(CMAKE_RANLIB "${CMAKE_CURRENT_LIST_DIR}/zig-ranlib${SCRIPT_SUFFIX}") set(CMAKE_RC_COMPILER "${CMAKE_CURRENT_LIST_DIR}/zig-rc${SCRIPT_SUFFIX}") + +# Add custom UEFI platform to module path +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")