diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a85e1eff..0bc983c74 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.24.0) +cmake_minimum_required(VERSION 3.25.0) # Avoid Warning About DOWNLOAD_EXTRACT_TIMESTAMP cmake_policy(SET CMP0135 NEW) @@ -6,17 +6,24 @@ cmake_policy(SET CMP0135 NEW) # Core Options include(cmake/options/core-options.cmake) +# Utility Functions +include(cmake/util/util.cmake) + # Build Mode -if(NOT DEFINED CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build Type" FORCE) +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) endif() # Start Project project(minecraft-pi-reborn) -# Utility Functions -include(cmake/util/util.cmake) - # Sanity Checks string(CONCAT ARM_SANITY_CHECK "include(CheckSymbolExists)\n" @@ -174,21 +181,24 @@ if(BUILD_NATIVE_COMPONENTS) if(DEFINED ARM_TOOLCHAIN) list(APPEND ARM_OPTIONS "-DCMAKE_TOOLCHAIN_FILE:FILEPATH=${ARM_TOOLCHAIN}") endif() - list(APPEND ARM_OPTIONS "-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}") # Build ExternalProject_Add(arm-components # Source Directory DOWNLOAD_COMMAND "" SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}" - # Pass Arguments To CMake + # Configure CMAKE_CACHE_ARGS ${ARM_OPTIONS} + CMAKE_GENERATOR "Ninja Multi-Config" + # Build + BUILD_COMMAND + "${CMAKE_COMMAND}" "--build" "" "--config" "$" # Install INSTALL_COMMAND "${CMAKE_COMMAND}" "-E" "rm" "-rf" "/${MCPI_INSTALL_DIR}" COMMAND "${CMAKE_COMMAND}" "-E" "env" "DESTDIR=" - "${CMAKE_COMMAND}" "--install" "" + "${CMAKE_COMMAND}" "--install" "" "--config" "$" # Use Terminal USES_TERMINAL_CONFIGURE TRUE USES_TERMINAL_BUILD TRUE diff --git a/dependencies/LIEF/CMakeLists.txt b/dependencies/LIEF/CMakeLists.txt index 64c773f00..98c46bb09 100644 --- a/dependencies/LIEF/CMakeLists.txt +++ b/dependencies/LIEF/CMakeLists.txt @@ -24,7 +24,7 @@ force_set(LIEF_VDEX FALSE BOOL) # Download set(MESSAGE_QUIET TRUE) -add_subdirectory(src EXCLUDE_FROM_ALL) +add_subdirectory(src EXCLUDE_FROM_ALL SYSTEM) unset(MESSAGE_QUIET) # Install diff --git a/dependencies/LIEF/src b/dependencies/LIEF/src index f4d68357c..441bb4620 160000 --- a/dependencies/LIEF/src +++ b/dependencies/LIEF/src @@ -1 +1 @@ -Subproject commit f4d68357cb51fc251555e69e2679f5bb11af75ea +Subproject commit 441bb4620bc7242a822b7cb4419c965d76119f6b diff --git a/dependencies/glfw/CMakeLists.txt b/dependencies/glfw/CMakeLists.txt index 7378fb9f6..c9c5ba96b 100644 --- a/dependencies/glfw/CMakeLists.txt +++ b/dependencies/glfw/CMakeLists.txt @@ -16,7 +16,7 @@ force_set(GLFW_BUILD_X11 TRUE BOOL) force_set(GLFW_BUILD_WAYLAND TRUE BOOL) force_set(GLFW_LIBRARY_TYPE "SHARED" STRING) set(MESSAGE_QUIET TRUE) -add_subdirectory(src EXCLUDE_FROM_ALL) +add_subdirectory(src EXCLUDE_FROM_ALL SYSTEM) unset(MESSAGE_QUIET) # Install diff --git a/scripts/build.mjs b/scripts/build.mjs index af6aac9e4..6f76649f5 100755 --- a/scripts/build.mjs +++ b/scripts/build.mjs @@ -20,7 +20,10 @@ function info(message) { // Enums function Enum(values) { for (const value of values) { - this[value] = {name: value.toLowerCase()}; + this[value] = { + prettyName: value, + name: value.toLowerCase() + }; } } Enum.prototype.get = function (name) { @@ -53,6 +56,10 @@ const Architectures = wrap(new Enum([ 'ARMHF', 'Host' ])); +const Configurations = wrap(new Enum([ + 'Release', + 'Debug' +])); // Folders const __filename = url.fileURLToPath(import.meta.url); @@ -63,13 +70,12 @@ let out = path.join(root, 'out'); // Positional Arguments let argIndex = 2; // Skip First Two Arguments -function readArg(from, type) { - // Check Argument Count - if (argIndex >= process.argv.length) { +function parseArg(arg, from, type) { + // Check Argument + if (arg === undefined) { err('Expecting ' + type); } // Read Argument - const arg = process.argv[argIndex++]; const value = from.get(arg); if (value === null) { err(`Invalid ${type}: ${arg}`); @@ -77,6 +83,9 @@ function readArg(from, type) { // Return return value; } +function readArg(...args) { + return parseArg(process.argv[argIndex++], ...args); +} // Type Of Packaging const packageType = readArg(PackageTypes, 'Package Type'); // Build Architecture @@ -92,17 +101,19 @@ const options = new Map(); // Other Arguments let clean = false; let install = false; +let config = Configurations.Release; for (; argIndex < process.argv.length; argIndex++) { const arg = process.argv[argIndex]; - if (arg.startsWith('-D')) { + const cmakeArgPrefix = '-D'; + if (arg.startsWith(cmakeArgPrefix)) { // Pass Build Option To CMake - let parsedArg = arg.substring(2); - const split = parsedArg.indexOf('='); - if (split === -1) { + let parsedArg = arg.substring(cmakeArgPrefix.length); + const parts = parsedArg.split('='); + if (parts.length !== 2) { err('Unable To Parse Build Option: ' + arg); } - const name = parsedArg.substring(0, split); - const value = parsedArg.substring(split + 1); + const name = parts[0]; + const value = parts[1]; if (!/^[a-zA-Z_]+$/.test(name) || name.length === 0) { err('Invalid Build Option Name: ' + name); } @@ -116,7 +127,11 @@ for (; argIndex < process.argv.length; argIndex++) { err('AppImages Cannot Be Installed'); } install = true; + } else if (arg === '--config') { + // Set Configuration + config = parseArg(process.argv[++argIndex], Configurations, 'Configuration'); } else { + // Invalid err('Invalid Argument: ' + arg); } } @@ -169,24 +184,25 @@ function run(command) { err(e); } } -const cmake = ['cmake', '-GNinja']; +const configure = ['cmake', '-GNinja Multi-Config']; options.forEach((value, key, map) => { - cmake.push(`-D${key}=${value}`); + configure.push(`-D${key}=${value}`); }); -cmake.push(root); -run(cmake); +configure.push(root); +run(configure); // Build -run(['cmake', '--build', '.']); +const configArg = ['--config', config.prettyName]; +run(['cmake', '--build', '.', ...configArg/*, '-v'/*, '--', '-n', '-j1', '-j1'*/]); // Package if (packageType !== PackageTypes.AppImage) { if (!install) { process.env.DESTDIR = out; } - run(['cmake', '--install', '.']); + run(['cmake', '--install', '.', ...configArg]); } else { - run(['cmake', '--build', '.', '--target', 'package']); + run(['cmake', '--build', '.', '--target', 'package', ...configArg]); // Copy Generated Files const files = fs.readdirSync(build); for (const file of files) {