Hi,
I propose the following patch series for current guile 3 development.
With these patches applied, on i686 and x86_64 I got until
CCLD guile.exe
GEN guile-procedures.texi
Backtrace:
0 (primitive-load-path "C:/Users/hm/Documents/msys32/
")
ERROR: In procedure primitive-load-path:
In procedure primitive-load-path: Unable to find file
"C:/Users/hm/Documents/msys32/home/hm/mingw-w64-guile-2.9.2/src/build-
i686-w64-mingw32/libguile/C:/Users/hm/Documents/msys32/home/hm/mingw-
w64-guile-2.9.2/src/build-i686-w64-mingw32/meta/guild" in load path
make[3]: *** [Makefile:4295: guile-procedures.texi] Error 1
The latest error is related to building absolute path names, which
seems not new but I do not know how to fix it.
But I was able on i686 and x86_64 to run simple guile commands with
relative path names
GUILE_AUTO_COMPILE=0 ../meta/build-env ./.libs/guile -l
../../../../test.scm
My configuration was:
autoreconf -fi
configure \
--prefix=${MINGW_PREFIX} \
--build=${MINGW_CHOST} \
--host=${MINGW_CHOST} \
--enable-shared \
--enable-static \
--enable-error-on-warning=no \
--enable-jit=no
Attached also the used draft PKGBUILD file for mingw-w64.
Thanks
Hannes
From 5ce32fcfbeca6c4f647303f4ccf0b1e1c7688901 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Hannes=20M=C3=BCller?= <[email protected]>
Date: Tue, 2 Jul 2019 08:25:40 +0200
Subject: [PATCH] Get latest poll module from gnulib to fix compilation error
on mingw-w64
mainly struct pollfd definition caused compilation failure on mingw-w64
* lib/Makefile.am: update target poll.h:
* lib/poll.c:
* lib/poll.in.h:
* m4/poll.m4:
* m4/poll_h.m4: update from gnulib git
---
lib/Makefile.am | 1 +
lib/poll.c | 49 ++++++++++++++++++++++++++++++++++++++-----------
lib/poll.in.h | 32 +++++++++++++++++++++++++++-----
m4/poll.m4 | 26 +++++++++++++++-----------
m4/poll_h.m4 | 6 ++++--
5 files changed, 85 insertions(+), 29 deletions(-)
diff --git a/lib/Makefile.am b/lib/Makefile.am
index f1b83a13b..fcaabccb6 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -1741,6 +1741,7 @@ poll.h: poll.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
-e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
-e 's|@''NEXT_POLL_H''@|$(NEXT_POLL_H)|g' \
-e 's/@''GNULIB_POLL''@/$(GNULIB_POLL)/g' \
+ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \
-e 's|@''HAVE_POLL''@|$(HAVE_POLL)|g' \
-e 's|@''REPLACE_POLL''@|$(REPLACE_POLL)|g' \
-e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
diff --git a/lib/poll.c b/lib/poll.c
index e700ac358..2b590bd42 100644
--- a/lib/poll.c
+++ b/lib/poll.c
@@ -1,22 +1,22 @@
/* Emulation for poll(2)
Contributed by Paolo Bonzini.
- Copyright 2001-2003, 2006-2017 Free Software Foundation, Inc.
+ Copyright 2001-2003, 2006-2019 Free Software Foundation, Inc.
This file is part of gnulib.
This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
+ it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
+ GNU General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License along
- with this program; if not, see <http://www.gnu.org/licenses/>. */
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, see <https://www.gnu.org/licenses/>. */
/* Tell gcc not to warn about the (nfd < 0) tests, below. */
#if (__GNUC__ == 4 && 3 <= __GNUC_MINOR__) || 4 < __GNUC__
@@ -34,14 +34,18 @@
#include <errno.h>
#include <limits.h>
-#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+#if defined _WIN32 && ! defined __CYGWIN__
# define WINDOWS_NATIVE
# include <winsock2.h>
# include <windows.h>
# include <io.h>
# include <stdio.h>
# include <conio.h>
-# include "msvc-nothrow.h"
+# if GNULIB_MSVC_NOTHROW
+# include "msvc-nothrow.h"
+# else
+# include <io.h>
+# endif
#else
# include <sys/time.h>
# include <unistd.h>
@@ -72,6 +76,29 @@
#ifdef WINDOWS_NATIVE
+/* Do *not* use the function WSAPoll
+ <https://docs.microsoft.com/en-us/windows/desktop/api/winsock2/nf-winsock2-wsapoll>
+ because there is a bug named “Windows 8 Bugs 309411 - WSAPoll does not
+ report failed connections” that Microsoft won't fix.
+ See Daniel Stenberg: "WASPoll is broken"
+ <https://daniel.haxx.se/blog/2012/10/10/wsapoll-is-broken/>. */
+
+/* Here we need the recv() function from Windows, that takes a SOCKET as
+ first argument, not any possible gnulib override. */
+# undef recv
+
+/* Here we need the select() function from Windows, because we pass bit masks
+ of SOCKETs, not bit masks of FDs. */
+# undef select
+
+/* Here we need timeval from Windows since this is what the select() function
+ from Windows requires. */
+# undef timeval
+
+/* Avoid warnings from gcc -Wcast-function-type. */
+# define GetProcAddress \
+ (void *) GetProcAddress
+
static BOOL IsConsoleHandle (HANDLE h)
{
DWORD mode;
@@ -335,13 +362,13 @@ poll (struct pollfd *pfd, nfds_t nfd, int timeout)
int maxfd, rc;
nfds_t i;
- if (nfd < 0)
+ if (nfd > INT_MAX)
{
errno = EINVAL;
return -1;
}
- /* Don't check directly for NFD too large. Any practical use of a
- too-large NFD is caught by one of the other checks below, and
+ /* Don't check directly for NFD greater than OPEN_MAX. Any practical use
+ of a too-large NFD is caught by one of the other checks below, and
checking directly for getdtablesize is too much of a portability
and/or performance and/or correctness hassle. */
@@ -433,7 +460,7 @@ poll (struct pollfd *pfd, nfds_t nfd, int timeout)
int rc = 0;
nfds_t i;
- if (nfd < 0 || timeout < -1)
+ if (nfd > INT_MAX || timeout < -1)
{
errno = EINVAL;
return -1;
diff --git a/lib/poll.in.h b/lib/poll.in.h
index e9b141d8f..0b115dcb3 100644
--- a/lib/poll.in.h
+++ b/lib/poll.in.h
@@ -1,22 +1,22 @@
/* Header for poll(2) emulation
Contributed by Paolo Bonzini.
- Copyright 2001-2003, 2007, 2009-2017 Free Software Foundation, Inc.
+ Copyright 2001-2003, 2007, 2009-2019 Free Software Foundation, Inc.
This file is part of gnulib.
This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
+ it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
+ GNU General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License along
- with this program; if not, see <http://www.gnu.org/licenses/>. */
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, see <https://www.gnu.org/licenses/>. */
#ifndef _@GUARD_PREFIX@_POLL_H
@@ -33,6 +33,13 @@
#ifndef _@GUARD_PREFIX@_POLL_H
#define _@GUARD_PREFIX@_POLL_H
+/* On native Windows, get the 'struct pollfd' type and the POLL* macro
+ definitions before we override them. mingw defines them in <winsock2.h>
+ if _WIN32_WINNT >= 0x0600. */
+#if @HAVE_WINSOCK2_H@
+# include <winsock2.h>
+#endif
+
/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
@@ -41,6 +48,21 @@
#if !@HAVE_POLL_H@
+# if @HAVE_WINSOCK2_H@
+/* Override the definitions from <winsock2.h>. */
+# undef POLLIN
+# undef POLLPRI
+# undef POLLOUT
+# undef POLLERR
+# undef POLLHUP
+# undef POLLNVAL
+# undef POLLRDNORM
+# undef POLLRDBAND
+# undef POLLWRNORM
+# undef POLLWRBAND
+# define pollfd rpl_pollfd
+# endif
+
/* fake a poll(2) environment */
# define POLLIN 0x0001 /* any readable data available */
# define POLLPRI 0x0002 /* OOB/Urgent readable data */
diff --git a/m4/poll.m4 b/m4/poll.m4
index 5706ab514..354d1666b 100644
--- a/m4/poll.m4
+++ b/m4/poll.m4
@@ -1,5 +1,5 @@
-# poll.m4 serial 17
-dnl Copyright (c) 2003, 2005-2007, 2009-2017 Free Software Foundation, Inc.
+# poll.m4 serial 19
+dnl Copyright (c) 2003, 2005-2007, 2009-2019 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
@@ -8,6 +8,7 @@ AC_DEFUN([gl_FUNC_POLL],
[
AC_REQUIRE([gl_POLL_H])
AC_REQUIRE([gl_SOCKETS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
if test $ac_cv_header_poll_h = no; then
ac_cv_func_poll=no
gl_cv_func_poll=no
@@ -53,16 +54,19 @@ AC_DEFUN([gl_FUNC_POLL],
#if (defined(__APPLE__) && defined(__MACH__)) || defined(_AIX)
This is MacOSX or AIX
#endif
-], [gl_cv_func_poll=no], [gl_cv_func_poll=yes])])])
- fi
- if test $gl_cv_func_poll != yes; then
- AC_CHECK_FUNC([poll], [ac_cv_func_poll=yes], [ac_cv_func_poll=no])
- if test $ac_cv_func_poll = no; then
- HAVE_POLL=0
- else
- REPLACE_POLL=1
- fi
+], [gl_cv_func_poll="guessing no"], [gl_cv_func_poll="guessing yes"])])])
fi
+ case "$gl_cv_func_poll" in
+ *yes) ;;
+ *)
+ AC_CHECK_FUNC([poll], [ac_cv_func_poll=yes], [ac_cv_func_poll=no])
+ if test $ac_cv_func_poll = no; then
+ HAVE_POLL=0
+ else
+ REPLACE_POLL=1
+ fi
+ ;;
+ esac
if test $HAVE_POLL = 0 || test $REPLACE_POLL = 1; then
:
else
diff --git a/m4/poll_h.m4 b/m4/poll_h.m4
index b3d6dab5a..8f0e10528 100644
--- a/m4/poll_h.m4
+++ b/m4/poll_h.m4
@@ -1,5 +1,5 @@
-# poll_h.m4 serial 2
-dnl Copyright (C) 2010-2017 Free Software Foundation, Inc.
+# poll_h.m4 serial 3
+dnl Copyright (C) 2010-2019 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
@@ -23,6 +23,8 @@ AC_DEFUN([gl_POLL_H],
dnl <poll.h> is always overridden, because of GNULIB_POSIXCHECK.
gl_CHECK_NEXT_HEADERS([poll.h])
+ gl_PREREQ_SYS_H_WINSOCK2 dnl for HAVE_WINSOCK2_H
+
dnl Check for declarations of anything we want to poison if the
dnl corresponding gnulib module is not in use.
gl_WARN_ON_USE_PREPARE([[#include <poll.h>]],
--
2.22.0
From 88729a1d3d136013419c60cb022255af6112208a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Hannes=20M=C3=BCller?= <[email protected]>
Date: Wed, 3 Jul 2019 11:33:21 +0200
Subject: [PATCH] Fix compilation error for missing <netinet/tcp.h> on
mingw-w64
* libguile/socket.c: exclude <netinet/tcp.h> on mingw-w64
---
libguile/socket.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/libguile/socket.c b/libguile/socket.c
index 64354f1f1..f080cb8a0 100644
--- a/libguile/socket.c
+++ b/libguile/socket.c
@@ -40,7 +40,9 @@
#include <sys/un.h>
#endif
#include <netinet/in.h>
-#include <netinet/tcp.h>
+#ifndef __MINGW32__
+# include <netinet/tcp.h>
+#endif
#include <netdb.h>
#include <arpa/inet.h>
--
2.22.0
From b44824b1b1bce957e56b0bbc1135b60834cd6842 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Hannes=20M=C3=BCller?= <[email protected]>
Date: Fri, 5 Jul 2019 11:22:02 +0200
Subject: [PATCH] Fix compilation error libguile/posix-w32.h
* libguile/posix-w32.h: add missing headers, for x86_64 also start_child
requires return type pid_t
---
libguile/posix-w32.h | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/libguile/posix-w32.h b/libguile/posix-w32.h
index 8fe4f1c65..8cf37f593 100644
--- a/libguile/posix-w32.h
+++ b/libguile/posix-w32.h
@@ -21,6 +21,11 @@
<https://www.gnu.org/licenses/>. */
#include <string.h>
+#include <BaseTsd.h>
+#include <IntSafe.h>
+
+#include "scm.h"
+
#define _UTSNAME_LENGTH 65
#define _UTSNAME_NODENAME_LENGTH _UTSNAME_LENGTH
@@ -74,7 +79,7 @@ SCM_INTERNAL int uname (struct utsname * uts);
SCM_INTERNAL int waitpid (intptr_t, int *, int);
SCM_INTERNAL int w32_status_to_termsig (DWORD status);
-SCM_INTERNAL int start_child (const char *exec_file, char **argv,
+SCM_INTERNAL pid_t start_child (const char *exec_file, char **argv,
int reading, int c2p[2], int writing, int p2c[2],
int infd, int outfd, int errfd);
--
2.22.0
From d0fa92bc6f44c27a483521a9aa08d719763efcc5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Hannes=20M=C3=BCller?= <[email protected]>
Date: Thu, 11 Jul 2019 09:49:33 +0200
Subject: [PATCH] Fix posix.c for mingw-w64
Fix warning "Please include winsock2.h before windows.h" on i686
Fix link error with gethostname on x86_64
* libguile/posix.c: for mingw-w64 add #undef gethostname
directly after unitstd.h which otherwise is
gethostname_used_without_requesting_gnulib_module_gethostname
on x86_64 and causes an link error
also add #include <winsock2.h> to fix warning on i686
---
libguile/posix.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/libguile/posix.c b/libguile/posix.c
index 728b18b67..c4ed4e6b6 100644
--- a/libguile/posix.c
+++ b/libguile/posix.c
@@ -33,6 +33,11 @@
#include <uniconv.h>
#include <unistd.h>
+#ifdef __MINGW32__
+# undef gethostname
+# include <winsock2.h>
+#endif
+
#ifdef HAVE_SCHED_H
# include <sched.h>
#endif
--
2.22.0
# Maintainer: Alexey Pavlov <[email protected]>
_realname=guile
pkgbase=mingw-w64-${_realname}
pkgname="${MINGW_PACKAGE_PREFIX}-${_realname}"
pkgver=2.9.2
pkgrel=1
pkgdesc="a portable, embeddable Scheme implementation written in C (mingw-w64)"
arch=('any')
url="https://www.gnu.org/software/guile/"
license=("GPL")
makedepends=("${MINGW_PACKAGE_PREFIX}-gcc"
"${MINGW_PACKAGE_PREFIX}-pkg-config"
"${MINGW_PACKAGE_PREFIX}-libtool"
"texinfo"
"${MINGW_PACKAGE_PREFIX}-crt"
)
depends=(
"${MINGW_PACKAGE_PREFIX}-pdcurses"
"${MINGW_PACKAGE_PREFIX}-gmp"
"${MINGW_PACKAGE_PREFIX}-libunistring"
"${MINGW_PACKAGE_PREFIX}-gc"
"${MINGW_PACKAGE_PREFIX}-readline"
"${MINGW_PACKAGE_PREFIX}-libffi"
)
options=('strip' 'staticlibs')
#source=("https://ftp.gnu.org/pub/gnu/${_realname}/${_realname}-${pkgver}.tar.gz"
source=("guile-2.9.2.tar.gz"
0001-Get-latest-poll-module-from-gnulib-to-fix-compilatio.patch
0002-Fix-error-missing-netinet-tcp_h-on-mingw-w64.patch
0003-Fix-compilation-error-libguile-posix-w32_h.patch
0004-Fix-posix.c-for-mingw-w64.patch
)
sha256sums=('823dce6c89a993663dbd3eba058cb65daa7a67ef120fcf0295f6ba5682c05fef'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
)
prepare() {
cd "${srcdir}"/${_realname}-${pkgver}
patch -p1 -i
${srcdir}/0001-Get-latest-poll-module-from-gnulib-to-fix-compilatio.patch
patch -p1 -i ${srcdir}/0002-Fix-error-missing-netinet-tcp_h-on-mingw-w64.patch
patch -p1 -i ${srcdir}/0003-Fix-compilation-error-libguile-posix-w32_h.patch
patch -p1 -i ${srcdir}/0004-Fix-posix.c-for-mingw-w64.patch
autoreconf -fi
}
build() {
mkdir -p "${srcdir}/build-${MINGW_CHOST}"
export lt_cv_deplibs_check_method='pass_all'
cd "${srcdir}/build-${MINGW_CHOST}"
"${srcdir}"/${_realname}-${pkgver}/configure \
--prefix=${MINGW_PREFIX} \
--build=${MINGW_CHOST} \
--host=${MINGW_CHOST} \
--enable-shared \
--enable-static \
--enable-error-on-warning=no \
--enable-jit=no
# --without-threads \ causes sigprocmask failure in null-threads.h
make
# make V=1
}
package() {
cd "${srcdir}/build-${MINGW_CHOST}"
make DESTDIR="$pkgdir" install
find "${pkgdir}${MINGW_PREFIX}" -name '*.def' -o -name '*.exp' | xargs -rtl1
rm
rm -r "${pkgdir}${MINGW_PREFIX}"/share/info
rm -r "${pkgdir}${MINGW_PREFIX}"/share/man
}