minecraft-pi-reborn/cmake/options/prebuilt-armhf-toolchain.cmake

88 lines
3.1 KiB
CMake
Raw Normal View History

2024-12-19 03:44:36 -05:00
# Target
set(target "arm-none-linux-gnueabihf")
2023-11-24 03:07:06 -05:00
# Pick Archive
2024-08-02 01:03:20 -04:00
set(toolchain_version "13.3.rel1")
2022-08-05 20:08:13 -04:00
execute_process(COMMAND uname -m OUTPUT_VARIABLE arch OUTPUT_STRIP_TRAILING_WHITESPACE)
if(arch STREQUAL "x86_64")
2024-12-19 03:44:36 -05:00
set(toolchain_file "arm-gnu-toolchain-${toolchain_version}-x86_64-${target}.tar.xz")
2022-08-05 20:08:13 -04:00
elseif(arch STREQUAL "aarch64" OR arch STREQUAL "armv8b" OR arch STREQUAL "armv8l")
2024-12-19 03:44:36 -05:00
set(toolchain_file "arm-gnu-toolchain-${toolchain_version}-aarch64-${target}.tar.xz")
2022-08-05 20:08:13 -04:00
else()
message(FATAL_ERROR "Unable To Download Prebuilt ARMHF Toolchain")
endif()
# Download If Needed
2022-08-09 18:38:48 -04:00
include(FetchContent)
2024-12-19 03:44:36 -05:00
FetchContent_Declare(prebuilt-armhf-toolchain
2024-01-20 02:10:18 -05:00
URL "${CMAKE_CURRENT_LIST_DIR}/../../archives/${toolchain_file}"
2022-08-09 18:38:48 -04:00
)
FetchContent_MakeAvailable(prebuilt-armhf-toolchain)
2022-08-10 17:21:38 -04:00
set(toolchain_dir "${prebuilt-armhf-toolchain_SOURCE_DIR}")
2022-08-09 18:38:48 -04:00
# Force Toolchain
file(WRITE "${toolchain_dir}/toolchain.cmake"
2024-12-19 03:44:36 -05:00
"set(CMAKE_C_COMPILER \"\${CMAKE_CURRENT_LIST_DIR}/bin/${target}-gcc\")\n"
"set(CMAKE_CXX_COMPILER \"\${CMAKE_CURRENT_LIST_DIR}/bin/${target}-g++\")\n"
2022-08-09 18:38:48 -04:00
"set(CMAKE_SYSTEM_NAME \"Linux\")\n"
"set(CMAKE_SYSTEM_PROCESSOR \"arm\")\n"
2022-09-23 17:55:38 -04:00
"set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\n"
2022-08-09 18:38:48 -04:00
)
2024-11-24 17:42:36 -05:00
force_set(MCPI_CMAKE_TOOLCHAIN_FILE "${toolchain_dir}/toolchain.cmake" FILEPATH)
2022-07-07 18:54:11 -04:00
# Build Sysroot
2022-08-10 17:21:38 -04:00
set(sysroot_dir "${CMAKE_CURRENT_BINARY_DIR}/bundled-armhf-sysroot")
2024-12-21 05:10:13 -05:00
set(sysroot_dir_debug "${sysroot_dir}/debug")
set(sysroot_dir_release "${sysroot_dir}/release")
2024-12-19 03:44:36 -05:00
if("${toolchain_dir}/bin/${target}-gcc" IS_NEWER_THAN "${sysroot_dir}")
2022-07-07 18:54:11 -04:00
# Create Directory
2022-08-09 18:38:48 -04:00
file(REMOVE_RECURSE "${sysroot_dir}")
2024-12-21 05:10:13 -05:00
file(MAKE_DIRECTORY "${sysroot_dir_debug}")
file(MAKE_DIRECTORY "${sysroot_dir_release}")
2022-07-07 18:54:11 -04:00
# Copy Files From Toolchain
file(
2024-12-19 03:44:36 -05:00
COPY "${toolchain_dir}/${target}/libc/"
2024-12-21 05:10:13 -05:00
DESTINATION "${sysroot_dir_debug}"
2022-07-07 18:54:11 -04:00
USE_SOURCE_PERMISSIONS
FILES_MATCHING
PATTERN "*.so*"
)
# Delete Unneeded Files
2024-12-21 05:10:13 -05:00
file(REMOVE_RECURSE "${sysroot_dir_debug}/usr/lib/audit")
file(REMOVE_RECURSE "${sysroot_dir_debug}/usr/lib/gconv")
2022-07-07 18:54:11 -04:00
# Strip Files
2024-12-21 05:10:13 -05:00
file(COPY "${sysroot_dir_debug}/." DESTINATION "${sysroot_dir_release}")
file(GLOB_RECURSE files LIST_DIRECTORIES FALSE "${sysroot_dir_release}/*")
foreach(file IN LISTS files)
execute_process(
COMMAND "${toolchain_dir}/bin/${target}-strip" "${file}"
RESULT_VARIABLE ret
ERROR_QUIET
)
# Delete Invalid Files
if(NOT ret EQUAL 0)
file(REMOVE "${file}")
endif()
endforeach()
2022-07-07 18:54:11 -04:00
endif()
# Install Sysroot (Skipping Empty Directories)
2024-12-21 05:10:13 -05:00
function(install_arm_sysroot_config config)
set(dir "${sysroot_dir_${config}}")
file(GLOB_RECURSE files LIST_DIRECTORIES FALSE RELATIVE "${dir}" "${dir}/*")
2024-01-16 01:45:52 -05:00
foreach(file IN LISTS files)
2024-11-15 15:26:33 -05:00
cmake_path(GET file PARENT_PATH parent)
2024-12-21 05:10:13 -05:00
install(
PROGRAMS "${dir}/${file}"
DESTINATION "${MCPI_INSTALL_DIR}/sysroot/${parent}"
CONFIGURATIONS "${config}"
)
2024-01-16 01:45:52 -05:00
endforeach()
endfunction()
2024-12-21 05:10:13 -05:00
function(install_arm_sysroot)
install_arm_sysroot_config(debug)
install_arm_sysroot_config(release)
endfunction()