Skip to content

Commit a61636b

Browse files
authored
Merge pull request #324 from luau-project/win-ci
ci: MSVC on Windows
2 parents e06ad94 + 0a0e518 commit a61636b

File tree

2 files changed

+395
-0
lines changed

2 files changed

+395
-0
lines changed

.github/test-for-msvc-ci.lua

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
2+
-- You should call this script
3+
-- in the following manner:
4+
--
5+
-- Gtk 3:
6+
-- lua "path\to\this\script.lua" 3
7+
--
8+
-- Gtk 4:
9+
-- lua "path\to\this\script.lua" 4
10+
--
11+
-- Gtk 3:
12+
-- luajit "path\to\this\script.lua" 3
13+
--
14+
-- Gtk 4:
15+
-- luajit "path\to\this\script.lua" 4
16+
--
17+
18+
local gtk_major_version = assert(tonumber(arg[1]))
19+
20+
if (not (gtk_major_version == 3 or gtk_major_version == 4)) then
21+
error("unknown Gtk major version")
22+
end
23+
24+
local gtk_version = ("%d.0"):format(gtk_major_version)
25+
26+
local lgi = assert(require("lgi"))
27+
local Gtk = assert(lgi.require("Gtk", gtk_version))
28+
29+
local app = Gtk.Application({ application_id = "org.lgi-devs.lgi" })
30+
31+
function app:on_activate()
32+
local w = Gtk.ApplicationWindow()
33+
w:set_default_size(900, 600)
34+
w:set_title("My great title")
35+
36+
w.application = self
37+
38+
if (gtk_major_version == 3) then
39+
w:show_all()
40+
elseif (gtk_major_version == 4) then
41+
w:present()
42+
else
43+
error("Unknown GTK version")
44+
end
45+
46+
w:close()
47+
end
48+
49+
app:run()

.github/workflows/msvc-ci.yml

