changeset 5732:055dec6c319b

Allow other packages to use newer Windows API functions. * src/mingw-w64.mk, src/build-gcc.mk: Since we now require version 6.1 or newer of the Windows API (Windows 7 or newer) for Octave 7, allow other packages to use these functions, too, by setting a default Windows API version. * src/gdb-1-gnulib.patch: Cherrypick patch from upstream to fix compiling for newer Windows API. * dist-files.mk: Add new patch to list.
author Markus Mützel <markus.muetzel@gmx.de>
date Sun, 11 Apr 2021 12:39:19 +0200
parents 6c9c51be6829
children ac2d180a1a47
files dist-files.mk src/build-gcc.mk src/gdb-1-gnulib.patch src/mingw-w64.mk
diffstat 4 files changed, 322 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/dist-files.mk	Sun Apr 11 21:01:28 2021 +0200
+++ b/dist-files.mk	Sun Apr 11 12:39:19 2021 +0200
@@ -123,6 +123,7 @@
   gd-test.c \
   gd.mk \
   gdal.mk \
+  gdb-1-gnulib.patch \
   gdb.mk \
   gdcm-1-nosecapi.patch \
   gdcm-2-getopt.patch \
--- a/src/build-gcc.mk	Sun Apr 11 21:01:28 2021 +0200
+++ b/src/build-gcc.mk	Sun Apr 11 12:39:19 2021 +0200
@@ -32,6 +32,7 @@
     --without-x \
     --disable-win32-registry \
     --enable-threads=posix
+
   ifneq ($(TARGET),x86_64-w64-mingw32)
     $(PKG)_SYSDEP_CONFIGURE_OPTIONS += \
     --libdir='$(BUILD_TOOLS_PREFIX)/lib' \
@@ -47,41 +48,48 @@
       fi
     endef
   endif
+
+  ifeq ($(OCTAVE_TARGET),default-octave)
+    # FIXME: Adapt condition when Octave 7 moves to stable or it is released.
+    $(PKG)_WINAPI_VERSION_FLAGS := --with-default-win32-winnt=0x0601
+  endif
+
   define $(PKG)_INSTALL_SYSTEM_HEADERS
     $($(PKG)_PRE_BUILD)
     # install mingw-w64 headers
     $(call PREPARE_PKG_SOURCE,mingw-w64,$(1))
     mkdir '$(1).headers'
     cd '$(1).headers' && '$(1)/$(mingw-w64_SUBDIR)/mingw-w64-headers/configure' \
-        --host='$(TARGET)' \
-        --prefix='$(HOST_PREFIX)' \
-        --enable-sdk=all \
-        --enable-idl \
-        --enable-secure-api \
-        $(mingw-w64-headers_CONFIGURE_OPTS)
+      --host='$(TARGET)' \
+      --prefix='$(HOST_PREFIX)' \
+      --enable-sdk=all \
+      --enable-idl \
+      --enable-secure-api \
+      $($(PKG)_WINAPI_VERSION_FLAGS) \
+      $(mingw-w64-headers_CONFIGURE_OPTS)
     $(MAKE) -C '$(1).headers' install
   endef
+  
   define $(PKG)_BUILD_SYSTEM_RUNTIME
     # build standalone gcc
     $(MAKE) -C '$(1).build' -j '$(JOBS)' all-gcc
     $(MAKE) -C '$(1).build' -j 1 install-gcc
-
     # build mingw-w64-crt
     mkdir '$(1).crt-build'
     cd '$(1).crt-build' && '$(1)/$(mingw-w64_SUBDIR)/mingw-w64-crt/configure' \
-	--host='$(TARGET)' \
-	--prefix='$(HOST_PREFIX)' \
-	$(if $(filter $(TARGET), x86_64-w64-mingw32),--disable-lib32) \
-	--with-sysroot='$(HOST_PREFIX)'
+      --host='$(TARGET)' \
+      --prefix='$(HOST_PREFIX)' \
+      $(if $(filter $(TARGET), x86_64-w64-mingw32),--disable-lib32) \
+      --with-sysroot='$(HOST_PREFIX)'
     $(MAKE) -C '$(1).crt-build' -j '$(JOBS)' || $(MAKE) -C '$(1).crt-build' -j '$(JOBS)'
     $(MAKE) -C '$(1).crt-build' -j 1 install
 
     # build posix threads
     mkdir '$(1).pthreads'
     cd '$(1).pthreads' && '$(1)/$(mingw-w64_SUBDIR)/mingw-w64-libraries/winpthreads/configure' \
