#!/bin/bash zigbuild=zig-linux-x86_64-0.11.0-dev.514+4be1bb4aa.tar.xz zigversion=$(echo $zigbuild | cut -d '-' -f 4) if [ -e toolchain-zig ] ; then echo "ERROR: A toolchain-zig directory already exists, aborting install" exit 1 fi parentdir=$(pwd) mkdir -p toolchain-zig toolchain-zig-dl cd toolchain-zig # Zig install if [ ! -e ../toolchain-zig-dl/$zigbuild ] ; then (cd ../toolchain-zig-dl && wget https://ziglang.org/builds/$zigbuild) fi xz -dc <../toolchain-zig-dl/$zigbuild | tar -xvf - ln -s ${zigbuild/.tar.xz/} zig-$zigversion cat > env.sh <<'EOF' #!/bin/bash echo "Reminder: this script has to be used with source (.) instead of exec" EOF echo "export PATH=\$PATH:$parentdir/toolchain-zig/zig-$zigversion" >> env.sh chmod 755 env.sh # Convenience scripts cat > compile.sh </dev/null exec zig cc "-I$parentdir/toolchain-zig/windows-msys2-mingw/include/" "-I$parentdir/toolchain-zig/windows-msys2-mingw/include/w32api/" "-I$parentdir/toolchain-zig/windows-msys2-mingw/include/SDL2" "-I$parentdir/toolchain-zig/windows-msys2-mingw/include/SDL" "-I$parentdir/toolchain-zig/sdl3-windows/SDL3/include" "-I$parentdir/toolchain-zig/sdl3-windows/SDL_ttf/include" "\$@" -target x86_64-windows-gnu EOF chmod 755 compile.sh cat > compile-cpp.sh </dev/null exec zig c++ "-I$parentdir/toolchain-zig/windows-msys2-mingw/include/" "-I$parentdir/toolchain-zig/windows-msys2-mingw/include/w32api/" "-I$parentdir/toolchain-zig/windows-msys2-mingw/include/SDL2" "-I$parentdir/toolchain-zig/windows-msys2-mingw/include/SDL" "-I$parentdir/toolchain-zig/sdl3-windows/SDL3/include" "-I$parentdir/toolchain-zig/sdl3-windows/SDL_ttf/include" "\$@" -target x86_64-windows-gnu EOF chmod 755 compile-cpp.sh cat > link.sh </dev/null name="\${1/.exe/}" shift convert "\$icon" "\${icon/.png/-buildiconobject.ico}" && \ echo "1 ICON \"\${icon/.png/-buildiconobject.ico}\"" > "\${icon/.png/-buildiconobject.rc}" && \ x86_64-w64-mingw32-windres --preprocessor /usr/bin/cpp "\${icon/.png/-buildiconobject.rc}" "\${icon/.png/-buildiconobject.o}" && \ zig build-exe --subsystem windows "\$@" \${icon/.png/-buildiconobject.o} -L$parentdir/toolchain-zig/windows-msys2-mingw/lib/ -L$parentdir/toolchain-zig/windows-msys2-mingw/lib/w32api $parentdir/toolchain-zig/sdl3-windows/libSDL3.dll.a $parentdir/toolchain-zig/sdl3-windows/libSDL3_ttf.dll.a $parentdir/toolchain-zig/sdl3-windows/libfreetype.a -lgdi32 -lwinmm -lsetupapi -lmincore -lwindowsapp -limm32 -lversion -lgraphite2 -lpng -lbrotlidec -lbrotlicommon -lharfbuzz -lstdc++ -lbz2 -lz --name \$name -target x86_64-windows-gnu && rm \${name}.lib \${name}.pdb res=\$? rm "\${icon/.png/-buildiconobject.ico}" "\${icon/.png/-buildiconobject.rc}" "\${icon/.png/-buildiconobject.o}" if [ \$tmpicon -eq 1 ] ; then rm "\$icon" ; fi exit \$res EOF chmod 755 link.sh # msys2 install mkdir -p windows-msys2-mingw cat > deps.txt <<'EOF' https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-aom-3.5.0-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-brotli-1.0.9-5-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-bzip2-1.0.8-2-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-ca-certificates-20211016-3-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-dav1d-1.0.0-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-expat-2.5.0-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-flac-1.4.2-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-fluidsynth-2.3.0-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-freetype-2.12.1-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-gcc-libs-12.2.0-6-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-gettext-0.21-3-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-giflib-5.2.1-3-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-glib2-2.74.3-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-gmp-6.2.1-3-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-graphite2-1.3.14-2-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-harfbuzz-5.3.1-2-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-highway-1.0.2-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-imath-3.1.6-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-jbigkit-2.1-4-any.pkg.tar.xz https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-lcms2-2.14-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-lerc-4.0.0-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libavif-0.11.1-3-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libdeflate-1.15-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libffi-3.4.4-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libiconv-1.17-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libjpeg-turbo-2.1.4-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libjxl-0.7.0-2-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libmodplug-0.8.9.0-4-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libogg-1.3.5-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libpng-1.6.39-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libsndfile-1.1.0-3-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libsystre-1.0.1-4-any.pkg.tar.xz https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libtasn1-4.19.0-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libtiff-4.4.0-6-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libtre-git-r128.6fb7206-2-any.pkg.tar.xz https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libvorbis-1.3.7-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libwebp-1.2.4-2-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libwinpthread-git-10.0.0.r157.gd295924f0-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-libyuv-1844.r2374.f9fda6e7-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-mpc-1.2.1-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-mpdecimal-2.5.1-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-mpfr-4.1.0.p13-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-mpg123-1.31.1-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-ncurses-6.3-6-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-openexr-3.1.5-2-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-openssl-1.1.1.s-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-opus-1.3.1-5-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-opusfile-0.12-2-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-p11-kit-0.24.1-3-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-pcre2-10.40-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-portaudio-1~19.7.0-4-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-python-3.10.8-2-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-rav1e-0.6.1-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-SDL2-2.26.0-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-SDL2_image-2.6.2-3-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-SDL2_mixer-2.6.2-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-SDL2_ttf-2.20.1-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-sqlite3-3.40.0-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-svt-av1-1.3.0-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-tcl-8.6.12-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-tzdata-2022g-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-vulkan-headers-1.3.236-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-vulkan-loader-1.3.236-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-wineditline-2.205-3-any.pkg.tar.xz https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-xz-5.2.9-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-zlib-1.2.13-2-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-zstd-1.5.2-2-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-winpthreads-git-12.0.0.r351.gcdf6b16b8-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-cmake-3.30.5-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-ninja-1.12.1-1-any.pkg.tar.zst https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-pkg-config-0.29.2-6-any.pkg.tar.zst https://mirror.msys2.org/msys/x86_64/msys2-w32api-headers-10.0.0.r16.g49a56d453-1-x86_64.pkg.tar.zst https://mirror.msys2.org/msys/x86_64/msys2-w32api-runtime-10.0.0.r16.g49a56d453-1-x86_64.pkg.tar.zst https://mirror.msys2.org/msys/x86_64/perl-5.38.2-2-x86_64.pkg.tar.zst EOF for i in $(cat deps.txt) ; do if [ ! -e ../toolchain-zig-dl/$(basename $i) ] ; then (cd ../toolchain-zig-dl && wget $i ) fi done for i in $(cd ../toolchain-zig-dl && find . -maxdepth 1 -name "*.zst") ; do ( mkdir -p t ; cd t ; cat ../../toolchain-zig-dl/$i | zstd -dc | tar -xvf - ; find . -maxdepth 1 -type d -print | grep -v "^\.\$" | while read l ; do (cd $l && tar -cf - . | (cd $parentdir/toolchain-zig/windows-msys2-mingw && tar -xvf - ) ) ; done ) ; rm -rf t ; done for i in $(cd ../toolchain-zig-dl && find . -maxdepth 1 -name "*.xz") ; do ( mkdir -p t ; cd t ; cat ../../toolchain-zig-dl/$i | xz -dc | tar -xvf - ; find . -maxdepth 1 -type d -print | grep -v "^\.\$" | while read l ; do (cd $l && tar -cf - . | (cd $parentdir/toolchain-zig/windows-msys2-mingw && tar -xvf - ) ) ; done ) ; rm -rf t ; done cat > add-zst.sh <<'EOF' #!/bin/bash if [ "m$1" == "m" ] || [ "m$1" == "m--help" ] || [ ! -f "$1" ] ; then echo "Syntax: $0 filename.pkg.tar.zst" exit 0 fi i="$1" ( mkdir -p t ; cd t ; cat ../$i | zstd -dc | tar -xvf - ; find . -maxdepth 1 -type d -print | grep -v "^\.\$" | while read l ; do EOF echo " (cd \$l && tar -cf - . | (cd $parentdir/toolchain-zig/windows-msys2-mingw && tar -xvf - ) ) ; done ) ; rm -rf t " >> add-zst.sh cat > add-xz.sh <<'EOF' #!/bin/bash if [ "m$1" == "m" ] || [ "m$1" == "m--help" ] || [ ! -f "$1" ] ; then echo "Syntax: $0 filename.pkg.tar.xz" exit 0 fi i="$1" ( mkdir -p t ; cd t ; cat ../$i | xz -dc | tar -xvf - ; find . -maxdepth 1 -type d -print | grep -v "^\.\$" | while read l ; do EOF echo " (cd $l && tar -cf - . | (cd $parentdir/toolchain-zig/windows-msys2-mingw && tar -xvf - ) ) ; done ) ; rm -rf t " >> add-xz.sh chmod a+x add-xz.sh add-zst.sh cd .. # Check for windres if ! which x86_64-w64-mingw32-windres >/dev/null 2>/dev/null; then echo "Please, install windres manually using your distribution, i.e.:" >> tooldchain-zig/error.log echo "sudo apt-get install binutils-mingw-w64-x86-64" >> tooldchain-zig/error.log fi if ! which convert >/dev/null 2>/dev/null; then echo "Please, install imagemagick manually using your distribution, i.e.:" >> tooldchain-zig/error.log echo "sudo apt-get install imagemagick" >> tooldchain-zig/error.log fi # SDL3 for mingw mkdir -p "$parentdir/toolchain-zig/sdl3-windows" cd "$parentdir/toolchain-zig/sdl3-windows" cat > setup.sh <<'SeTuPeOf' #!/bin/bash #SDL3 if [ ! -e ../../toolchain-zig-dl/SDL3-preview-3.1.6.tgz ] ; then wget https://github.com/libsdl-org/SDL/archive/refs/tags/preview-3.1.6.tar.gz -O ../../toolchain-zig-dl/SDL3-preview-3.1.6.tgz fi tar -xvzf ../../toolchain-zig-dl/SDL3-preview-3.1.6.tgz mv SDL3-3.1.6 SDL3 cd SDL3 ln -s PARENTDIR/toolchain-zig/compile.sh x86_64-w64-mingw32-gcc ln -s PARENTDIR/toolchain-zig/compile-cpp.sh x86_64-w64-mingw32-g++ cat >> src/winresrc.h <<'EOF' #define LANG_ENGLISH 0x09 #define SUBLANG_ENGLISH_US 0x01 EOF PATH=$(pwd):$PATH cmake -S . -B build -DBUILD_SHARED_LIBS=ON -DCMAKE_TOOLCHAIN_FILE=build-scripts/cmake-toolchain-mingw64-x86_64.cmake -DCMAKE_MAKE_PROGRAM=make -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DCMAKE_CXX_COMPILER=x86_64-w64-mingw32-g++ && cmake --build build cd .. cp ./SDL3/build/SDL3.dll . cp ./SDL3/build/libSDL3.dll.a . #SDL3_ttf if [ -e ../../toolchain-zig-dl/SDL_ttf.tgz ] ; then tar -xf ../../toolchain-zig-dl/SDL_ttf.tgz else git clone --recurse-submodules -j4 https://github.com/libsdl-org/SDL_ttf.git tar -cf ../../toolchain-zig-dl/SDL_ttf.tgz SDL_ttf fi cd SDL_ttf sed -i "s/SDL_REQUIRED_VERSION 3\.1\.5/SDL_REQUIRED_VERSION 3.1.6/g" CMakeLists.txt ln -s PARENTDIR/toolchain-zig/compile.sh x86_64-w64-mingw32-gcc ln -s PARENTDIR/toolchain-zig/compile-cpp.sh x86_64-w64-mingw32-g++ mkdir -p build/external/freetype/include cat >> build/external/freetype/include/windows.h <<'EOF' #define VS_FF_DEBUG 0x01L #define VFT_DLL 0x00000002L #define VFT_STATIC_LIB 0x00000007L #define VS_FF_DEBUG 0x01L #define VS_FFI_FILEFLAGSMASK 0x0000003fL EOF cat >> build/external/freetype/include/winresrc.h <<'EOF' #define LANG_ENGLISH 0x09 #define SUBLANG_ENGLISH_US 0x01 EOF cat >> freetype_Use_SDL_StepBackUTF8.patch <<'EOF' diff --git a/examples/editbox.c b/examples/editbox.c index f96d5087..b2028178 100644 --- a/examples/editbox.c +++ b/examples/editbox.c @@ -633,19 +633,14 @@ void EditBox_Backspace(EditBox *edit) return; } - const char *start = &edit->text->text[edit->cursor]; - const char *current = start; - /* Step back over the previous UTF-8 character */ - do { - if (current == edit->text->text) { - break; - } - --current; - } while ((*current & 0xC0) == 0x80); - - int length = (int)(start - current); - TTF_DeleteTextString(edit->text, edit->cursor - length, length); - edit->cursor -= length; + if (edit->cursor > 0) { + const char *start = &edit->text->text[edit->cursor]; + const char *next = start; + SDL_StepBackUTF8(edit->text->text, &next); + int length = (int)(uintptr_t)(start - next); + TTF_DeleteTextString(edit->text, edit->cursor - length, length); + edit->cursor -= length; + } } EOF # revert patch https://discourse.libsdl.org/t/sdl-ttf-use-sdl-stepbackutf8/54854 #( patch -R -p1 < ./freetype_Use_SDL_StepBackUTF8.patch ) sed -i "s/vendored_default FALSE/vendored_default TRUE/g" CMakeLists.txt PATH=$(pwd):$PATH cmake -S . -B build -DBUILD_SHARED_LIBS=ON -DCMAKE_TOOLCHAIN_FILE=build-scripts/cmake-toolchain-mingw64-x86_64.cmake -DCMAKE_MAKE_PROGRAM=make -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DCMAKE_CXX_COMPILER=x86_64-w64-mingw32-g++ -DSDL3_DIR=PARENTDIR/toolchain-zig/sdl3-windows/SDL3/build && cmake --build build cd .. cp SDL_ttf/build/SDL3_ttf.dll . cp SDL_ttf/build/libSDL3_ttf.dll.a . cp SDL_ttf/build/external/freetype/libfreetype.a . SeTuPeOf sed -i "s#PARENTDIR#$parentdir#g" setup.sh chmod a+x setup.sh ./setup.sh cd .. # Show errors if tehre is an error.log file if [ -e toolchain-zig/error.log ] ; then cat toolchain-zig/error.log fi # Success message echo "" echo "Installation complete." echo "To use the zig toolchain, first include env.sh with \". toolchain-zig/env.sh\"" echo "( alternative: use toolchain-zig/compile.sh and toolchain-zig/link.sh )"