fix: nix flake (#101)

* fix: unbroke import paths in EnchantmentMenu.cpp

* fix: patch nix flakes for new 4JLibs

* style: format nix flake

* refactor(nix): rely on build-linux.sh functions for nix builds

* fix(nix): patch dev shell for build-linux.sh

* feat(nix): derive package version from network version
This commit is contained in:
Riley M.
2026-05-21 11:49:56 -05:00
committed by GitHub
parent d55a38eb84
commit a2f200fd98
4 changed files with 188 additions and 176 deletions

View File

@@ -6,13 +6,13 @@
#include "net.minecraft.world.item.h" #include "net.minecraft.world.item.h"
#include "net.minecraft.world.item.enchantment.h" #include "net.minecraft.world.item.enchantment.h"
#include "EnchantmentMenu.h" #include "EnchantmentMenu.h"
#include "../../../Minecraft.Client/ServerPlayer.h" #include "../Minecraft.Client/ServerPlayer.h"
#include "../../../Minecraft.Client/MinecraftServer.h" #include "../Minecraft.Client/MinecraftServer.h"
#include "../../../Minecraft.Client/PlayerList.h" #include "../Minecraft.Client/PlayerList.h"
#include "../../../Minecraft.Client/MultiPlayerLocalPlayer.h" #include "../Minecraft.Client/MultiPlayerLocalPlayer.h"
#include "../../../Minecraft.Client/PlayerConnection.h" #include "../Minecraft.Client/PlayerConnection.h"
#include "../../../Minecraft.World/CustomPayloadPacket.h" #include "../Minecraft.World/CustomPayloadPacket.h"
#include "../../../Minecraft.Client/Minecraft.h" #include "../Minecraft.Client/Minecraft.h"
EnchantmentMenu::EnchantmentMenu(shared_ptr<Inventory> inventory, Level *level, int xt, int yt, int zt) EnchantmentMenu::EnchantmentMenu(shared_ptr<Inventory> inventory, Level *level, int xt, int yt, int zt)
{ {

View File

@@ -1,9 +1,9 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail set -euo pipefail
VERSION="0.0.0" # man we're using nightly :sob: VERSION="0.0.0" # man we're using nightly :sob:
SOURCE_DIR="${1:-.}" SOURCE_DIR="${SOURCE_DIR:-${1:-.}}"
BUILD_CI="${BUILD_CI:-0}" BUILD_CI="${BUILD_CI:-0}"
BUILD_TYPE="${2:-Release}" BUILD_TYPE="${BUILD_TYPE:-${2:-Release}}"
XWIN_CACHE="${XWIN_CACHE:-$PWD/.xwin}" XWIN_CACHE="${XWIN_CACHE:-$PWD/.xwin}"
INSTALL_DIR="${INSTALL_PREFIX:-$HOME/.local/share/neoLegacy}" INSTALL_DIR="${INSTALL_PREFIX:-$HOME/.local/share/neoLegacy}"
RED='\033[0;31m' RED='\033[0;31m'
@@ -263,15 +263,22 @@ LAUNCHER
chmod +x "$INSTALL_DIR/minecraft-lce-fourkit" chmod +x "$INSTALL_DIR/minecraft-lce-fourkit"
} }
BUILD_DIR="$SOURCE_DIR/build/windows64-clang" main() {
mkdir -p "$BUILD_DIR" BUILD_DIR="$SOURCE_DIR/build/windows64-clang"
info "LegacyEvolved LCE v$VERSION build script" mkdir -p "$BUILD_DIR"
info "Source: $SOURCE_DIR | Type: $BUILD_TYPE" info "LegacyEvolved LCE v$VERSION build script"
echo "" info "Source: $SOURCE_DIR | Type: $BUILD_TYPE"
check_deps echo ""
fetch_winsdk check_deps
patch_winsdk_symlinks fetch_winsdk
do_cmake_configure patch_winsdk_symlinks
do_build do_cmake_configure
do_install do_build
do_install
}
# Do not run main when sourced (required for flake.nix)
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
main "$@"
fi

17
flake.lock generated
View File

@@ -18,6 +18,22 @@
"type": "github" "type": "github"
} }
}, },
"fourjlibs": {
"flake": false,
"locked": {
"lastModified": 1777358628,
"narHash": "sha256-yV/ugauN5L4FFC88N4CJI01iTOKYBeim8UQ3Usy2vI0=",
"owner": "Patoke",
"repo": "4JLibs",
"rev": "8fb036f6d6ca5aa5aa2e20633638d6232a58d508",
"type": "github"
},
"original": {
"owner": "Patoke",
"repo": "4JLibs",
"type": "github"
}
},
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1774106199, "lastModified": 1774106199,
@@ -37,6 +53,7 @@
"root": { "root": {
"inputs": { "inputs": {
"flake-utils": "flake-utils", "flake-utils": "flake-utils",
"fourjlibs": "fourjlibs",
"nixpkgs": "nixpkgs" "nixpkgs": "nixpkgs"
} }
}, },