Lines changed: 346 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,346 @@
1+
name: MSVC CI
2+
3+
on:
4+
push:
5+
branches: [ master ]
6+
pull_request:
7+
branches: [ master ]
8+
9+
jobs:
10+
build-msvc-puc:
11+
name: Test on PUC-Rio Lua (MSVC)
12+
runs-on: windows-latest
13+
14+
strategy:
15+
matrix:
16+
17+
version:
18+
- 5.1.5
19+
- 5.2.4
20+
- 5.3.6
21+
- 5.4.7
22+
23+
gtk-major-version:
24+
- 3
25+
- 4
26+
27+
env:
28+
WINGTK_URL: https://github.com/wingtk/gvsbuild/releases/download/2024.10.0/GTK${{ matrix.gtk-major-version }}_Gvsbuild_2024.10.0_x64.zip
29+
LUAINSTALLER_URL: https://github.com/luau-project/LuaInstaller/releases/download/v0.2.0.0/LuaInstaller.Console-v0.2.0.0-x64.zip
30+
31+
steps:
32+
33+
- name: Download and extract GTK ${{ matrix.gtk-major-version }} prebuilt binaries (MSVC toolset) provided by wingtk
34+
run: |
35+
$gtk_zip_file = Join-Path -Path "${{ runner.temp }}" -ChildPath "gtk.zip";
36+
37+
# Download
38+
Invoke-WebRequest -Uri "${{ env.WINGTK_URL }}" -OutFile $gtk_zip_file;
39+
40+
# Unzip
41+
$gtk_dir = Join-Path -Path "${{ runner.temp }}" -ChildPath "gtk";
42+
Expand-Archive -Path $gtk_zip_file -DestinationPath "${gtk_dir}";
43+
44+
# Some helper variables
45+
$gtk_bin_dir = Join-Path -Path $gtk_dir -ChildPath "bin";
46+
$gtk_pkg_config_dir = Join-Path -Path $gtk_dir -ChildPath "lib" |
47+
Join-Path -ChildPath "pkgconfig";
48+
49+
# Set environment variable GTK_DIR pointing to GTK's directory
50+
Add-Content "${{ github.env }}" "GTK_DIR=${gtk_dir}";
51+
52+
# Set environment variable GTK_BIN_DIR pointing to GTK's bin directory
53+
Add-Content "${{ github.env }}" "GTK_BIN_DIR=${gtk_bin_dir}";
54+
55+
# Set environment variable GTK_PKG_CONFIG_PATH pointing to GTK's pkg-config directory
56+
Add-Content "${{ github.env }}" "GTK_PKG_CONFIG_PATH=${gtk_pkg_config_dir}";
57+
58+
# Place GTK bin directory on system PATH environment variable
59+
Add-Content "${{ github.path }}" "${gtk_bin_dir}";
60+
61+
- name: Download and extract LuaInstaller, and set an environment variable for it
62+
run: |
63+
$luainstaller_zip_file = Join-Path -Path "${{ runner.temp }}" -ChildPath "luainstaller.zip";
64+
65+
# Download
66+
Invoke-WebRequest -Uri "${{ env.LUAINSTALLER_URL }}" -OutFile $luainstaller_zip_file;
67+
68+
# Unzip
69+
Expand-Archive -Path $luainstaller_zip_file -DestinationPath "${{ runner.temp }}";
70+
71+
$luainstaller = Join-Path -Path "${{ runner.temp }}" -ChildPath "LuaInstaller.Console" |
72+
Join-Path -ChildPath "LuaInstaller.Console.exe";
73+
74+
# Set LUA_INSTALLER environment variable pointing to the app
75+
Add-Content "${{ github.env }}" "LUA_INSTALLER=${luainstaller}";
76+
77+
- name: Install Lua ${{ matrix.version }} on GTK's directory and set environment variables for it
78+
run: |
79+
& "${{ env.LUA_INSTALLER }}" install "dest-dir=${{ env.GTK_DIR }}" "version=${{ matrix.version }}";
80+
81+
# Test Lua
82+
& lua -v;
83+
84+
# Find Lua's pkgconfig (.pc) file
85+
$lua_pc = Get-ChildItem "${{ env.GTK_PKG_CONFIG_PATH }}" -File |
86+
Where-Object Name -Like "lua*.pc" |
87+
Select-Object -ExpandProperty BaseName -First 1;
88+
89+
# Set LUA_PC environment variable pointing to Lua's (.pc) file
90+
Add-Content "${{ github.env }}" "LUA_PC=${lua_pc}";
91+
92+
- name: Setup Python 3.12
93+
uses: actions/setup-python@v5
94+
with:
95+
python-version: '3.12'
96+
97+
- name: Install meson
98+
run: pip install meson
99+
100+
- name: Setup MSVC dev-prompt
101+
uses: ilammy/msvc-dev-cmd@v1
102+
103+
- name: Checkout
104+
uses: actions/checkout@v4
105+
106+
- name: Configure lgi through meson
107+
run: meson setup lgi-build . --prefix "${{ env.GTK_DIR }}" "-Dlua-pc=${{ env.LUA_PC }}" -Dtests=false
108+
109+
- name: Build lgi
110+
run: meson compile -C lgi-build
111+
112+
- name: Install lgi
113+
run: meson install -C lgi-build
114+
115+
- name: Test lgi
116+
run: lua ".github\\test-for-msvc-ci.lua" ${{ matrix.gtk-major-version }};
117+
118+
build-msvc-luajit:
119+
name: Test on LuaJIT (MSVC)
120+
runs-on: windows-latest
121+
122+
strategy:
123+
matrix:
124+
125+
gtk-major-version:
126+
- 3
127+
- 4
128+
129+
env:
130+
WINGTK_URL: https://github.com/wingtk/gvsbuild/releases/download/2024.10.0/GTK${{ matrix.gtk-major-version }}_Gvsbuild_2024.10.0_x64.zip
131+
132+
steps:
133+
134+
- name: Download and extract GTK ${{ matrix.gtk-major-version }} prebuilt binaries (MSVC toolset) provided by wingtk
135+
run: |
136+
$gtk_zip_file = Join-Path -Path "${{ runner.temp }}" -ChildPath "gtk.zip";
137+
138+
# Download
139+
Invoke-WebRequest -Uri "${{ env.WINGTK_URL }}" -OutFile $gtk_zip_file;
140+
141+
# Unzip
142+
$gtk_dir = Join-Path -Path "${{ runner.temp }}" -ChildPath "gtk";
143+
Expand-Archive -Path $gtk_zip_file -DestinationPath "${gtk_dir}";
144+
145+
# Some helper variables
146+
$gtk_bin_dir = Join-Path -Path $gtk_dir -ChildPath "bin";
147+
$gtk_pkg_config_dir = Join-Path -Path $gtk_dir -ChildPath "lib" |
148+
Join-Path -ChildPath "pkgconfig";
149+
150+
# Set environment variable GTK_DIR pointing to GTK's directory
151+
Add-Content "${{ github.env }}" "GTK_DIR=${gtk_dir}";
152+
153+
# Set environment variable GTK_BIN_DIR pointing to GTK's bin directory
154+
Add-Content "${{ github.env }}" "GTK_BIN_DIR=${gtk_bin_dir}";
155+
156+
# Set environment variable GTK_PKG_CONFIG_PATH pointing to GTK's pkg-config directory
157+
Add-Content "${{ github.env }}" "GTK_PKG_CONFIG_PATH=${gtk_pkg_config_dir}";
158+
159+
# Place GTK bin directory on system PATH environment variable
160+
Add-Content "${{ github.path }}" "${gtk_bin_dir}";
161+
162+
- name: Save environment variable for LuaJIT checkout directory
163+
run: |
164+
$guid_string = [System.Guid]::NewGuid() | Select-Object -ExpandProperty Guid;
165+
Add-Content "${{ github.env }}" "LUAJIT_CHECKOUT=${guid_string}";
166+
167+
- name: Checkout LuaJIT
168+
uses: actions/checkout@v4
169+
with:
170+
repository: LuaJIT/LuaJIT
171+
path: "${{ env.LUAJIT_CHECKOUT }}"
172+
173+
- name: Find LuaJIT msvcbuild.bat and src directory
174+
run: |
175+
$build_bat = "msvcbuild.bat";
176+
$msvcbuild = Get-ChildItem -Path "${{ env.LUAJIT_CHECKOUT }}" -Recurse -File |
177+
Where-Object Name -EQ $build_bat |
178+
Select-Object -ExpandProperty FullName -First 1;
179+
180+
if ($msvcbuild -eq $null -or -not (Test-Path -Path $msvcbuild))
181+
{
182+
Write-Host "Unable to find LuaJIT's $build_bat";
183+
exit 1;
184+
}
185+
186+
Write-Host "Found $build_bat at $msvcbuild";
187+
188+
$src_dir = Split-Path $msvcbuild;
189+
190+
Add-Content "${{ github.env }}" "LUAJIT_MSVCBUILD_BAT=${build_bat}";
191+
Add-Content "${{ github.env }}" "LUAJIT_SRC_DIR=${src_dir}";
192+
193+
- name: Setup MSVC dev prompt
194+
uses: ilammy/msvc-dev-cmd@v1
195+
196+
- name: Build LuaJIT
197+
run: |
198+
cd "${{ env.LUAJIT_SRC_DIR }}";
199+
& ".\${{ env.LUAJIT_MSVCBUILD_BAT }}"
200+
201+
$luajit_output = & .\luajit -v;
202+
203+
if ($luajit_output -match "^\s*LuaJIT\s*(\d+(\.\d+)*)")
204+
{
205+
$luajit_version = $Matches.1;
206+
Add-Content "${{ github.env }}" "LUAJIT_VERSION=${luajit_version}";
207+
}
208+
else
209+
{
210+
Write-Host "Unable to get LuaJIT version";
211+
exit 1;
212+
}
213+
214+
- name: Create LuaJIT tar gz containing the build artifacts
215+
run: |
216+
$luajit_target_dir = Join-Path -Path "${{ runner.temp }}" -ChildPath "luajit";
217+
218+
if (Test-Path -Path $luajit_target_dir)
219+
{
220+
Remove-Item -Path $luajit_target_dir -Recurse -Force;
221+
}
222+
223+
mkdir $luajit_target_dir;
224+
225+
$luajit_bin_dir = Join-Path -Path $luajit_target_dir -ChildPath "bin";
226+
$luajit_include_dir = Join-Path -Path $luajit_target_dir -ChildPath "include";
227+
$luajit_lib_dir = Join-Path -Path $luajit_target_dir -ChildPath "lib";
228+
229+
foreach ($luajit_target_subdir in $luajit_bin_dir, $luajit_include_dir, $luajit_lib_dir)
230+
{
231+
if (-not (Test-Path -Path $luajit_target_subdir))
232+
{
233+
mkdir $luajit_target_subdir;
234+
}
235+
}
236+
237+
$luajit_lmod_dir = Join-Path -Path $luajit_bin_dir -ChildPath "lua";
238+
if (-not (Test-Path -Path $luajit_lmod_dir))
239+
{
240+
mkdir $luajit_lmod_dir;
241+
}
242+
243+
$luajit_pkgconfig_dir = Join-Path -Path $luajit_lib_dir -ChildPath "pkgconfig";
244+
if (-not (Test-Path -Path $luajit_pkgconfig_dir))
245+
{
246+
mkdir $luajit_pkgconfig_dir;
247+
}
248+
249+
foreach ($to_bin in "luajit.exe", "lua51.dll")
250+
{
251+
$artifact = Join-Path -Path "${{ env.LUAJIT_SRC_DIR }}" -ChildPath $to_bin;
252+
253+
Copy-Item -Path $artifact -Destination $luajit_bin_dir;
254+
}
255+
256+
foreach ($to_include in "lua.h", "lualib.h", "lauxlib.h", "luaconf.h", "lua.hpp", "luajit.h")
257+
{
258+
$artifact = Join-Path -Path "${{ env.LUAJIT_SRC_DIR }}" -ChildPath $to_include;
259+
260+
Copy-Item -Path $artifact -Destination $luajit_include_dir;
261+
}
262+
263+
foreach ($to_lib in "luajit.lib", "luajit.exp", "lua51.lib", "lua51.exp")
264+
{
265+
$artifact = Join-Path -Path "${{ env.LUAJIT_SRC_DIR }}" -ChildPath $to_lib;
266+
267+
Copy-Item -Path $artifact -Destination $luajit_lib_dir;
268+
}
269+
270+
$luajit_jit_dir = Join-Path -Path "${{ env.LUAJIT_SRC_DIR }}" -ChildPath "jit";
271+
272+
Copy-Item -Path $luajit_jit_dir -Destination $luajit_lmod_dir -Filter "*.lua" -Recurse;
273+
274+
# pkgconfig variables
275+
$pkgconfig_luajit_target_dir = $luajit_target_dir.Replace("\", "/")
276+
$pkgconfig_luajit_include_dir = $luajit_include_dir.Replace("\", "/")
277+
$pkgconfig_luajit_lib_dir = $luajit_lib_dir.Replace("\", "/")
278+
$pkgconfig_luajit_lmod_dir = $luajit_lmod_dir.Replace("\", "/")
279+
$pkgconfig_luajit_bin_dir = $luajit_bin_dir.Replace("\", "/")
280+
281+
# Writing pkgconfig files
282+
283+
foreach ($pkgconfig_filename in "lua51", "luajit")
284+
{
285+
$pkgconfig_content = "prefix=${pkgconfig_luajit_target_dir}",
286+
"exec_prefix=`${prefix}",
287+
"libname=${pkgconfig_filename}",
288+
"includedir=${pkgconfig_luajit_include_dir}",
289+
"libdir=${pkgconfig_luajit_lib_dir}",
290+
"INSTALL_LMOD=${pkgconfig_luajit_lmod_dir}",
291+
"INSTALL_CMOD=${pkgconfig_luajit_bin_dir}",
292+
"",
293+
"Name: LuaJIT",
294+
"Description: Just-in-time compiler for Lua",
295+
"URL: https://luajit.org",
296+
"Version: ${{ env.LUAJIT_VERSION }}",
297+
"Requires: ",
298+
"Libs: -L`${libdir} -l`${libname}",
299+
"Cflags: -I`${includedir}";
300+
301+
$pkgconfig_content = $pkgconfig_content |
302+
Join-String -Separator ([System.Environment]::NewLine);
303+
304+
$pkgconfig_file = Join-Path -Path $luajit_pkgconfig_dir -ChildPath "${pkgconfig_filename}.pc";
305+
Set-Content $pkgconfig_file $pkgconfig_content -NoNewLine;
306+
}
307+
308+
$luajit_target_dir_unix = & C:\msys64\usr\bin\cygpath -u "$luajit_target_dir";
309+
$luajit_tar_gz = Join-Path -Path "${{ runner.temp }}" -ChildPath "luajit.tar.gz";
310+
$luajit_tar_gz_unix = & C:\msys64\usr\bin\cygpath -u "$luajit_tar_gz";
311+
312+
& C:\msys64\usr\bin\bash -lc "tar -C ""$luajit_target_dir_unix"" -czvf ""$luajit_tar_gz_unix"" .";
313+
314+
Remove-Item -Path $luajit_target_dir -Recurse;
315+
316+
Add-Content "${{ github.env }}" "LUAJIT_TAR_GZ=${luajit_tar_gz}";
317+
Add-Content "${{ github.env }}" "LUAJIT_TAR_GZ_UNIX=${luajit_tar_gz_unix}";
318+
319+
- name: Extract LuaJIT tar gz on GTK's directory
320+
run: |
321+
$gtk_dir_unix = & C:\msys64\usr\bin\cygpath -u "${{ env.GTK_DIR }}";
322+
323+
& C:\msys64\usr\bin\bash -lc "tar -C ""$gtk_dir_unix"" -xzvf ""${{ env.LUAJIT_TAR_GZ_UNIX }}""";
324+
325+
- name: Setup Python 3.12
326+
uses: actions/setup-python@v5
327+
with:
328+
python-version: '3.12'
329+
330+
- name: Install meson
331+
run: pip install meson
332+
333+
- name: Checkout
334+
uses: actions/checkout@v4
335+
336+
- name: Configure lgi through meson
337+
run: meson setup lgi-build . --prefix "${{ env.GTK_DIR }}" "-Dlua-bin=luajit" -Dtests=false
338+
339+
- name: Build lgi
340+
run: meson compile -C lgi-build
341+
342+
- name: Install lgi
343+
run: meson install -C lgi-build
344+
345+
- name: Test lgi
346+
run: luajit ".github\\test-for-msvc-ci.lua" ${{ matrix.gtk-major-version }};

0 commit comments

Comments
 (0)