summaryrefslogtreecommitdiff
path: root/docs/handbook/meshmc/platform-support.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/handbook/meshmc/platform-support.md')
-rw-r--r--docs/handbook/meshmc/platform-support.md353
1 files changed, 353 insertions, 0 deletions
diff --git a/docs/handbook/meshmc/platform-support.md b/docs/handbook/meshmc/platform-support.md
new file mode 100644
index 0000000000..496fe07e32
--- /dev/null
+++ b/docs/handbook/meshmc/platform-support.md
@@ -0,0 +1,353 @@
+# Platform Support
+
+## Overview
+
+MeshMC targets Linux, macOS, and Windows with platform-specific build configurations, packaging, and runtime behavior. The CMake build system uses presets and conditional compilation to handle platform differences.
+
+## Build Presets
+
+| Preset | Platform | Compiler | Generator |
+|---|---|---|---|
+| `linux` | Linux (x86_64, aarch64) | GCC / Clang | Ninja Multi-Config |
+| `macos` | macOS (x86_64, arm64) | AppleClang | Ninja Multi-Config |
+| `windows_msvc` | Windows | MSVC | Ninja Multi-Config |
+| `windows_mingw` | Windows | MinGW-w64 | Ninja Multi-Config |
+
+Each preset is defined in `CMakePresets.json` and configures:
+- Compiler toolchain
+- vcpkg integration
+- Platform-specific CMake variables
+- Build/install directories
+
+## Linux
+
+### Build Requirements
+
+- CMake 3.28+
+- GCC 14+ or Clang 18+ (C++23 support)
+- Qt6 (Core, Widgets, Concurrent, Network, NetworkAuth, Test, Xml)
+- Extra CMake Modules (ECM) from KDE
+- libarchive, zlib, cmark, tomlplusplus
+
+### Nix Build
+
+MeshMC provides a `flake.nix` for reproducible builds:
+
+```bash
+nix build .#meshmc # Build release
+nix develop .#meshmc # Enter dev shell with all dependencies
+```
+
+### Desktop Integration
+
+CMake installs standard freedesktop files:
+
+```cmake
+# Application desktop entry
+install(FILES launcher/package/linux/org.projecttick.MeshMC.desktop
+ DESTINATION ${KDE_INSTALL_APPDIR})
+
+# AppStream metainfo
+install(FILES launcher/package/linux/org.projecttick.MeshMC.metainfo.xml
+ DESTINATION ${KDE_INSTALL_METAINFODIR})
+
+# MIME type for .meshmc files
+install(FILES launcher/package/linux/org.projecttick.MeshMC.mime.xml
+ DESTINATION ${KDE_INSTALL_MIMEDIR})
+
+# Application icons (various sizes)
+ecm_install_icons(ICONS
+ launcher/package/linux/16-apps-org.projecttick.MeshMC.png
+ launcher/package/linux/24-apps-org.projecttick.MeshMC.png
+ launcher/package/linux/32-apps-org.projecttick.MeshMC.png
+ launcher/package/linux/48-apps-org.projecttick.MeshMC.png
+ launcher/package/linux/64-apps-org.projecttick.MeshMC.png
+ launcher/package/linux/128-apps-org.projecttick.MeshMC.png
+ launcher/package/linux/256-apps-org.projecttick.MeshMC.png
+ launcher/package/linux/scalable-apps-org.projecttick.MeshMC.svg
+ DESTINATION ${KDE_INSTALL_ICONDIR}
+)
+```
+
+### Runtime Paths
+
+```cpp
+// KDE install directories used via ECM
+KDE_INSTALL_BINDIR → /usr/bin
+KDE_INSTALL_DATADIR → /usr/share
+KDE_INSTALL_APPDIR → /usr/share/applications
+KDE_INSTALL_ICONDIR → /usr/share/icons
+KDE_INSTALL_METAINFODIR → /usr/share/metainfo
+KDE_INSTALL_MIMEDIR → /usr/share/mime/packages
+```
+
+### RPATH
+
+```cmake
+# Set RPATH for installed binary
+set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
+```
+
+Ensures bundled libraries are found at runtime without LD_LIBRARY_PATH.
+
+### Wayland/X11
+
+Qt6 handles Wayland and X11 transparently. MeshMC does not have platform-specific display code.
+
+## macOS
+
+### Build Requirements
+
+- CMake 3.28+
+- Xcode / AppleClang (C++23 support)
+- Qt6 via Homebrew or vcpkg
+- Same library dependencies as Linux
+
+### App Bundle
+
+CMake creates a standard macOS `.app` bundle:
+
+```cmake
+set_target_properties(meshmc PROPERTIES
+ MACOSX_BUNDLE TRUE
+ MACOSX_BUNDLE_INFO_PLIST "${CMAKE_SOURCE_DIR}/launcher/package/macos/Info.plist.in"
+ MACOSX_BUNDLE_BUNDLE_NAME "MeshMC"
+ MACOSX_BUNDLE_BUNDLE_VERSION "${MeshMC_VERSION_NAME}"
+ MACOSX_BUNDLE_GUI_IDENTIFIER "org.projecttick.MeshMC"
+ MACOSX_BUNDLE_ICON_FILE "meshmc.icns"
+ MACOSX_BUNDLE_SHORT_VERSION_STRING "${MeshMC_VERSION_NAME}"
+)
+```
+
+### Application Icon
+
+```cmake
+# Convert SVG to icns
+set(MACOSX_ICON "${CMAKE_SOURCE_DIR}/launcher/package/macos/meshmc.icns")
+set_source_files_properties(${MACOSX_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
+```
+
+### Sparkle Updates
+
+macOS uses the Sparkle framework for auto-updates:
+
+```cmake
+if(APPLE)
+ find_library(SPARKLE_FRAMEWORK Sparkle)
+ if(SPARKLE_FRAMEWORK)
+ target_link_libraries(meshmc PRIVATE ${SPARKLE_FRAMEWORK})
+ endif()
+endif()
+```
+
+Sparkle provides:
+- Built-in update notification UI
+- Differential (delta) updates
+- Code signing verification
+- Automatic background checks
+
+### Universal Binary
+
+The build supports creating Universal binaries (x86_64 + arm64):
+
+```cmake
+# Set via CMake variable
+set(CMAKE_OSX_ARCHITECTURES "x86_64;arm64")
+```
+
+### macOS-Specific Code
+
+```cpp
+#ifdef Q_OS_MACOS
+ // Set application properties for macOS integration
+ QApplication::setAttribute(Qt::AA_DontShowIconsInMenus);
+
+ // Handle macOS dock icon click
+ // Handle macOS file open events
+#endif
+```
+
+## Windows
+
+### Build Requirements
+
+#### MSVC
+- Visual Studio 2022 17.10+ (MSVC v143, C++23)
+- CMake 3.28+
+- Qt6 via vcpkg or installer
+- vcpkg for other dependencies
+
+#### MinGW
+- MinGW-w64 13+ (GCC 14+ for C++23)
+- CMake 3.28+
+- Qt6 built for MinGW
+
+### Windows Resource File
+
+```cmake
+if(WIN32)
+ # Application icon and version info
+ configure_file(
+ "${CMAKE_SOURCE_DIR}/launcher/package/windows/meshmc.rc.in"
+ "${CMAKE_BINARY_DIR}/meshmc.rc"
+ )
+ target_sources(meshmc PRIVATE "${CMAKE_BINARY_DIR}/meshmc.rc")
+endif()
+```
+
+The `.rc` file provides:
+- Application icon (embedded in `.exe`)
+- Version information (shown in file properties)
+- Product name and company
+
+### Application Manifest
+
+```cmake
+if(WIN32)
+ target_sources(meshmc PRIVATE
+ "${CMAKE_SOURCE_DIR}/launcher/package/windows/meshmc.manifest"
+ )
+endif()
+```
+
+The manifest declares:
+- DPI awareness (per-monitor DPI aware)
+- Requested execution level (asInvoker)
+- Common controls v6 (modern UI)
+- UTF-8 code page
+
+### NSIS Installer
+
+For creating Windows installers:
+
+```cmake
+if(WIN32)
+ # CPack NSIS configuration
+ set(CPACK_GENERATOR "NSIS")
+ set(CPACK_NSIS_DISPLAY_NAME "MeshMC")
+ set(CPACK_NSIS_PACKAGE_NAME "MeshMC")
+ set(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}/launcher/package/windows/meshmc.ico")
+ set(CPACK_NSIS_INSTALLED_ICON_NAME "meshmc.exe")
+ set(CPACK_NSIS_CREATE_ICONS_EXTRA
+ "CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\MeshMC.lnk' '$INSTDIR\\\\meshmc.exe'"
+ )
+endif()
+```
+
+### Windows Registry
+
+The installer registers:
+- File associations (`.meshmc` import files)
+- Start menu shortcuts
+- Uninstall information in Add/Remove Programs
+
+### WSL Rejection
+
+MeshMC detects and rejects running under WSL:
+
+```cpp
+#ifdef Q_OS_LINUX
+ // Check for WSL
+ QFile wslInterop("/proc/sys/fs/binfmt_misc/WSLInterop");
+ if (wslInterop.exists()) {
+ QMessageBox::critical(nullptr, "Unsupported Platform",
+ "MeshMC does not support running under WSL. "
+ "Please use the native Windows version.");
+ return 1;
+ }
+#endif
+```
+
+WSL cannot run Java GUI applications reliably, so MeshMC refuses to start.
+
+## Portable Mode
+
+All platforms support portable mode:
+
+```cpp
+// Check for portable marker file
+QFileInfo portableMarker(
+ QCoreApplication::applicationDirPath() + "/meshmc_portable.txt"
+);
+
+if (portableMarker.exists()) {
+ // Use application directory for all data
+ m_dataPath = QCoreApplication::applicationDirPath();
+} else {
+ // Use standard platform data directory
+ m_dataPath = QStandardPaths::writableLocation(
+ QStandardPaths::GenericDataLocation
+ ) + "/MeshMC";
+}
+```
+
+Create `meshmc_portable.txt` next to the binary to enable portable mode. All data (instances, settings, cache) will be stored alongside the executable.
+
+## OpSys Class
+
+Platform detection utility:
+
+```cpp
+class OpSys
+{
+public:
+ enum OS {
+ Os_Windows,
+ Os_Linux,
+ Os_OSX,
+ Os_Other
+ };
+
+ static OS currentSystem();
+ static QString currentSystemString();
+ static bool isLinux();
+ static bool isMacOS();
+ static bool isWindows();
+};
+```
+
+Used throughout the codebase for platform-conditional logic:
+- Library path resolution
+- Native path separators
+- Platform-specific launch arguments
+- Natives extraction (LWJGL)
+
+## Platform-Specific Native Libraries
+
+Minecraft requires platform-specific native libraries (LWJGL, OpenAL, etc.):
+
+```cpp
+// From Library class
+bool Library::isApplicable() const
+{
+ // Check OS rules
+ for (auto& rule : m_rules) {
+ if (rule.os.name == "linux" && OpSys::isLinux()) return rule.action == "allow";
+ if (rule.os.name == "osx" && OpSys::isMacOS()) return rule.action == "allow";
+ if (rule.os.name == "windows" && OpSys::isWindows()) return rule.action == "allow";
+ }
+ return true; // No rules = always applicable
+}
+```
+
+### Natives Classifiers
+
+```json
+{
+ "name": "org.lwjgl:lwjgl:3.3.3",
+ "natives": {
+ "linux": "natives-linux",
+ "osx": "natives-macos",
+ "windows": "natives-windows"
+ }
+}
+```
+
+## Data Directory Locations
+
+| Platform | Default Data Directory |
+|---|---|
+| Linux | `~/.local/share/MeshMC` |
+| macOS | `~/Library/Application Support/MeshMC` |
+| Windows | `%APPDATA%/MeshMC` |
+| Portable | `<binary_dir>/` |