300
flake.nix
View File

@@ -4,18 +4,34 @@
inputs = { inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils"; flake-utils.url = "github:numtide/flake-utils";
fourjlibs = {
url = "github:Patoke/4JLibs";
flake = false;
};
}; };
outputs = { self, nixpkgs, flake-utils }: outputs =
flake-utils.lib.eachDefaultSystem (system: {
self,
nixpkgs,
flake-utils,
fourjlibs,
}:
flake-utils.lib.eachDefaultSystem (
system:
let let
pkgs = import nixpkgs { pkgs = import nixpkgs {
inherit system; inherit system;
config.allowUnfree = true; config.allowUnfree = true;
}; };
# Version info # Version derived from network protocol version in cmake/GenerateBuildVer.cmake
version = "1.6.0560.0"; buildNumber = builtins.head (
builtins.match ".*set\\(BUILD_NUMBER ([0-9]+)\\).*" (
builtins.readFile ./cmake/GenerateBuildVer.cmake
)
);
version = "0.${buildNumber}.0";
# Windows SDK downloaded via xwin (fixed-output derivation) # Windows SDK downloaded via xwin (fixed-output derivation)
windowsSdk = pkgs.stdenvNoCC.mkDerivation { windowsSdk = pkgs.stdenvNoCC.mkDerivation {
@@ -24,9 +40,13 @@
outputHashAlgo = "sha256"; outputHashAlgo = "sha256";
outputHashMode = "recursive"; outputHashMode = "recursive";
outputHash = "sha256-ksSytBUjv/tD3IJzHM9BkAzFjJ+JAGD353Pur0G4rQE="; outputHash = "sha256-UFQjsFVBwcF/9e9tVFoG0Z1JySxyTnFqoaRwr/tUWzA=";
nativeBuildInputs = [ pkgs.xwin pkgs.cacert pkgs.rsync ]; nativeBuildInputs = [
pkgs.xwin
pkgs.cacert
pkgs.rsync
];
dontUnpack = true; dontUnpack = true;
@@ -50,8 +70,45 @@
dontFixup = true; dontFixup = true;
}; };
# Helper to create case-insensitive symlinks for SDK headers/libs # Pre fetch NuGet packages for FourKit (dotnet publish --self-contained needs win-x64 runtime)
sdkWithSymlinks = pkgs.runCommand "windows-sdk-symlinked" {} '' fourkitNugetDeps = pkgs.stdenvNoCC.mkDerivation {
pname = "fourkit-nuget-deps";
version = "10.0";
outputHashAlgo = "sha256";
outputHashMode = "recursive";
outputHash = "sha256-eEkU0MugnFSNvVYvd5V5xLK4oNcLgZcXxMYSuiYMPbA=";
nativeBuildInputs = [ pkgs.cacert ];
dontUnpack = true;
buildPhase = ''
export HOME=$(mktemp -d)
export DOTNET_CLI_TELEMETRY_OPTOUT=1
export DOTNET_NOLOGO=1
export SSL_CERT_FILE="${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"
# Use the unwrapped SDK to allow NuGet network access
DOTNET="${pkgs.dotnetCorePackages.sdk_10_0.passthru.unwrapped}/share/dotnet/dotnet"
# Copy csproj to writable location (dotnet needs to write obj/)
WORK=$(mktemp -d)
cp ${./.}/Minecraft.Server.FourKit/Minecraft.Server.FourKit.csproj "$WORK/"
cp ${./.}/global.json "$WORK/"
$DOTNET restore "$WORK/Minecraft.Server.FourKit.csproj" \
--runtime win-x64 \
--packages "$out" \
--source https://api.nuget.org/v3/index.json
'';
dontInstall = true;
dontFixup = true;
};
# Helper to make case insensitive symlinks for SDK headers/libs
sdkWithSymlinks = pkgs.runCommand "windows-sdk-symlinked" { } ''
cp -r ${windowsSdk} $out cp -r ${windowsSdk} $out
chmod -R u+w $out chmod -R u+w $out
@@ -63,27 +120,6 @@
ln -sf $out/sdk/lib/um/x86_64/ws2_32.lib $out/sdk/lib/um/x86_64/Ws2_32.lib 2>/dev/null || true ln -sf $out/sdk/lib/um/x86_64/ws2_32.lib $out/sdk/lib/um/x86_64/Ws2_32.lib 2>/dev/null || true
''; '';
# CMake toolchain file for clang-cl cross-compilation
clangClToolchain = pkgs.writeText "clang-cl-toolchain.cmake" ''
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSTEM_PROCESSOR AMD64)
set(CMAKE_C_COMPILER clang-cl)
set(CMAKE_CXX_COMPILER clang-cl)
set(CMAKE_RC_COMPILER llvm-rc)
set(CMAKE_ASM_MASM_COMPILER llvm-ml)
set(CMAKE_AR llvm-lib)
set(CMAKE_LINKER lld-link)
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_LINKER> <LINK_FLAGS> <OBJECTS> -out:<TARGET> <LINK_LIBRARIES>")
set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_LINKER> <LINK_FLAGS> <OBJECTS> -out:<TARGET> <LINK_LIBRARIES>")
add_compile_options(-fms-compatibility -fms-extensions)
add_compile_definitions(_WIN64 _AMD64_ WIN32_LEAN_AND_MEAN)
'';
# The main build derivation # The main build derivation
minecraft-lce-unwrapped = pkgs.stdenv.mkDerivation { minecraft-lce-unwrapped = pkgs.stdenv.mkDerivation {
pname = "minecraft-lce-unwrapped"; pname = "minecraft-lce-unwrapped";
@@ -91,84 +127,79 @@
src = pkgs.lib.cleanSourceWith { src = pkgs.lib.cleanSourceWith {
src = ./.; src = ./.;
filter = path: type: filter =
path: type:
let let
baseName = baseNameOf path; baseName = baseNameOf path;
in in
# Exclude build directories and other non-source files # Exclude build directories and other non-source files
!(baseName == "build" || !(
baseName == "result" || baseName == "build"
baseName == ".git" || || baseName == "result"
baseName == ".direnv" || || baseName == ".git"
pkgs.lib.hasPrefix "result-" baseName); || baseName == ".direnv"
|| pkgs.lib.hasPrefix "result-" baseName
);
}; };
# Patch in the 4JLibs submodule (flakes don't fetch submodules)
postUnpack = ''
rm -rf source/Minecraft.Client/Windows64/4JLibs
cp -r ${fourjlibs} source/Minecraft.Client/Windows64/4JLibs
chmod -R u+w source/Minecraft.Client/Windows64/4JLibs
'';
nativeBuildInputs = with pkgs; [ nativeBuildInputs = with pkgs; [
llvmPackages.clang-unwrapped # provides clang-cl llvmPackages.clang-unwrapped # provides clang-cl
llvmPackages.lld # provides lld-link llvmPackages.lld # provides lld-link
llvmPackages.llvm # provides llvm-rc, llvm-ml, llvm-lib, llvm-mt llvmPackages.llvm # provides llvm-rc, llvm-ml, llvm-lib, llvm-mt
cmake cmake
ninja ninja
rsync rsync
winePackage # needed to run fxc.exe during build
dotnetCorePackages.sdk_10_0 # needed for FourKit server
]; ];
# Set up environment for clang-cl
WINSDK = sdkWithSymlinks;
configurePhase = '' configurePhase = ''
runHook preConfigure runHook preConfigure
export INCLUDE="$WINSDK/crt/include;$WINSDK/sdk/include/um;$WINSDK/sdk/include/ucrt;$WINSDK/sdk/include/shared" # Point build-linux.sh at the pre-downloaded Windows SDK
export LIB="$WINSDK/crt/lib/x86_64;$WINSDK/sdk/lib/um/x86_64;$WINSDK/sdk/lib/ucrt/x86_64" export XWIN_CACHE=$(mktemp -d)
ln -s ${sdkWithSymlinks} "$XWIN_CACHE/splat"
cmake -S . -B build \ # NuGet packages for FourKit dotnet publish
-G Ninja \ export NUGET_PACKAGES="${fourkitNugetDeps}"
-DCMAKE_BUILD_TYPE=Release \ export DOTNET_CLI_TELEMETRY_OPTOUT=1
-DCMAKE_TOOLCHAIN_FILE=${clangClToolchain} \ export DOTNET_NOLOGO=1
-DCMAKE_C_COMPILER=clang-cl \
-DCMAKE_CXX_COMPILER=clang-cl \ # Configure build-linux.sh variables
-DCMAKE_LINKER=lld-link \ export SOURCE_DIR=.
-DCMAKE_RC_COMPILER=llvm-rc \ export BUILD_TYPE=Release
-DCMAKE_MT=llvm-mt \ export INSTALL_PREFIX=$out
-DPLATFORM_DEFINES="_WINDOWS64" \
-DPLATFORM_NAME="Windows64" \ # Source the build script for its functions
-DIGGY_LIBS="iggy_w64.lib;iggyperfmon_w64.lib;iggyexpruntime_w64.lib" \ source ./build-linux.sh
-DCMAKE_SYSTEM_NAME=Windows \
-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded \ BUILD_DIR="$SOURCE_DIR/build/windows64-clang"
-DCMAKE_C_FLAGS="/MT -fms-compatibility -fms-extensions --target=x86_64-pc-windows-msvc -imsvc $WINSDK/crt/include -imsvc $WINSDK/sdk/include/ucrt -imsvc $WINSDK/sdk/include/um -imsvc $WINSDK/sdk/include/shared" \ mkdir -p "$BUILD_DIR"
-DCMAKE_CXX_FLAGS="/MT -fms-compatibility -fms-extensions --target=x86_64-pc-windows-msvc -imsvc $WINSDK/crt/include -imsvc $WINSDK/sdk/include/ucrt -imsvc $WINSDK/sdk/include/um -imsvc $WINSDK/sdk/include/shared" \
-DCMAKE_ASM_MASM_FLAGS="-m64" \ do_cmake_configure
-DCMAKE_EXE_LINKER_FLAGS="-libpath:$WINSDK/crt/lib/x86_64 -libpath:$WINSDK/sdk/lib/um/x86_64 -libpath:$WINSDK/sdk/lib/ucrt/x86_64"
# Patch shebangs in generated scripts (fxc wine wrapper)
patchShebangs "$BUILD_DIR/tools" 2>/dev/null || true
runHook postConfigure runHook postConfigure
''; '';
buildPhase = '' buildPhase = ''
runHook preBuild runHook preBuild
cmake --build build --config Release -j $NIX_BUILD_CORES do_build
runHook postBuild runHook postBuild
''; '';
installPhase = '' installPhase = ''
runHook preInstall runHook preInstall
do_install
mkdir -p $out/{client,server}
# Install client
cp build/Minecraft.Client/Minecraft.Client.exe $out/client/
cp build/Minecraft.Client/iggy_w64.dll $out/client/ 2>/dev/null || true
cp -r build/Minecraft.Client/Common $out/client/ 2>/dev/null || true
cp -r build/Minecraft.Client/music $out/client/ 2>/dev/null || true
cp -r build/Minecraft.Client/Windows64 $out/client/ 2>/dev/null || true
cp -r build/Minecraft.Client/Windows64Media $out/client/ 2>/dev/null || true
cp -r build/Minecraft.Client/iggy* $out/client/ 2>/dev/null || true
# Install server
cp build/Minecraft.Server/Minecraft.Server.exe $out/server/
cp build/Minecraft.Server/iggy_w64.dll $out/server/ 2>/dev/null || true
cp -r build/Minecraft.Server/Common $out/server/ 2>/dev/null || true
cp -r build/Minecraft.Server/Windows64 $out/server/ 2>/dev/null || true
runHook postInstall runHook postInstall
''; '';
@@ -209,40 +240,40 @@
cat > $out/bin/minecraft-lce-client << 'WRAPPER' cat > $out/bin/minecraft-lce-client << 'WRAPPER'
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail set -euo pipefail
GAME_DIR="@gameDir@" GAME_DIR="@gameDir@"
PERSIST_DIR="''${MC_DATA_DIR:-$HOME/.local/share/minecraft-lce-client}" PERSIST_DIR="''${MC_DATA_DIR:-$HOME/.local/share/minecraft-lce-client}"
export WINEARCH=win64 export WINEARCH=win64
export WINEPREFIX="''${WINEPREFIX:-$HOME/@winePrefixBase@-client}" export WINEPREFIX="''${WINEPREFIX:-$HOME/@winePrefixBase@-client}"
# Wine performance settings # Wine performance settings
export WINEDLLOVERRIDES="winemenubuilder.exe=d" export WINEDLLOVERRIDES="winemenubuilder.exe=d"
export WINEESYNC=1 export WINEESYNC=1
export WINEFSYNC=1 export WINEFSYNC=1
export DXVK_LOG_LEVEL=none export DXVK_LOG_LEVEL=none
mkdir -p "$PERSIST_DIR" mkdir -p "$PERSIST_DIR"
mkdir -p "$WINEPREFIX" mkdir -p "$WINEPREFIX"
# Create working directory with symlinks to immutable store # Create working directory with symlinks to immutable store
WORK_DIR="$(mktemp -d)" WORK_DIR="$(mktemp -d)"
trap 'rm -rf "$WORK_DIR"' EXIT trap 'rm -rf "$WORK_DIR"' EXIT
cp -rs "$GAME_DIR"/* "$WORK_DIR/" cp -rs "$GAME_DIR"/* "$WORK_DIR/"
chmod -R u+w "$WORK_DIR" chmod -R u+w "$WORK_DIR"
# Setup persistent data directory # Setup persistent data directory
mkdir -p "$PERSIST_DIR/GameHDD" mkdir -p "$PERSIST_DIR/GameHDD"
rm -rf "$WORK_DIR/Windows64/GameHDD" 2>/dev/null || true rm -rf "$WORK_DIR/Windows64/GameHDD" 2>/dev/null || true
ln -sf "$PERSIST_DIR/GameHDD" "$WORK_DIR/Windows64/GameHDD" ln -sf "$PERSIST_DIR/GameHDD" "$WORK_DIR/Windows64/GameHDD"
cd "$WORK_DIR" cd "$WORK_DIR"
echo "[info] Starting Minecraft LCE client" echo "[info] Starting Minecraft LCE client"
echo "[info] Data directory: $PERSIST_DIR" echo "[info] Data directory: $PERSIST_DIR"
echo "[info] Wine prefix: $WINEPREFIX" echo "[info] Wine prefix: $WINEPREFIX"
exec wine "$WORK_DIR/Minecraft.Client.exe" "$@" exec wine "$WORK_DIR/Minecraft.Client.exe" "$@"
WRAPPER WRAPPER
@@ -291,33 +322,33 @@
cat > $out/bin/minecraft-lce-server << 'WRAPPER' cat > $out/bin/minecraft-lce-server << 'WRAPPER'
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail set -euo pipefail
GAME_DIR="@gameDir@" GAME_DIR="@gameDir@"
SERVER_PORT="''${MC_PORT:-25565}" SERVER_PORT="''${MC_PORT:-25565}"
SERVER_BIND_IP="''${MC_BIND:-0.0.0.0}" SERVER_BIND_IP="''${MC_BIND:-0.0.0.0}"
PERSIST_DIR="''${MC_DATA_DIR:-$HOME/.local/share/minecraft-lce-server}" PERSIST_DIR="''${MC_DATA_DIR:-$HOME/.local/share/minecraft-lce-server}"
export WINEARCH=win64 export WINEARCH=win64
export WINEPREFIX="''${WINEPREFIX:-$HOME/@winePrefixBase@-server}" export WINEPREFIX="''${WINEPREFIX:-$HOME/@winePrefixBase@-server}"
# Wine settings # Wine settings
export WINEDLLOVERRIDES="winemenubuilder.exe=d" export WINEDLLOVERRIDES="winemenubuilder.exe=d"
export WINEESYNC=1 export WINEESYNC=1
export WINEFSYNC=1 export WINEFSYNC=1
mkdir -p "$PERSIST_DIR" mkdir -p "$PERSIST_DIR"
mkdir -p "$WINEPREFIX" mkdir -p "$WINEPREFIX"
# Create working directory with symlinks to immutable store # Create working directory with symlinks to immutable store
WORK_DIR="$(mktemp -d)" WORK_DIR="$(mktemp -d)"
trap 'rm -rf "$WORK_DIR"' EXIT trap 'rm -rf "$WORK_DIR"' EXIT
cp -rs "$GAME_DIR"/* "$WORK_DIR/" cp -rs "$GAME_DIR"/* "$WORK_DIR/"
chmod -R u+w "$WORK_DIR" chmod -R u+w "$WORK_DIR"
# Setup persistent data # Setup persistent data
mkdir -p "$PERSIST_DIR/GameHDD" mkdir -p "$PERSIST_DIR/GameHDD"
for file in server.properties banned-players.json banned-ips.json; do for file in server.properties banned-players.json banned-ips.json; do
if [[ ! -f "$PERSIST_DIR/$file" ]]; then if [[ ! -f "$PERSIST_DIR/$file" ]]; then
if [[ -f "$WORK_DIR/$file" ]]; then if [[ -f "$WORK_DIR/$file" ]]; then
@@ -328,12 +359,12 @@
fi fi
ln -sf "$PERSIST_DIR/$file" "$WORK_DIR/$file" ln -sf "$PERSIST_DIR/$file" "$WORK_DIR/$file"
done done
rm -rf "$WORK_DIR/Windows64/GameHDD" 2>/dev/null || true rm -rf "$WORK_DIR/Windows64/GameHDD" 2>/dev/null || true
ln -sf "$PERSIST_DIR/GameHDD" "$WORK_DIR/Windows64/GameHDD" ln -sf "$PERSIST_DIR/GameHDD" "$WORK_DIR/Windows64/GameHDD"
cd "$WORK_DIR" cd "$WORK_DIR"
# Start Xvfb if no display (server may require a virtual display) # Start Xvfb if no display (server may require a virtual display)
if [[ -z "''${DISPLAY:-}" ]]; then if [[ -z "''${DISPLAY:-}" ]]; then
export DISPLAY=":99" export DISPLAY=":99"
@@ -343,11 +374,11 @@
sleep 1 sleep 1
echo "[info] Started Xvfb on $DISPLAY" echo "[info] Started Xvfb on $DISPLAY"
fi fi
echo "[info] Starting Minecraft LCE server on $SERVER_BIND_IP:$SERVER_PORT" echo "[info] Starting Minecraft LCE server on $SERVER_BIND_IP:$SERVER_PORT"
echo "[info] Data directory: $PERSIST_DIR" echo "[info] Data directory: $PERSIST_DIR"
echo "[info] Wine prefix: $WINEPREFIX" echo "[info] Wine prefix: $WINEPREFIX"
exec wine "$WORK_DIR/Minecraft.Server.exe" -port "$SERVER_PORT" -bind "$SERVER_BIND_IP" "$@" exec wine "$WORK_DIR/Minecraft.Server.exe" -port "$SERVER_PORT" -bind "$SERVER_BIND_IP" "$@"
WRAPPER WRAPPER
@@ -386,58 +417,10 @@
rsync rsync
coreutils coreutils
cacert cacert
winePackage
]; ];
text = '' text = ''
set -euo pipefail exec bash "${./build-linux.sh}" "$@"
SOURCE_DIR="''${1:-.}"
BUILD_TYPE="''${2:-Release}"
XWIN_CACHE="''${XWIN_CACHE:-$HOME/.cache/xwin}"
export XWIN_CACHE
echo "[info] Checking Windows SDK cache at $XWIN_CACHE"
if [[ ! -d "$XWIN_CACHE/splat" ]]; then
echo "[info] Downloading Windows SDK and CRT via xwin..."
mkdir -p "$XWIN_CACHE"
xwin --accept-license splat --output "$XWIN_CACHE/splat"
else
echo "[info] Using cached Windows SDK"
fi
WINSDK="$XWIN_CACHE/splat"
export INCLUDE="$WINSDK/crt/include;$WINSDK/sdk/include/um;$WINSDK/sdk/include/ucrt;$WINSDK/sdk/include/shared"
export LIB="$WINSDK/crt/lib/x86_64;$WINSDK/sdk/lib/um/x86_64;$WINSDK/sdk/lib/ucrt/x86_64"
BUILD_DIR="$SOURCE_DIR/build/windows64-clang"
mkdir -p "$BUILD_DIR"
echo "[info] Configuring with CMake..."
cmake -S "$SOURCE_DIR" -B "$BUILD_DIR" \
-G Ninja \
-DCMAKE_BUILD_TYPE="$BUILD_TYPE" \
-DCMAKE_TOOLCHAIN_FILE="${clangClToolchain}" \
-DCMAKE_C_COMPILER=clang-cl \
-DCMAKE_CXX_COMPILER=clang-cl \
-DCMAKE_LINKER=lld-link \
-DCMAKE_RC_COMPILER=llvm-rc \
-DCMAKE_MT=llvm-mt \
-DPLATFORM_DEFINES="_WINDOWS64" \
-DPLATFORM_NAME="Windows64" \
-DIGGY_LIBS="iggy_w64.lib;iggyperfmon_w64.lib;iggyexpruntime_w64.lib" \
-DCMAKE_SYSTEM_NAME=Windows \
-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded \
-DCMAKE_C_FLAGS="/MT -fms-compatibility -fms-extensions --target=x86_64-pc-windows-msvc -imsvc $WINSDK/crt/include -imsvc $WINSDK/sdk/include/ucrt -imsvc $WINSDK/sdk/include/um -imsvc $WINSDK/sdk/include/shared" \
-DCMAKE_CXX_FLAGS="/MT -fms-compatibility -fms-extensions --target=x86_64-pc-windows-msvc -imsvc $WINSDK/crt/include -imsvc $WINSDK/sdk/include/ucrt -imsvc $WINSDK/sdk/include/um -imsvc $WINSDK/sdk/include/shared" \
-DCMAKE_ASM_MASM_FLAGS="-m64" \
-DCMAKE_EXE_LINKER_FLAGS="-libpath:$WINSDK/crt/lib/x86_64 -libpath:$WINSDK/sdk/lib/um/x86_64 -libpath:$WINSDK/sdk/lib/ucrt/x86_64"
echo "[info] Building..."
cmake --build "$BUILD_DIR" --config "$BUILD_TYPE" -j "$(nproc)"
echo "[info] Build complete! Output in $BUILD_DIR"
''; '';
}; };
@@ -451,6 +434,9 @@
# Unwrapped (just the Windows executables) # Unwrapped (just the Windows executables)
unwrapped = minecraft-lce-unwrapped; unwrapped = minecraft-lce-unwrapped;
# NuGet deps for FourKit (for debugging)
fourkit-nuget-deps = fourkitNugetDeps;
# Windows SDK (for debugging) # Windows SDK (for debugging)
windows-sdk = sdkWithSymlinks; windows-sdk = sdkWithSymlinks;
@@ -488,6 +474,9 @@
xwin xwin
rsync rsync
# .NET SDK for FourKit server
dotnetCorePackages.sdk_10_0
# Wine for testing # Wine for testing
winePackage winePackage
winetricks winetricks
@@ -500,8 +489,6 @@
cacert cacert
]; ];
XWIN_CACHE = "$HOME/.cache/xwin";
shellHook = '' shellHook = ''
echo "LCE-Revelations development shell" echo "LCE-Revelations development shell"
echo "" echo ""
@@ -510,13 +497,14 @@
echo " nix build .#server # Build server package" echo " nix build .#server # Build server package"
echo "" echo ""
echo "Development build (in-tree):" echo "Development build (in-tree):"
echo " minecraft-lce-build [source_dir] [Release|Debug]" echo " ./build-linux.sh [source_dir] [Release|Debug]"
echo "" echo ""
echo "Run:" echo "Run:"
echo " nix run .#client" echo " nix run .#client"
echo " nix run .#server" echo " nix run .#server"
echo "" echo ""
echo "Environment variables:" echo "Environment variables:"
echo " XWIN_CACHE - Windows SDK cache (default: \$PWD/.xwin)"
echo " MC_PORT - Server port (default: 25565)" echo " MC_PORT - Server port (default: 25565)"
echo " MC_BIND - Server bind address (default: 0.0.0.0)" echo " MC_BIND - Server bind address (default: 0.0.0.0)"
echo " MC_DATA_DIR - Persistent data directory" echo " MC_DATA_DIR - Persistent data directory"