93 lines
4.2 KiB
CMake
93 lines
4.2 KiB
CMake
#
|
|
# Singe 3
|
|
# Copyright (C) 2006-2026 Scott Duensing <scott@kangaroopunch.com>
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public Licens
|
|
# as published by the Free Software Foundation; either version 3
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
# 02110-1301, USA.
|
|
#
|
|
# Raspberry Pi (64-bit Raspberry Pi OS) with zig as the compiler. zig supplies glibc pinned to the
|
|
# version below plus the kernel headers; the platform libraries Singe, SDL3 and FFmpeg build against
|
|
# (libdrm, ALSA, X11, GBM/EGL/GLES, udev, ...) come from the Debian packages listed in
|
|
# arm64Packages.cmake, downloaded and unpacked into a sysroot under .builddir/toolchains on first use.
|
|
# Nothing outside the source tree is touched; dpkg-deb from the host does the unpacking.
|
|
|
|
include(${CMAKE_CURRENT_LIST_DIR}/zig.cmake)
|
|
include(${CMAKE_CURRENT_LIST_DIR}/arm64Packages.cmake)
|
|
|
|
set(CMAKE_SYSTEM_NAME Linux)
|
|
set(CMAKE_SYSTEM_PROCESSOR aarch64)
|
|
|
|
# Raspberry Pi OS bullseye shipped glibc 2.31; a binary built against it runs there and on everything since.
|
|
set(SINGE_GLIBC_VERSION 2.31)
|
|
|
|
get_filename_component(armToolchains ${CMAKE_CURRENT_LIST_DIR}/../../.builddir/toolchains ABSOLUTE)
|
|
set(SINGE_SYSROOT ${armToolchains}/sysroot-aarch64-linux-gnu CACHE PATH "ARM64 platform headers and libraries" FORCE)
|
|
set(armDebs ${armToolchains}/debs-aarch64-linux-gnu)
|
|
set(armStamp ${SINGE_SYSROOT}/.complete)
|
|
|
|
# The stamp holds the manifest that built the sysroot; a changed manifest rebuilds it.
|
|
string(SHA256 arm64Manifest "${arm64Packages}")
|
|
set(piHave "")
|
|
if(EXISTS ${armStamp})
|
|
file(READ ${armStamp} piHave)
|
|
string(STRIP "${piHave}" piHave)
|
|
endif()
|
|
if(NOT piHave STREQUAL arm64Manifest)
|
|
find_program(SINGE_DPKG_DEB dpkg-deb)
|
|
if(NOT SINGE_DPKG_DEB)
|
|
message(FATAL_ERROR "dpkg-deb is needed to unpack the Pi sysroot packages (apt-get install dpkg).")
|
|
endif()
|
|
message(STATUS "Building the ARM64 sysroot in ${SINGE_SYSROOT}")
|
|
file(REMOVE_RECURSE ${SINGE_SYSROOT})
|
|
file(MAKE_DIRECTORY ${SINGE_SYSROOT} ${armDebs})
|
|
foreach(entry IN LISTS arm64Packages)
|
|
string(REGEX MATCH "^([^|]*)\\|(.*)$" unused "${entry}")
|
|
set(url ${CMAKE_MATCH_1})
|
|
set(sha ${CMAKE_MATCH_2})
|
|
get_filename_component(deb ${url} NAME)
|
|
set(debPath ${armDebs}/${deb})
|
|
if(NOT EXISTS ${debPath})
|
|
message(STATUS "Downloading ${deb}")
|
|
file(DOWNLOAD ${url} ${debPath} EXPECTED_HASH SHA256=${sha} STATUS status)
|
|
list(GET status 0 code)
|
|
if(NOT code EQUAL 0)
|
|
file(REMOVE ${debPath})
|
|
message(FATAL_ERROR "Download of ${url} failed: ${status}")
|
|
endif()
|
|
endif()
|
|
execute_process(COMMAND ${SINGE_DPKG_DEB} -x ${debPath} ${SINGE_SYSROOT} RESULT_VARIABLE code)
|
|
if(NOT code EQUAL 0)
|
|
message(FATAL_ERROR "Unpacking ${deb} failed.")
|
|
endif()
|
|
endforeach()
|
|
file(WRITE ${armStamp} "${arm64Manifest}\n")
|
|
endif()
|
|
|
|
# The sysroot's headers come after zig's own; its libraries are linked by name and left unresolved
|
|
# at link time (they are only stubs for what the Pi provides at run time).
|
|
set(armLibs ${SINGE_SYSROOT}/usr/lib/aarch64-linux-gnu)
|
|
singeZigToolchain(aarch64-linux-gnu.${SINGE_GLIBC_VERSION} "-idirafter ${SINGE_SYSROOT}/usr/include/aarch64-linux-gnu -idirafter ${SINGE_SYSROOT}/usr/include -L${armLibs} -L${SINGE_SYSROOT}/lib/aarch64-linux-gnu -Wl,--allow-shlib-undefined")
|
|
|
|
# find_package and pkg-config look only in the sysroot; programs come from the host.
|
|
set(CMAKE_FIND_ROOT_PATH ${SINGE_SYSROOT})
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
|
|
set(CMAKE_LIBRARY_ARCHITECTURE aarch64-linux-gnu CACHE STRING "" FORCE)
|
|
set(CMAKE_C_LIBRARY_ARCHITECTURE aarch64-linux-gnu CACHE STRING "" FORCE)
|
|
set(CMAKE_LIBRARY_PATH ${armLibs} CACHE PATH "" FORCE)
|
|
set(KANGAROO_OS linux)
|
|
set(KANGAROO_ARCH aarch64)
|