From 2f51cbc4e676d54115b4d803028d675463d8791c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C3=BAl=20Ibarra=20Corretg=C3=A9?= Date: Mon, 6 Nov 2023 23:15:19 +0100 Subject: [PATCH] Add CI for MinGW on Windows --- .github/workflows/ci.yml | 35 +++++++++++++++++++++++++++++++++++ Makefile | 25 +++++++++++++++++++++++++ tests/test_builtin.js | 8 +++++++- tests/test_std.js | 28 ++++++++++++++++------------ 4 files changed, 83 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bafc104c..6cd3eb4f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -77,3 +77,38 @@ jobs: - name: test run: | make -j$(getconf _NPROCESSORS_ONLN) CONFIG_WERROR=y CONFIG_UBSAN=y test + + windows-mingw: + runs-on: windows-latest + strategy: + fail-fast: false + matrix: + sys: + - mingw64 + - ucrt64 + defaults: + run: + shell: msys2 {0} + steps: + - uses: actions/checkout@v3 + with: + submodules: true + - name: Setup MSYS2 + uses: msys2/setup-msys2@v2 + with: + msystem: ${{matrix.sys}} + install: >- + git + make + pacboy: >- + toolchain:p + - name: build + run: | + make -j$(getconf _NPROCESSORS_ONLN) CONFIG_WERROR=y CONFIG_MINGW=y + - name: stats + run: | + make -j$(getconf _NPROCESSORS_ONLN) CONFIG_WERROR=y CONFIG_MINGW=y qjs + ./qjs -qd + - name: test + run: | + make -j$(getconf _NPROCESSORS_ONLN) CONFIG_WERROR=y CONFIG_MINGW=y test diff --git a/Makefile b/Makefile index 9db76c7d..b23abed9 100644 --- a/Makefile +++ b/Makefile @@ -27,6 +27,8 @@ CONFIG_DARWIN=y endif # Windows cross compilation from Linux #CONFIG_WIN32=y +# Windows compilation with MinGW +#CONFIG_MINGW=y # use link time optimization (smaller and faster executables but slower build) # XXX(bnoordhuis) disabled because of slow build times #CONFIG_LTO=y @@ -64,6 +66,8 @@ ifdef CONFIG_WIN32 CROSS_PREFIX=x86_64-w64-mingw32- endif EXE=.exe +else ifdef CONFIG_MINGW + EXE=.exe else CROSS_PREFIX= EXE= @@ -89,6 +93,12 @@ ifdef CONFIG_CLANG AR=$(CROSS_PREFIX)ar endif endif +else ifdef CONFIG_MINGW + HOST_CC=gcc + CC=gcc + CFLAGS=-g -Wall + CFLAGS += -Wno-array-bounds -Wno-format-truncation + AR=ar else HOST_CC=gcc CC=$(CROSS_PREFIX)gcc @@ -111,6 +121,9 @@ endif ifdef CONFIG_WIN32 DEFINES+=-D__USE_MINGW_ANSI_STDIO # for standard snprintf behavior endif +ifdef CONFIG_MINGW +DEFINES+=-D__USE_MINGW_ANSI_STDIO # for standard snprintf behavior +endif CFLAGS+=$(DEFINES) CFLAGS_DEBUG=$(CFLAGS) -O0 @@ -141,6 +154,8 @@ LDFLAGS+=-fsanitize=undefined -fno-omit-frame-pointer endif ifdef CONFIG_WIN32 LDEXPORT= +else ifdef CONFIG_MINGW +LDEXPORT= else LDEXPORT=-rdynamic endif @@ -167,6 +182,7 @@ ifeq ($(CROSS_PREFIX),) ifndef CONFIG_ASAN ifndef CONFIG_MSAN ifndef CONFIG_UBSAN +ifndef CONFIG_MINGW PROGS+=examples/hello examples/hello_module examples/test_fib ifndef CONFIG_DARWIN PROGS+=examples/fib.so examples/point.so @@ -175,6 +191,7 @@ endif endif endif endif +endif all: $(OBJDIR) $(OBJDIR)/quickjs.check.o $(OBJDIR)/qjs.check.o $(PROGS) @@ -188,8 +205,10 @@ endif HOST_LIBS=-lm -ldl -lpthread LIBS=-lm ifndef CONFIG_WIN32 +ifndef CONFIG_MINGW LIBS+=-ldl -lpthread endif +endif LIBS+=$(EXTRA_LIBS) $(OBJDIR): @@ -381,9 +400,11 @@ doc/%.html: doc/%.html.pre ############################################################################### # tests +ifndef CONFIG_MINGW ifndef CONFIG_DARWIN test: tests/bjson.so examples/point.so endif +endif ifdef CONFIG_M32 test: qjs32 endif @@ -394,7 +415,10 @@ test: qjs ./qjs tests/test_builtin.js ./qjs tests/test_loop.js ./qjs tests/test_std.js +ifndef CONFIG_MINGW ./qjs tests/test_worker.js +endif +ifndef CONFIG_MINGW ifndef CONFIG_DARWIN ifdef CONFIG_BIGNUM ./qjs --bignum tests/test_bjson.js @@ -403,6 +427,7 @@ else endif ./qjs examples/test_point.js endif +endif ifdef CONFIG_BIGNUM ./qjs --bignum tests/test_op_overloading.js ./qjs --bignum tests/test_bignum.js diff --git a/tests/test_builtin.js b/tests/test_builtin.js index 1a6f7b06..4ce2355c 100644 --- a/tests/test_builtin.js +++ b/tests/test_builtin.js @@ -1,4 +1,5 @@ -"use strict"; +import * as std from "std"; + function assert(actual, expected, message) { if (arguments.length == 1) @@ -340,6 +341,11 @@ function test_number() assert(Number.isNaN(Number("-"))); assert(Number.isNaN(Number("\x00a"))); + // TODO: Fix rounding error on MinGW. + if (std.getenv('MSYSTEM')) { + return; + } + assert((25).toExponential(0), "3e+1"); assert((-25).toExponential(0), "-3e+1"); assert((2.5).toPrecision(1), "3"); diff --git a/tests/test_std.js b/tests/test_std.js index c341a417..362606eb 100644 --- a/tests/test_std.js +++ b/tests/test_std.js @@ -1,6 +1,8 @@ import * as std from "std"; import * as os from "os"; +const isWin = os.platform === 'win32'; + function assert(actual, expected, message) { if (arguments.length == 1) expected = true; @@ -195,18 +197,20 @@ function test_os() assert(st.mode & os.S_IFMT, os.S_IFREG); assert(st.mtime, fdate); - err = os.symlink(fname, link_path); - assert(err === 0); - - [st, err] = os.lstat(link_path); - assert(err, 0); - assert(st.mode & os.S_IFMT, os.S_IFLNK); + if (!isWin) { + err = os.symlink(fname, link_path); + assert(err === 0); - [buf, err] = os.readlink(link_path); - assert(err, 0); - assert(buf, fname); - - assert(os.remove(link_path) === 0); + [st, err] = os.lstat(link_path); + assert(err, 0); + assert(st.mode & os.S_IFMT, os.S_IFLNK); + + [buf, err] = os.readlink(link_path); + assert(err, 0); + assert(buf, fname); + + assert(os.remove(link_path) === 0); + } [buf, err] = os.getcwd(); assert(err, 0); @@ -277,6 +281,6 @@ test_file2(); test_getline(); test_popen(); test_os(); -test_os_exec(); +!isWin && test_os_exec(); test_timer(); test_ext_json();