diff --git a/build.sh b/build.sh index a0c2f8f..ee16d87 100755 --- a/build.sh +++ b/build.sh @@ -55,7 +55,7 @@ if [[ -n "${BUILD_SH_IN_MANYLINUX:-}" ]]; then if command -v dnf &>/dev/null; then dnf install -y -q \ libX11-devel libXcursor-devel libXrandr-devel libXinerama-devel libXi-devel \ - mesa-libGL-devel mesa-libEGL-devel mesa-libGLES-devel \ + mesa-libGL-devel mesa-libEGL-devel mesa-libGLES-devel bison flex \ wayland-devel wayland-protocols-devel libxkbcommon-devel fi fi diff --git a/raylib/build.sh b/raylib/build.sh index c9cbdeb..253db91 100755 --- a/raylib/build.sh +++ b/raylib/build.sh @@ -7,11 +7,7 @@ cd "$DIR" INSTALL_DIR="$DIR/raylib/install" NJOBS="$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 2)" -if command -v ccache &>/dev/null; then - CC="ccache ${CC:-cc}" -else - CC="${CC:-cc}" -fi +CC="ccache ${CC:-cc}" CXX="ccache ${CXX:-c++}" is_linux_aarch64() { [[ "$(uname)" == "Linux" && ( "$(uname -m)" == "aarch64" || "$(uname -m)" == "arm64" ) ]] @@ -35,6 +31,8 @@ esac # Clone and build raylib C library RAYLIB_COMMIT="caa64e15ac20a47804a8048029c921ac091fef12" +MESA_VERSION="26.2.1" +LLVM_VERSION="22.1.8" if [ ! -d "raylib-src/.git" ]; then rm -rf raylib-src @@ -91,6 +89,42 @@ for backend in $BACKENDS; do build_raylib "$(backend_platform "$backend")" "libraylib_${backend}.a" done +if [ "$(uname)" == "Linux" ] && [[ " $BACKENDS " == *" headless "* ]]; then + if [ ! -d "llvm-src/.git" ]; then + rm -rf llvm-src + git clone --depth 1 --filter=blob:none --sparse https://github.com/llvm/llvm-project.git llvm-src + git -C llvm-src sparse-checkout set llvm cmake third-party + fi + git -C llvm-src fetch --depth 1 origin "llvmorg-$LLVM_VERSION" + git -C llvm-src checkout --force FETCH_HEAD + cmake -S llvm-src/llvm -B llvm-src/build -G Ninja -DCMAKE_MAKE_PROGRAM="$(command -v ninja)" -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_INSTALL_PREFIX="$DIR/llvm-src/prefix" \ + -DLLVM_TARGETS_TO_BUILD=Native -DLLVM_BUILD_TOOLS=OFF -DLLVM_TOOL_LLVM_CONFIG_BUILD=ON -DLLVM_INCLUDE_TESTS=OFF \ + -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_BENCHMARKS=OFF -DLLVM_INCLUDE_DOCS=OFF -DLLVM_ENABLE_BINDINGS=OFF \ + -DLLVM_ENABLE_ZLIB=OFF -DLLVM_ENABLE_ZSTD=OFF -DLLVM_ENABLE_LIBXML2=OFF -DLLVM_ENABLE_FFI=OFF -DLLVM_ENABLE_LIBEDIT=OFF \ + -DLLVM_ENABLE_ASSERTIONS=OFF -DLLVM_ENABLE_UNWIND_TABLES=OFF \ + -DCMAKE_C_FLAGS="-ffunction-sections -fdata-sections" -DCMAKE_CXX_FLAGS="-ffunction-sections -fdata-sections" >/dev/null + ninja -C llvm-src/build install llvm-config >/dev/null + cp llvm-src/build/bin/llvm-config llvm-src/prefix/bin/ + + if [ ! -d "mesa-src/.git" ]; then + rm -rf mesa-src + git clone --depth 1 https://gitlab.freedesktop.org/mesa/mesa.git mesa-src + fi + git -C mesa-src fetch --depth 1 origin "mesa-$MESA_VERSION" + git -C mesa-src checkout --force FETCH_HEAD + CC="$CC" CXX="$CXX" PATH="$DIR/llvm-src/prefix/bin:$PATH" meson setup mesa-src mesa-src/build --reconfigure --prefix="$DIR/mesa-src/build/prefix" --libdir=lib \ + -Db_ndebug=true -Dcpp_rtti=false -Dc_link_args=-Wl,--gc-sections -Dcpp_link_args=-Wl,--gc-sections \ + -Dplatforms= -Degl=enabled -Dgles1=disabled -Dgles2=enabled -Dopengl=false -Dglx=disabled \ + -Dgbm=disabled -Dglvnd=disabled -Dgallium-drivers=llvmpipe -Dvulkan-drivers= -Dshared-llvm=disabled \ + -Dlibunwind=disabled -Dzstd=disabled -Dvalgrind=disabled -Dbuild-tests=false \ + -Dxmlconfig=disabled -Dexpat=disabled -Dshader-cache=disabled + ninja -C mesa-src/build install >/dev/null + cp mesa-src/build/prefix/lib/{libEGL.so.1,libGLESv2.so.2,libgallium-$MESA_VERSION.so} "$INSTALL_DIR/lib/" + cp -L "$(cc -print-file-name=libdrm.so.2)" "$INSTALL_DIR/lib/" + patchelf --set-rpath '$ORIGIN' "$INSTALL_DIR"/lib/{libEGL.so.1,libGLESv2.so.2,libgallium-$MESA_VERSION.so} + strip "$INSTALL_DIR"/lib/*.so* +fi + # Download raygui header RAYGUI_COMMIT="1e03efca48c50c5ea4b4a053d5bf04bad58d3e43" curl -fsSLo "$INSTALL_DIR/include/raygui.h" \ diff --git a/raylib/build_cffi.py b/raylib/build_cffi.py index e0350f1..257b409 100644 --- a/raylib/build_cffi.py +++ b/raylib/build_cffi.py @@ -88,7 +88,7 @@ def build_ffi(): else: print("BUILDING FOR LINUX") extra_link_args = [ - raylib_archive, + raylib_archive, f'-L{RAYLIB_LIB_PATH}', '-Wl,--as-needed', '-lm', '-lpthread', '-lrt', '-ldl', '-latomic', *BACKEND_LINK_ARGS[RAYLIB_BACKEND], ] diff --git a/raylib/pyproject.toml b/raylib/pyproject.toml index c23d4c2..3cd449b 100644 --- a/raylib/pyproject.toml +++ b/raylib/pyproject.toml @@ -1,5 +1,5 @@ [build-system] -requires = ["setuptools>=70.1", "cffi>=1.17.1"] +requires = ["setuptools>=70.1", "cffi>=1.17.1", "meson", "ninja", "mako", "pyyaml"] build-backend = "setuptools.build_meta" [project] @@ -17,4 +17,4 @@ include = ["raylib", "pyray"] namespaces = false [tool.setuptools.package-data] -raylib = ["_raylib_cffi*.so", "install/include/*.h", "install/lib/*.a"] +raylib = ["_raylib_cffi*.so", "install/include/*.h", "install/lib/*.a", "install/lib/*.so*"] diff --git a/raylib/raylib/__init__.py b/raylib/raylib/__init__.py index 25a1724..67f0423 100644 --- a/raylib/raylib/__init__.py +++ b/raylib/raylib/__init__.py @@ -1,7 +1,7 @@ import importlib import os -from ._backend import BACKEND_ARCHIVES, BACKEND_CFFI_MODULES, detect_backend, host_backends +from ._backend import BACKEND_ARCHIVES, BACKEND_CFFI_MODULES, HEADLESS, detect_backend, host_backends from .version import __version__ DIR = os.path.join(os.path.dirname(__file__), "install") @@ -25,6 +25,12 @@ def smoketest(): assert os.path.isfile(os.path.join(INCLUDE_DIR, header)), f"{header} not found" for archive in _expected_archives(): assert os.path.isfile(os.path.join(LIB_DIR, archive)), f"{archive} not found" + if _BACKEND == HEADLESS: + rl.InitWindow(64, 64, b"") + rl.BeginDrawing() + rl.ClearBackground((0, 0, 0, 255)) + rl.EndDrawing() + rl.CloseWindow() def _load_cffi(): diff --git a/raylib/raylib/_backend.py b/raylib/raylib/_backend.py index 5a16c11..145b5ac 100644 --- a/raylib/raylib/_backend.py +++ b/raylib/raylib/_backend.py @@ -22,7 +22,7 @@ BACKEND_LINK_ARGS = { DESKTOP: ("-lGL", "-lX11"), COMMA: ("-lGLESv2", "-lEGL", "-lgbm", "-ldrm"), - HEADLESS: ("-lGLESv2", "-lEGL"), + HEADLESS: ("-lGLESv2", "-lEGL", "-Wl,-rpath,$ORIGIN/install/lib"), } COMMA_DEVICE_MARKERS = ("/AGNOS", "/TICI") @@ -50,5 +50,6 @@ def detect_backend(environ=None, exists=os.path.exists): if any(exists(marker) for marker in COMMA_DEVICE_MARKERS): return COMMA - + if HEADLESS in host_backends() and not environ.get("DISPLAY"): + return HEADLESS return DEFAULT_BACKEND diff --git a/test_wheels_in_image.sh b/test_wheels_in_image.sh index 995aaac..c89ccd7 100755 --- a/test_wheels_in_image.sh +++ b/test_wheels_in_image.sh @@ -34,7 +34,8 @@ docker run --rm -v "$PWD:/work" -w /work wheeltest bash -lc ' pip install dist/*.whl for toml in */pyproject.toml; do module="$(basename "$(dirname "$toml")" | tr "-" "_")" - python -c "import $module; $module.smoketest()" && echo "$module: OK" + python -c "import $module; $module.smoketest()" || exit 1 + echo "$module: OK" done '