-        $(HOST_AND_BUILD_CONFIGURE_OPTIONS) \
-        --prefix='$(HOST_PREFIX)' \
-        $(ENABLE_SHARED_OR_STATIC)
+      $(HOST_AND_BUILD_CONFIGURE_OPTIONS) \
+      --prefix='$(HOST_PREFIX)' \
+      $(ENABLE_SHARED_OR_STATIC)
     $(MAKE) -C '$(1).pthreads' -j '$(JOBS)' || $(MAKE) -C '$(1).pthreads' -j '$(JOBS)'
     $(MAKE) -C '$(1).pthreads' -j 1 install
   endef
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/gdb-1-gnulib.patch	Sun Apr 11 12:39:19 2021 +0200
@@ -0,0 +1,281 @@
+From 361cb219351d8b7e39e1962fe77f40aa80657b27 Mon Sep 17 00:00:00 2001
+From: Andrew Burgess <andrew.burgess@embecosm.com>
+Date: Tue, 6 Oct 2020 10:09:06 +0100
+Subject: [PATCH] gnulib: Ensure all libraries are used when building
+ gdb/gdbserver
+
+An issue was reported here related to building GDB on MinGW:
+
+  https://sourceware.org/pipermail/gdb/2020-September/048927.html
+
+It was suggested here:
+
+  https://sourceware.org/pipermail/gdb/2020-September/048931.html
+
+that the solution might be to make use of $(LIB_GETRANDOM), a variable
+defined in the gnulib makefile, when linking GDB.
+
+In fact I think the issue is bigger than just LIB_GETRANDOM.  When
+using the script binutils-gdb/gnulib/update-gnulib.sh to reimport
+gnulib there is a lot of output from gnulib's gnulib-tool.  Part of
+that output is this:
+
+  You may need to use the following makefile variables when linking.
+  Use them in <program>_LDADD when linking a program, or
+  in <library>_a_LDFLAGS or <library>_la_LDFLAGS when linking a library.
+    $(FREXPL_LIBM)
+    $(FREXP_LIBM)
+    $(INET_NTOP_LIB)
+    $(LIBTHREAD)
+    $(LIB_GETLOGIN)
+    $(LIB_GETRANDOM)
+    $(LIB_HARD_LOCALE)
+    $(LIB_MBRTOWC)
+    $(LIB_SETLOCALE_NULL)
+    $(LTLIBINTL) when linking with libtool, $(LIBINTL) otherwise
+
+What I think this is telling us is that we should be including the
+value of all these variables on the link line for gdb and gdbserver.
+
+The problem though is that these variables are define in gnulib's
+makefile, but are not (necessarily) defined in GDB's makefile.
+
+One solution would be to recreate the checks that gnulib performs in
+order to recreate these variables in both gdb's and gdbserver's
+makefile.  Though this shouldn't be too hard, most (if not all) of
+these checks are in the form macros defined in m4 files in the gnulib
+tree, so we could just reference these as needed.  However, in this
+commit I propose a different solution.
+
+Currently, in the top level makefile, we give gdb and gdbserver a
+dependency on gnulib.  Once gnulib has finished building gdb and
+gdbserver can start, these projects then have a hard coded (relative)
+path to the compiled gnulib library in their makefiles.
+
+In this commit I extend the gnulib configure script to install a new
+makefile fragment in the gnulib build directory.  This new file will
+have the usual variable substitutions applied to it, and so can
+include the complete list (see above) of all the extra libraries that
+are needed when linking against gnulib.
+
+In fact the new makefile fragment defines three variables, these are:
+
+LIBGNU: The path to the archive containing gnulib.  Can be used as a
+       dependency as when this file changes gdb/gdbserver should be
+       relinked.
+
+LIBGNU_EXTRA_LIBS: A list of linker -l.... flags that should be
+       included in the link line of gdb/gdbserver.  These are
+       libraries that $(LIBGNU) depends on.  This list is taken from
+       the output of gnulib-tool, which is run by our
+       gnulib/update-gnulib.sh script.
+
+INCGNU: A list of -I.... include paths that should be passed to the
+       compiler, these are where the gnulib headers can be found.
+
+Now both gdb and gdbserver can include the makefile fragment and make
+use of these variables.
+
+The makefile fragment relies on the variable GNULIB_BUILDDIR being
+defined.  This is checked for in the fragment, and was already defined
+in the makefiles of gdb and gdbserver.
+
+gdb/ChangeLog:
+
+	* Makefile.in: Include Makefile.gnulib.inc.  Don't define LIBGNU
+	or INCGNU.  Make use of LIBGNU_EXTRA_LIBS when linking.
+
+gdbserver/ChangeLog:
+
+	* Makefile.in: Include Makefile.gnulib.inc.  Don't define LIBGNU
+	or INCGNU.  Make use of LIBGNU_EXTRA_LIBS when linking.
+
+gnulib/ChangeLog:
+
+	* Makefile.gnulib.inc.in: New file.
+	* Makefile.in: Regenerate.
+	* configure: Regenerate.
+	* configure.ac: Install the new file.
+---
+ gdb/ChangeLog                 |  5 ++++
+ gdb/Makefile.in               |  5 ++--
+ gdbserver/ChangeLog           |  5 ++++
+ gdbserver/Makefile.in         | 11 ++++-----
+ gnulib/ChangeLog              |  7 ++++++
+ gnulib/Makefile.gnulib.inc.in | 44 +++++++++++++++++++++++++++++++++++
+ gnulib/Makefile.in            |  4 +++-
+ gnulib/configure              |  4 ++++
+ gnulib/configure.ac           |  2 ++
+ 9 files changed, 77 insertions(+), 10 deletions(-)
+ create mode 100644 gnulib/Makefile.gnulib.inc.in
+
+diff --git a/gdb/Makefile.in b/gdb/Makefile.in
+index 80b788cdff9..5f92e8781e7 100644
+--- a/gdb/Makefile.in
++++ b/gdb/Makefile.in
+@@ -243,8 +243,7 @@ GDBFLAGS =
+ 
+ # Helper code from gnulib.
+ GNULIB_BUILDDIR = ../gnulib
+-LIBGNU = $(GNULIB_BUILDDIR)/import/libgnu.a
+-INCGNU = -I$(srcdir)/../gnulib/import -I$(GNULIB_BUILDDIR)/import
++include $(GNULIB_BUILDDIR)/Makefile.gnulib.inc
+ 
+ SUPPORT = ../gdbsupport
+ LIBSUPPORT = $(SUPPORT)/libgdbsupport.a
+@@ -632,7 +631,7 @@ CLIBS = $(SIM) $(READLINE) $(OPCODES) $(LIBCTF) $(BFD) $(ZLIB) \
+ 	$(XM_CLIBS) $(GDBTKLIBS) \
+ 	@LIBS@ @GUILE_LIBS@ @PYTHON_LIBS@ \
+ 	$(LIBEXPAT) $(LIBLZMA) $(LIBBABELTRACE) $(LIBIPT) \
+-	$(WIN32LIBS) $(LIBGNU) $(LIBICONV) \
++	$(WIN32LIBS) $(LIBGNU) $(LIBGNU_EXTRA_LIBS) $(LIBICONV) \
+ 	$(LIBMPFR) $(SRCHIGH_LIBS) $(LIBXXHASH) $(PTHREAD_LIBS) \
+ 	$(DEBUGINFOD_LIBS)
+ CDEPS = $(NAT_CDEPS) $(SIM) $(BFD) $(READLINE_DEPS) $(CTF_DEPS) \
+diff --git a/gdbserver/Makefile.in b/gdbserver/Makefile.in
+index c8cfed4819b..1969ed0ec37 100644
+--- a/gdbserver/Makefile.in
++++ b/gdbserver/Makefile.in
+@@ -114,8 +114,7 @@ ustinc = @ustinc@
+ 
+ # gnulib
+ GNULIB_BUILDDIR = ../gnulib
+-LIBGNU = $(GNULIB_BUILDDIR)/import/libgnu.a
+-INCGNU = -I$(srcdir)/../gnulib/import -I$(GNULIB_BUILDDIR)/import
++include $(GNULIB_BUILDDIR)/Makefile.gnulib.inc
+ 
+ # Where is the INTL library?  Typically in ../intl.
+ INTL = @LIBINTL@
+@@ -360,8 +359,8 @@ gdbserver$(EXEEXT): $(sort $(OBS)) ${CDEPS} $(LIBGNU) $(LIBIBERTY) \
+ 	$(ECHO_CXXLD) $(CC_LD) $(INTERNAL_CFLAGS) $(INTERNAL_LDFLAGS) \
+ 		$(CXXFLAGS) \
+ 		-o gdbserver$(EXEEXT) $(OBS) $(GDBSUPPORT) $(LIBGNU) \
+-		$(LIBIBERTY) $(INTL) $(GDBSERVER_LIBS) $(XM_CLIBS) \
+-		$(WIN32APILIBS)
++		$(LIBGNU_EXTRA_LIBS) $(LIBIBERTY) $(INTL) \
++		$(GDBSERVER_LIBS) $(XM_CLIBS) $(WIN32APILIBS)
+ 
+ gdbreplay$(EXEEXT): $(sort $(GDBREPLAY_OBS)) $(LIBGNU) $(LIBIBERTY) \
+ 		$(INTL_DEPS) $(GDBSUPPORT)
+@@ -369,8 +368,8 @@ gdbreplay$(EXEEXT): $(sort $(GDBREPLAY_OBS)) $(LIBGNU) $(LIBIBERTY) \
+ 	$(ECHO_CXXLD) $(CC_LD) $(INTERNAL_CFLAGS) $(INTERNAL_LDFLAGS) \
+ 		$(CXXFLAGS) \
+ 		-o gdbreplay$(EXEEXT) $(GDBREPLAY_OBS) $(XM_CLIBS) \
+-		$(GDBSUPPORT) $(LIBGNU) $(LIBIBERTY) $(INTL) \
+-		$(WIN32APILIBS)
++		$(GDBSUPPORT) $(LIBGNU) $(LIBGNU_EXTRA_LIBS) \
++		$(LIBIBERTY) $(INTL) $(WIN32APILIBS)
+ 
+ IPA_OBJS = \
+ 	alloc-ipa.o \
+diff --git a/gnulib/Makefile.gnulib.inc.in b/gnulib/Makefile.gnulib.inc.in
+new file mode 100644
+index 00000000000..f3fd72b5781
+--- /dev/null
++++ b/gnulib/Makefile.gnulib.inc.in
+@@ -0,0 +1,44 @@
++# Copyright (C) 2020 Free Software Foundation, Inc.
++
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 3 of the License, 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 General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program.  If not, see <http://www.gnu.org/licenses/>.
++
++# A makefile snippet that lists all of the libraries that should be
++# pulled in when linking against gnulib.  Both GDB and GDBSERVER will
++# include this snippet.
++#
++# The defined variables are:
++#
++# LIBGNU: The path to the archive containing gnulib.  Can be used as a
++#        dependency as when this file changes gdb/gdbserver should be
++#        relinked.
++#
++# LIBGNU_EXTRA_LIBS: A list of linker -l.... flags that should be
++#        included in the link line of gdb/gdbserver.  These are
++#        libraries that $(LIBGNU) depends on.  This list is taken from
++#        the output of gnulib-tool, which is run by our
++#        gnulib/update-gnulib.sh script.
++#
++# INCGNU: A list of -I.... include paths that should be passed to the
++#        compiler, these are where the gnulib headers can be found.
++
++ifndef GNULIB_BUILDDIR
++$(error missing GNULIB_BUILDDIR)
++endif
++
++LIBGNU = $(GNULIB_BUILDDIR)/import/libgnu.a
++LIBGNU_EXTRA_LIBS = @FREXPL_LIBM@ @FREXP_LIBM@ @INET_NTOP_LIB@ \
++                    @LIBTHREAD@ @LIB_GETLOGIN@ @LIB_GETRANDOM@ \
++                    @LIB_HARD_LOCALE@ @LIB_MBRTOWC@ \
++                    @LIB_SETLOCALE_NULL@ @LIBINTL@
++INCGNU = -I$(srcdir)/../gnulib/import -I$(GNULIB_BUILDDIR)/import
+diff --git a/gnulib/Makefile.in b/gnulib/Makefile.in
+index bdd3c3f3fbc..c1c21680944 100644
+--- a/gnulib/Makefile.in
++++ b/gnulib/Makefile.in
+@@ -277,7 +277,7 @@ am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+  configure.lineno config.status.lineno
+ mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
+ CONFIG_HEADER = config.h
+-CONFIG_CLEAN_FILES =
++CONFIG_CLEAN_FILES = Makefile.gnulib.inc
+ CONFIG_CLEAN_VPATH_FILES =
+ AM_V_P = $(am__v_P_@AM_V@)
+ am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+@@ -1642,6 +1642,8 @@ $(srcdir)/config.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ 
+ distclean-hdr:
+ 	-rm -f config.h stamp-h1
++Makefile.gnulib.inc: $(top_builddir)/config.status $(srcdir)/Makefile.gnulib.inc.in
++	cd $(top_builddir) && $(SHELL) ./config.status $@
+ 
+ # This directory's subdirectories are mostly independent; you can cd
+ # into them and run 'make' without going through this Makefile.
+diff --git a/gnulib/configure b/gnulib/configure
+index 5c6add6e371..6c58a46e42e 100644
+--- a/gnulib/configure
++++ b/gnulib/configure
+@@ -30802,6 +30802,9 @@ fi
+ # Checks for libraries.  #
+ # ---------------------- #
+ 
++ac_config_files="$ac_config_files Makefile.gnulib.inc"
++
++
+ ac_config_files="$ac_config_files Makefile import/Makefile"
+ 
+ ac_config_commands="$ac_config_commands default"
+@@ -31634,6 +31637,7 @@ do
+   case $ac_config_target in
+     "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.in" ;;
+     "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
++    "Makefile.gnulib.inc") CONFIG_FILES="$CONFIG_FILES Makefile.gnulib.inc" ;;
+     "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+     "import/Makefile") CONFIG_FILES="$CONFIG_FILES import/Makefile" ;;
+     "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
+diff --git a/gnulib/configure.ac b/gnulib/configure.ac
+index acc1b1a322e..052b8bd8dc5 100644
+--- a/gnulib/configure.ac
++++ b/gnulib/configure.ac
+@@ -56,6 +56,8 @@ AC_CHECK_TOOL(AR, ar)
+ # Checks for libraries.  #
+ # ---------------------- #
+ 
++AC_CONFIG_FILES(Makefile.gnulib.inc)
++
+ AC_OUTPUT(Makefile import/Makefile,
+ [
+ case x$CONFIG_HEADERS in
+-- 
+2.27.0
+
+
--- a/src/mingw-w64.mk	Sun Apr 11 21:01:28 2021 +0200
+++ b/src/mingw-w64.mk	Sun Apr 11 12:39:19 2021 +0200
@@ -11,20 +11,26 @@
 $(PKG)_DEPS     :=
 
 define $(PKG)_UPDATE
-    $(WGET) -q -O- 'http://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/' | \
-    $(SED) -n 's,.*mingw-w64-v\([0-9.]*\)\.tar.*,\1,p' | \
-    $(SORT) -V | \
-    tail -1
+  $(WGET) -q -O- 'http://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/' | \
+  $(SED) -n 's,.*mingw-w64-v\([0-9.]*\)\.tar.*,\1,p' | \
+  $(SORT) -V | \
+  tail -1
 endef
 
+ifeq ($(OCTAVE_TARGET),default-octave)
+  # FIXME: Adapt condition when Octave 7 moves to stable or it is released.
+  $(PKG)_WINAPI_VERSION_FLAGS := --with-default-win32-winnt=0x0601
+endif
+
 define $(PKG)_BUILD
-    mkdir '$(1).headers-build'
-    cd '$(1).headers-build' && '$(1)/mingw-w64-headers/configure' \
-        --host='$(TARGET)' \
-        --prefix='$(HOST_PREFIX)' \
-        --enable-sdk=all \
-        --enable-idl \
-        --enable-secure-api
+  mkdir '$(1).headers-build'
+  cd '$(1).headers-build' && '$(1)/mingw-w64-headers/configure' \
+    --host='$(TARGET)' \
+    --prefix='$(HOST_PREFIX)' \
+    --enable-sdk=all \
+    --enable-idl \
+    --enable-secure-api \
+    $($(PKG)_WINAPI_VERSION_FLAGS)
 
-    $(MAKE) -C '$(1).headers-build' install
+  $(MAKE) -C '$(1).headers-build' install
 endef