diff --git a/Dockerfile.client b/Dockerfile.client index c9c5f8d..bb12935 100644 --- a/Dockerfile.client +++ b/Dockerfile.client @@ -1,23 +1,33 @@ -FROM arm32v7/debian:bullseye +# Runtime Base Environment +FROM arm32v7/debian:bullseye-slim AS runtime-base -# Install Dependencies +ENV DEBIAN_FRONTEND noninteractive RUN \ + # Install Runtime Dependencies apt-get update && \ - apt-get install -y libglvnd-dev libsdl1.2-dev libx11-dev build-essential cmake zlib1g-dev git curl libfreeimage-dev libglfw3-dev xinput libxfixes-dev + apt-get install -y --no-install-recommends libgles1 libx11-6 libsdl1.2debian zlib1g libfreeimage3 libglfw3 xinput libxfixes3 && \ + rm -rf /var/lib/apt/lists/* -# Setup GLES Location -RUN ln -s /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2 /usr/lib/libGLESv2.so +# Compile Environment +FROM runtime-base AS build + +ENV DEBIAN_FRONTEND noninteractive +RUN \ + # Install Dependencies + apt-get update && \ + apt-get install -y --no-install-recommends libgles-dev libx11-dev libxrandr-dev libsdl1.2-dev gcc g++ libc-dev make cmake zlib1g-dev git wget ca-certificates libfreeimage-dev libglfw3-dev xinput libxfixes-dev && \ + rm -rf /var/lib/apt/lists/* # Add Build Scripts ADD ./build /app/build WORKDIR /app -# Download MCPI -RUN ./build/download-minecraft-pi.sh - -# Build LibPNG12 -RUN ./build/build-libpng12.sh +RUN \ + # Download MCPI + ./build/download-minecraft-pi.sh && \ + # Build LibPNG12 + ./build/build-libpng12.sh # Add Code ADD . /app @@ -25,6 +35,14 @@ ADD . /app # Build Mods RUN ./build/build-mods.sh -WORKDIR ./minecraft-pi +# Runtime Environment +FROM runtime-base AS runtime + +# Include Exported Libraries +COPY --from=build /app/export / +# Include Mods +COPY --from=build /app/minecraft-pi /app/minecraft-pi + +WORKDIR /app/minecraft-pi ENTRYPOINT ./launcher diff --git a/build/build-libpng12.sh b/build/build-libpng12.sh index b6b665e..0e620a6 100755 --- a/build/build-libpng12.sh +++ b/build/build-libpng12.sh @@ -9,7 +9,7 @@ cd libpng ./configure --prefix /usr make -j$(nproc) -make install +make install DESTDIR=/app/export cd ../ diff --git a/build/download-minecraft-pi.sh b/build/download-minecraft-pi.sh index c1503ee..939c272 100755 --- a/build/download-minecraft-pi.sh +++ b/build/download-minecraft-pi.sh @@ -5,4 +5,4 @@ set -e URL="https://www.minecraft.net/content/dam/minecraft/edition-pi/minecraft-pi-0.1.1.tar.gz" mkdir minecraft-pi -curl "${URL}" | tar -xz --strip-components 1 -C minecraft-pi +wget -O - "${URL}" | tar -xz --strip-components 1 -C minecraft-pi diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index fe9f992..cf546a1 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -7,4 +7,9 @@ add_compile_options(-Wall -Wextra -Werror) add_library(bcm_host SHARED src/stubs/bcm_host.c) add_library(EGL SHARED src/stubs/EGL.c) +# MCPI Links Against GLESv2 But Requires GLESv1_CM +add_library(GLESv2 SHARED src/stubs/GLESv2.c) +target_link_libraries(GLESv2 GLESv1_CM) +target_link_options(GLESv2 PRIVATE "-Wl,--no-as-needed") + add_executable(launcher src/launcher.c) diff --git a/core/src/stubs/GLESv2.c b/core/src/stubs/GLESv2.c new file mode 100644 index 0000000..7733603 --- /dev/null +++ b/core/src/stubs/GLESv2.c @@ -0,0 +1 @@ +// NOP \ No newline at end of file diff --git a/debian/client/common/DEBIAN/postinst b/debian/client/common/DEBIAN/postinst index 7d4c2c6..dd6bffd 100755 --- a/debian/client/common/DEBIAN/postinst +++ b/debian/client/common/DEBIAN/postinst @@ -2,4 +2,4 @@ set -e -MCPI_FEATURES='' MCPI_USERNAME='' docker-compose -f /usr/share/minecraft-pi/client/docker-compose.yml pull +docker load < /usr/share/minecraft-pi/client/image.tar.gz \ No newline at end of file diff --git a/debian/client/common/usr/bin/minecraft-pi b/debian/client/common/usr/bin/minecraft-pi index d9888c2..846b511 100755 --- a/debian/client/common/usr/bin/minecraft-pi +++ b/debian/client/common/usr/bin/minecraft-pi @@ -33,7 +33,6 @@ xhost local:root # Update Docker Container export DOCKER_COMPOSE="docker-compose -f /usr/share/minecraft-pi/client/docker-compose.yml" -(${DOCKER_COMPOSE} pull || :) | zenity --class 'Minecraft - Pi edition' --progress --pulsate --no-cancel --auto-close --text 'Updating Minecraft...' # Run exec sg docker /usr/lib/minecraft-pi/run.sh \ No newline at end of file diff --git a/debian/client/native/DEBIAN/control b/debian/client/native/DEBIAN/control index 8e81eee..8a4fbb5 100644 --- a/debian/client/native/DEBIAN/control +++ b/debian/client/native/DEBIAN/control @@ -1,5 +1,5 @@ Package: minecraft-pi-native -Version: 1.0.0 +Version: ${VERSION} Maintainer: TheBrokenRail Description: Fun with Blocks Homepage: https://www.minecraft.net/en-us/edition/pi diff --git a/debian/client/virgl/DEBIAN/control b/debian/client/virgl/DEBIAN/control index 645cfe9..b0af2e4 100644 --- a/debian/client/virgl/DEBIAN/control +++ b/debian/client/virgl/DEBIAN/control @@ -1,5 +1,5 @@ Package: minecraft-pi-virgl -Version: 1.0.0 +Version: ${VERSION} Maintainer: TheBrokenRail Description: Fun with Blocks Homepage: https://www.minecraft.net/en-us/edition/pi diff --git a/debian/server/DEBIAN/control b/debian/server/DEBIAN/control index e81b0ae..5ca4545 100644 --- a/debian/server/DEBIAN/control +++ b/debian/server/DEBIAN/control @@ -1,5 +1,5 @@ Package: minecraft-pi-server -Version: 1.0.0 +Version: ${VERSION} Maintainer: TheBrokenRail Description: Fun with Blocks Homepage: https://www.minecraft.net/en-us/edition/pi diff --git a/debian/server/DEBIAN/postinst b/debian/server/DEBIAN/postinst index cc4a826..84f457f 100755 --- a/debian/server/DEBIAN/postinst +++ b/debian/server/DEBIAN/postinst @@ -2,4 +2,4 @@ set -e -MCPI_ROOT='' docker-compose -f /usr/share/minecraft-pi/server/docker-compose.yml pull +docker load < /usr/share/minecraft-pi/server/image.tar.gz \ No newline at end of file diff --git a/debian/server/usr/bin/minecraft-pi-server b/debian/server/usr/bin/minecraft-pi-server index 00e4bd7..093053a 100755 --- a/debian/server/usr/bin/minecraft-pi-server +++ b/debian/server/usr/bin/minecraft-pi-server @@ -6,5 +6,4 @@ export MCPI_ROOT="${PWD}" # Launch Minecraft DOCKER_COMPOSE="docker-compose -f /usr/share/minecraft-pi/server/docker-compose.yml" -${DOCKER_COMPOSE} pull || : ${DOCKER_COMPOSE} run --rm minecraft-pi-server diff --git a/mods/CMakeLists.txt b/mods/CMakeLists.txt index afd10f0..2c04373 100644 --- a/mods/CMakeLists.txt +++ b/mods/CMakeLists.txt @@ -2,20 +2,24 @@ cmake_minimum_required(VERSION 3.13.0) project(mods) -add_compile_options(-g -Wall -Wextra -Werror) +add_compile_options(-Wall -Wextra -Werror) add_link_options(-Wl,--no-undefined) +# Disable C++11 String ABI add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) add_subdirectory(../core core) +# Include Libraries Exported To Runtime Environment +include_directories(/app/export/include) + +# Include Headers include_directories(include) +# Find GLFW find_package(glfw3 3.3 REQUIRED) add_library(compat SHARED src/compat/compat.c) -target_link_libraries(compat feature input screenshot SDL GLESv1_CM GLESv2 X11 dl glfw Xfixes) -# Force GLESv1 Link -target_link_options(compat PRIVATE "-Wl,--no-as-needed") +target_link_libraries(compat feature input screenshot SDL GLESv1_CM X11 dl glfw Xfixes) add_library(readdir SHARED src/compat/readdir.c) diff --git a/mods/src/compat/compat.c b/mods/src/compat/compat.c index 831405e..d3ac0eb 100644 --- a/mods/src/compat/compat.c +++ b/mods/src/compat/compat.c @@ -22,22 +22,9 @@ #include "../init/init.h" static GLFWwindow *glfw_window; -static Display *x11_display; -static Window x11_window; -static Window x11_root_window; -static int window_loaded = 0; static int is_server = 0; -// Get Reference To X Window -static void store_x11_window() { - x11_display = glfwGetX11Display(); - x11_window = glfwGetX11Window(glfw_window); - x11_root_window = RootWindow(x11_display, DefaultScreen(x11_display)); - - window_loaded = 1; -} - // Handle GLFW Error static void glfw_error(__attribute__((unused)) int error, const char *description) { ERR("GLFW Error: %s", description); @@ -211,8 +198,6 @@ HOOK(SDL_WM_SetCaption, void, (const char *title, __attribute__((unused)) const glfwSetMouseButtonCallback(glfw_window, glfw_click); glfwSetScrollCallback(glfw_window, glfw_scroll); - store_x11_window(); - glfwMakeContextCurrent(glfw_window); } } @@ -247,7 +232,7 @@ static void toggle_fullscreen() { } else { glfwGetWindowSize(glfw_window, &old_width, &old_height); glfwGetWindowPos(glfw_window, &old_x, &old_y); - Screen *screen = DefaultScreenOfDisplay(x11_display); + Screen *screen = DefaultScreenOfDisplay(glfwGetX11Display()); glfwSetWindowMonitor(glfw_window, glfwGetPrimaryMonitor(), 0, 0, WidthOfScreen(screen), HeightOfScreen(screen), GLFW_DONT_CARE); } @@ -334,14 +319,14 @@ HOOK(SDL_WM_GrabInput, SDL_GrabMode, (SDL_GrabMode mode)) { glfwSetInputMode(glfw_window, GLFW_RAW_MOUSE_MOTION, mode == SDL_GRAB_OFF ? GLFW_FALSE : GLFW_TRUE); // GLFW Cursor Hiding is Broken - if (window_loaded) { - if (mode == SDL_GRAB_OFF) { - XFixesShowCursor(x11_display, x11_window); - } else { - XFixesHideCursor(x11_display, x11_window); - } - XFlush(x11_display); + Display *x11_display = glfwGetX11Display(); + Window x11_window = glfwGetX11Window(glfw_window); + if (mode == SDL_GRAB_OFF) { + XFixesShowCursor(x11_display, x11_window); + } else { + XFixesHideCursor(x11_display, x11_window); } + XFlush(x11_display); } return mode == SDL_GRAB_QUERY ? (glfwGetInputMode(glfw_window, GLFW_CURSOR) == GLFW_CURSOR_NORMAL ? SDL_GRAB_OFF : SDL_GRAB_ON) : mode; } @@ -364,12 +349,9 @@ HOOK(SDL_SetVideoMode, SDL_Surface *, (__attribute__((unused)) int width, __attr HOOK(XTranslateCoordinates, int, (Display *display, Window src_w, Window dest_w, int src_x, int src_y, int *dest_x_return, int *dest_y_return, Window *child_return)) { if (!is_server) { + // Use X11 ensure_XTranslateCoordinates(); - if (window_loaded) { - return (*real_XTranslateCoordinates)(x11_display, x11_window, x11_root_window, src_x, src_y, dest_x_return, dest_y_return, child_return); - } else { - return (*real_XTranslateCoordinates)(display, src_w, dest_w, src_x, src_y, dest_x_return, dest_y_return, child_return); - } + return (*real_XTranslateCoordinates)(display, src_w, dest_w, src_x, src_y, dest_x_return, dest_y_return, child_return); } else { // No X11 *dest_x_return = src_x; @@ -380,12 +362,9 @@ HOOK(XTranslateCoordinates, int, (Display *display, Window src_w, Window dest_w, HOOK(XGetWindowAttributes, int, (Display *display, Window w, XWindowAttributes *window_attributes_return)) { if (!is_server) { + // Use X11 ensure_XGetWindowAttributes(); - if (window_loaded) { - return (*real_XGetWindowAttributes)(x11_display, x11_window, window_attributes_return); - } else { - return (*real_XGetWindowAttributes)(display, w, window_attributes_return); - } + return (*real_XGetWindowAttributes)(display, w, window_attributes_return); } else { // No X11 XWindowAttributes attributes; @@ -406,6 +385,9 @@ HOOK(SDL_GetWMInfo, int, (SDL_SysWMinfo *info)) { SDL_SysWMinfo ret; ret.info.x11.lock_func = x11_nop; ret.info.x11.unlock_func = x11_nop; + ret.info.x11.display = glfwGetX11Display(); + ret.info.x11.window = glfwGetX11Window(glfw_window); + ret.info.x11.wmwindow = ret.info.x11.window; *info = ret; return 1; } diff --git a/scripts/package.sh b/scripts/package.sh index 8f0503d..82e27f8 100755 --- a/scripts/package.sh +++ b/scripts/package.sh @@ -1,5 +1,8 @@ #!/bin/sh +# Current Version +DEB_VERSION='1.0.0' + set -e # Docker Messes With SetGID @@ -9,19 +12,47 @@ chmod -R g-s debian rm -rf out mkdir -p out/deb +# Prepare +rm -rf debian/tmp +mkdir debian/tmp + +# Set Version +prepare_version() { + sed -i 's/${VERSION}/'"${DEB_VERSION}.$(date '+%Y%m%d.%H%M')"'/g' "$1/DEBIAN/control" +} + # Package Client DEBs +docker save thebrokenrail/minecraft-pi:client | gzip > debian/tmp/client-image.tar.gz package_client() { - rm -rf debian/tmp - rsync -r debian/client/common/ debian/tmp - rsync -r "debian/client/$1/" debian/tmp - dpkg -b debian/tmp out/deb - rm -rf debian/tmp + # Clean + rm -rf "debian/tmp/$1" + # Prepare + rsync -r debian/client/common/ "debian/tmp/$1" + rsync -r "debian/client/$1/" "debian/tmp/$1" + cp debian/tmp/client-image.tar.gz "debian/tmp/$1/usr/share/minecraft-pi/client/image.tar.gz" + prepare_version "debian/tmp/$1" + # Build + dpkg -b "debian/tmp/$1" out/deb } package_client virgl package_client native # Package Server DEB -dpkg -b debian/server out/deb +docker save thebrokenrail/minecraft-pi:server | gzip > debian/tmp/server-image.tar.gz +package_server() { + # Clean + rm -rf debian/tmp/server + # Prepare + rsync -r debian/server/ debian/tmp/server + cp debian/tmp/server-image.tar.gz debian/tmp/server/usr/share/minecraft-pi/server/image.tar.gz + prepare_version debian/tmp/server + # Build + dpkg -b debian/tmp/server out/deb +} +package_server + +# Clean Up +rm -rf debian/tmp # Export Libraries mkdir -p out/lib