#!/bin/sh # windows/build-msi.sh — produce lmcp-.msi on Linux via wixl. # # This is the first-time-discovered cross-build path: download Lua 5.4 # Win64 binaries from LuaBinaries, cross-compile LuaSocket with mingw-w64, # stage windows/pkg/lua/, then invoke wixl on the WiX manifest. # # Avoids the VM106-clone + WiX-on-Windows path entirely. ~1 minute on a # warm cache; ~3-5 minutes cold (downloads ~700 KB + cross-compiles). # # Prereqs (apt install on Debian aarch64): # apt-get install -y wixl unzip gcc-mingw-w64-x86-64 binutils-mingw-w64-x86-64 \ # mingw-w64-x86-64-dev # # Usage: ./build-msi.sh [output_dir] # Output: $output_dir/lmcp-.msi (default: $PWD) # # Version comes from windows/lmcp.wxs Version="…" attribute. set -eu here=$(dirname "$(readlink -f "$0")") root=$(cd "$here/.." && pwd) out_dir=${1:-$PWD} work=$(mktemp -d /tmp/lmcp-msi-XXXXXX) trap "rm -rf $work" EXIT # Versions — bump as upstream releases. LUA_VER=5.4.2 LUASOCKET_VER=3.1.0 # Pull current lmcp version from the WiX manifest. lmcp_ver=$(sed -n 's/.*Version="\([^"]*\)".*/\1/p' "$here/lmcp.wxs" | head -1) [ -n "$lmcp_ver" ] || { echo "build-msi.sh: cannot parse Version from lmcp.wxs" >&2; exit 1; } echo "build-msi.sh: lmcp $lmcp_ver, lua $LUA_VER, luasocket $LUASOCKET_VER" echo "==> 1/5 sync lmcp .lua sources into pkg/" "$here/sync.sh" echo "==> 2/5 fetch lua $LUA_VER win64 binaries + dev library" cd "$work" curl -sSLf -o lua-bin.zip \ "https://downloads.sourceforge.net/project/luabinaries/${LUA_VER}/Tools%20Executables/lua-${LUA_VER}_Win64_bin.zip" curl -sSLf -o lua-lib.zip \ "https://downloads.sourceforge.net/project/luabinaries/${LUA_VER}/Windows%20Libraries/Dynamic/lua-${LUA_VER}_Win64_dllw6_lib.zip" mkdir -p luabin lualib include/lua/54 include/lua54 bin/lua/54 bin/lua54 lib/lua/54 lib/lua54 unzip -q -o lua-bin.zip -d luabin unzip -q -o lua-lib.zip -d lualib cp lualib/include/*.h include/lua/54/ cp lualib/include/*.h include/lua54/ cp lualib/liblua54.a lib/lua/54/ cp lualib/liblua54.a lib/lua54/ cp lualib/lua54.dll bin/lua/54/ cp lualib/lua54.dll bin/lua54/ echo "==> 3/5 cross-compile LuaSocket $LUASOCKET_VER for win64" curl -sSLf -o luasocket.tar.gz \ "https://github.com/lunarmodules/luasocket/archive/refs/tags/v${LUASOCKET_VER}.tar.gz" tar xzf luasocket.tar.gz cd "luasocket-${LUASOCKET_VER}" make -s PLAT=mingw \ CC=x86_64-w64-mingw32-gcc \ LD=x86_64-w64-mingw32-gcc \ LUAV=54 \ LUAINC_mingw_base="$work/include" \ LUALIB_mingw_base="$work/bin" \ > /dev/null echo "==> 4/5 stage pkg/lua/" pkg_lua="$here/pkg/lua" rm -rf "$pkg_lua" mkdir -p "$pkg_lua/socket" "$pkg_lua/mime" # WiX manifest expects "lua.exe" (not "lua54.exe"). cp "$work/luabin/lua54.exe" "$pkg_lua/lua.exe" cp "$work/luabin/lua54.dll" "$pkg_lua/lua54.dll" cp src/socket.lua "$pkg_lua/" cp src/mime.lua "$pkg_lua/" cp src/ltn12.lua "$pkg_lua/" cp src/socket-3.0.0.dll "$pkg_lua/socket/core.dll" cp src/ftp.lua "$pkg_lua/socket/" cp src/headers.lua "$pkg_lua/socket/" cp src/http.lua "$pkg_lua/socket/" cp src/smtp.lua "$pkg_lua/socket/" cp src/tp.lua "$pkg_lua/socket/" cp src/url.lua "$pkg_lua/socket/" cp src/mime-1.0.3.dll "$pkg_lua/mime/core.dll" echo "==> 5/5 wixl: produce MSI" # wixl wants forward slashes; rewrite Windows-style backslashes in Source=. wxs_tmp="$work/lmcp.wxs" sed 's|Source="pkg\\|Source="pkg/|g; s|\\\([a-zA-Z]\)|/\1|g' "$here/lmcp.wxs" > "$wxs_tmp" mkdir -p "$out_dir" out_msi="$out_dir/lmcp-${lmcp_ver}.msi" (cd "$here" && wixl -v "$wxs_tmp" -o "$out_msi") echo "" echo "==> done: $out_msi" ls -la "$out_msi" sha256sum "$out_msi"