minecraft-pi-reborn/CMakeLists.txt

213 lines
6.1 KiB
CMake
Raw Normal View History

2024-12-22 03:34:31 -05:00
cmake_minimum_required(VERSION 3.25.0)
2021-06-17 17:32:24 -04:00
2022-09-25 20:56:45 -04:00
# Avoid Warning About DOWNLOAD_EXTRACT_TIMESTAMP
2024-11-15 15:26:33 -05:00
cmake_policy(SET CMP0135 NEW)
2022-09-25 20:56:45 -04:00
2024-01-16 01:45:52 -05:00
# Core Options
2024-01-20 02:10:18 -05:00
include(cmake/options/core-options.cmake)
2022-07-07 00:37:53 -04:00
2024-12-22 03:34:31 -05:00
# Utility Functions
include(cmake/util/util.cmake)
2022-03-11 00:00:13 -05:00
# Build Mode
2024-12-22 03:34:31 -05:00
get_property(IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(IS_MULTI_CONFIG)
force_set(CMAKE_CONFIGURATION_TYPES "Release;Debug" STRING)
set(FORCE_BUILD_TYPE "")
elseif(NOT DEFINED CMAKE_BUILD_TYPE)
set(FORCE_BUILD_TYPE "Release")
endif()
if(DEFINED FORCE_BUILD_TYPE)
force_set(CMAKE_BUILD_TYPE "${FORCE_BUILD_TYPE}" STRING)
2021-06-17 17:32:24 -04:00
endif()
# Start Project
project(minecraft-pi-reborn)
# Sanity Checks
2023-11-09 18:41:10 -05:00
string(CONCAT ARM_SANITY_CHECK
2024-01-16 01:45:52 -05:00
"include(CheckSymbolExists)\n"
2024-12-19 03:44:36 -05:00
"check_symbol_exists(\"__arm__\" \"\" IS_ARM_TARGETING)\n"
2023-11-09 18:41:10 -05:00
)
if(BUILD_ARM_COMPONENTS)
2024-12-19 03:44:36 -05:00
string(APPEND ARM_SANITY_CHECK
2023-11-09 18:41:10 -05:00
"if(NOT IS_ARM_TARGETING)\n"
" message(FATAL_ERROR \"ARM-Targeting Compiler Required\")\n"
2024-12-19 03:44:36 -05:00
"endif()\n"
2023-11-09 18:41:10 -05:00
)
2022-08-05 20:08:13 -04:00
endif()
2023-11-09 18:41:10 -05:00
cmake_language(EVAL CODE "${ARM_SANITY_CHECK}")
2021-12-17 18:19:23 -05:00
2024-01-16 01:45:52 -05:00
# Extra Options
2024-01-20 02:10:18 -05:00
include(cmake/options/extra-options.cmake)
2024-01-16 01:45:52 -05:00
2024-01-20 02:10:18 -05:00
# Paths
include(cmake/options/paths.cmake)
2021-06-17 17:32:24 -04:00
2022-08-01 19:56:35 -04:00
# Required Compile Flags
2024-12-21 05:10:13 -05:00
set(RELEASE_MODE_GENERATOR "\$<CONFIG:Release>")
2022-08-01 19:56:35 -04:00
string(CONCAT COMPILE_FLAGS_SETUP
# Optimizations
2024-12-21 05:10:13 -05:00
"add_compile_options(\"\$<IF:${RELEASE_MODE_GENERATOR},-O3,-g>\")\n"
"add_link_options(\"\$<${RELEASE_MODE_GENERATOR}:-s>\")\n"
2022-08-01 19:56:35 -04:00
# PIC
"set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)\n"
# Warnings
"add_link_options(-Wl,--no-undefined)\n"
# C Standard
"add_definitions(-D_GNU_SOURCE)\n"
"set(CMAKE_C_STANDARD 99)\n"
2024-07-14 05:06:27 -04:00
"set(CMAKE_CXX_STANDARD 20)\n"
2022-08-01 19:56:35 -04:00
# Skip RPath
2024-11-22 22:02:55 -05:00
"set(CMAKE_SKIP_BUILD_RPATH TRUE)\n"
# Always Build Shared Libraries
2024-12-19 03:44:36 -05:00
"set(BUILD_SHARED_LIBS TRUE CACHE BOOL \"\" FORCE)\n"
2022-08-01 19:56:35 -04:00
)
2024-11-17 22:48:25 -05:00
if(BUILD_ARM_COMPONENTS)
2024-12-19 03:44:36 -05:00
string(APPEND COMPILE_FLAGS_SETUP
2024-11-17 22:48:25 -05:00
# Disable C++11 String ABI
2024-12-19 03:44:36 -05:00
"add_compile_definitions(_GLIBCXX_USE_CXX11_ABI=0)\n"
2024-11-17 22:48:25 -05:00
)
endif()
2022-08-01 19:56:35 -04:00
cmake_language(EVAL CODE "${COMPILE_FLAGS_SETUP}")
2022-03-11 00:00:13 -05:00
2025-01-03 15:03:30 -05:00
# Build Dependencies
add_subdirectory(dependencies)
2022-08-03 13:08:20 -04:00
# Fast Math
add_compile_options(-ffast-math)
# Warnings
add_compile_options(-Wall -Wextra -Werror -Wpointer-arith -Wshadow -Wnull-dereference)
2024-01-23 18:20:14 -05:00
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
2022-08-03 13:08:20 -04:00
# Prevents False Positives
if(CMAKE_C_COMPILER_VERSION VERSION_GREATER 10.0)
add_compile_options(-Wno-stringop-overflow)
endif()
if(CMAKE_C_COMPILER_VERSION VERSION_GREATER 11.0)
add_compile_options(-Wno-array-bounds -Wno-stringop-overread)
endif()
endif()
2021-06-17 17:32:24 -04:00
# Build libreborn
add_subdirectory(libreborn)
# Build Media Layer
add_subdirectory(media-layer)
# Build Launcher
if(BUILD_NATIVE_COMPONENTS)
add_subdirectory(launcher)
endif()
2021-09-11 23:18:12 -04:00
# Include Symbols
if(BUILD_ARM_COMPONENTS)
add_subdirectory(symbols)
endif()
2021-06-17 17:32:24 -04:00
# Build Mods
if(BUILD_ARM_COMPONENTS)
add_subdirectory(mods)
endif()
2022-04-22 19:38:15 -04:00
# Include Images
if(BUILD_NATIVE_COMPONENTS)
add_subdirectory(images)
endif()
2022-06-25 17:30:08 -04:00
2024-01-16 01:45:52 -05:00
# Install Prebuilt ARMHF Toolchain Sysroot
2024-05-09 01:38:57 -04:00
if(BUILD_NATIVE_COMPONENTS AND MCPI_USE_PREBUILT_ARMHF_TOOLCHAIN)
2024-01-16 01:45:52 -05:00
install_arm_sysroot()
endif()
2022-06-25 17:30:08 -04:00
# Install SDK
if(BUILD_ARM_COMPONENTS)
2024-11-22 22:02:55 -05:00
install(EXPORT sdk DESTINATION "${MCPI_SDK_DIR}" FILE "sdk-targets.cmake")
2022-08-09 18:38:48 -04:00
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/sdk.cmake"
2024-11-17 22:48:25 -05:00
# Sanity Check
2024-12-19 03:44:36 -05:00
"${ARM_SANITY_CHECK}"
2022-08-01 19:56:35 -04:00
# Compile Flags
2024-12-19 03:44:36 -05:00
"${COMPILE_FLAGS_SETUP}"
2022-08-01 19:56:35 -04:00
# Log
"message(STATUS \"Using Reborn SDK v${MCPI_VERSION}\")\n"
# Include Targets
"include(\"\${CMAKE_CURRENT_LIST_DIR}/sdk-targets.cmake\")\n"
)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sdk.cmake" DESTINATION "${MCPI_SDK_DIR}")
2024-12-19 03:44:36 -05:00
# Calculate Hash Of SDK
string(CONCAT SDK_HASH_SCRIPT
# Prepare
"set(dir \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${MCPI_SDK_DIR}\")\n"
"set(out \"\${dir}/.hash\")\n"
# Calculate Hashes
"set(content \"\")\n"
"file(GLOB_RECURSE files LIST_DIRECTORIES FALSE \"\${dir}/*\")\n"
"foreach(file IN LISTS files)\n"
" file(SHA256 \"\${file}\" hash)\n"
" cmake_path(RELATIVE_PATH file BASE_DIRECTORY \"\${dir}\")\n"
" string(APPEND content \"\${hash} \${file}\\n\")\n"
"endforeach()\n"
# Write File
"file(WRITE \"\${out}\" \"\${content}\")\n"
)
install(CODE "${SDK_HASH_SCRIPT}")
2022-06-25 17:30:08 -04:00
endif()
2024-01-20 02:10:18 -05:00
# Packaging
if(BUILD_NATIVE_COMPONENTS)
include(cmake/cpack/packaging.cmake)
endif()
# Superbuild
if(BUILD_NATIVE_COMPONENTS)
include(ExternalProject)
# Arguments
set(ARM_OPTIONS "${MCPI_OPTIONS}")
list(APPEND ARM_OPTIONS "-DMCPI_BUILD_MODE:STRING=arm")
list(APPEND ARM_OPTIONS "-DCMAKE_INSTALL_MESSAGE:STRING=NEVER")
2024-05-10 18:58:39 -04:00
list(APPEND ARM_OPTIONS "-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>")
2024-01-20 02:10:18 -05:00
if(NOT MCPI_USE_PREBUILT_ARMHF_TOOLCHAIN)
if(DEFINED CMAKE_TOOLCHAIN_FILE)
2024-12-21 04:46:31 -05:00
set(ARM_TOOLCHAIN "${CMAKE_TOOLCHAIN_FILE}")
2024-01-20 02:10:18 -05:00
endif()
else()
2024-12-21 04:46:31 -05:00
set(ARM_TOOLCHAIN "${MCPI_CMAKE_TOOLCHAIN_FILE}")
endif()
if(DEFINED ARM_TOOLCHAIN)
list(APPEND ARM_OPTIONS "-DCMAKE_TOOLCHAIN_FILE:FILEPATH=${ARM_TOOLCHAIN}")
2024-01-20 02:10:18 -05:00
endif()
# Build
ExternalProject_Add(arm-components
2024-12-21 04:46:31 -05:00
# Source Directory
2024-01-20 02:10:18 -05:00
DOWNLOAD_COMMAND ""
SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}"
2024-12-22 03:34:31 -05:00
# Configure
2024-01-20 02:10:18 -05:00
CMAKE_CACHE_ARGS ${ARM_OPTIONS}
2024-12-22 03:34:31 -05:00
CMAKE_GENERATOR "Ninja Multi-Config"
# Build
BUILD_COMMAND
"${CMAKE_COMMAND}" "--build" "<BINARY_DIR>" "--config" "$<CONFIG>"
2024-12-21 04:46:31 -05:00
# Install
2024-05-10 18:58:39 -04:00
INSTALL_COMMAND
"${CMAKE_COMMAND}" "-E"
"rm" "-rf" "<INSTALL_DIR>/${MCPI_INSTALL_DIR}"
2024-01-20 02:10:18 -05:00
COMMAND
2024-12-21 04:46:31 -05:00
"${CMAKE_COMMAND}" "-E" "env" "DESTDIR="
2024-12-22 03:34:31 -05:00
"${CMAKE_COMMAND}" "--install" "<BINARY_DIR>" "--config" "$<CONFIG>"
2024-12-21 04:46:31 -05:00
# Use Terminal
2024-01-20 02:10:18 -05:00
USES_TERMINAL_CONFIGURE TRUE
USES_TERMINAL_BUILD TRUE
USES_TERMINAL_INSTALL TRUE
2024-12-21 04:46:31 -05:00
# Always Build
2024-01-20 02:10:18 -05:00
BUILD_ALWAYS TRUE
)
# Install
ExternalProject_Get_Property(arm-components INSTALL_DIR)
2024-05-10 18:58:39 -04:00
install(DIRECTORY "${INSTALL_DIR}/${MCPI_INSTALL_DIR}/" DESTINATION "${MCPI_INSTALL_DIR}")
2024-01-20 02:10:18 -05:00
endif()