public inbox for newlib-cvs@sourceware.org
help / color / mirror / Atom feed
* [newlib-cygwin] newlib: libm: workaround ar duplicate member behavior
@ 2022-02-24  2:56 Michael Frysinger
  0 siblings, 0 replies; only message in thread
From: Michael Frysinger @ 2022-02-24  2:56 UTC (permalink / raw)
  To: newlib-cvs

https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=5ad394510bb36aaebd5bb054a5bf4730f666947b

commit 5ad394510bb36aaebd5bb054a5bf4730f666947b
Author: Mike Frysinger <vapier@gentoo.org>
Date:   Mon Feb 21 15:42:18 2022 -0500

    newlib: libm: workaround ar duplicate member behavior
    
    GNU ar has undocumented behavior where it doesn't dedupe its inputs if
    they're all on the same command line, so we have to dedupe ourselves.

Diff:
---
 newlib/Makefile.am | 28 ++++++++++++++++++++++++++++
 newlib/Makefile.in | 24 +++++++++++++++++++-----
 2 files changed, 47 insertions(+), 5 deletions(-)

diff --git a/newlib/Makefile.am b/newlib/Makefile.am
index 80256952d..1a5123f0a 100644
--- a/newlib/Makefile.am
+++ b/newlib/Makefile.am
@@ -85,6 +85,25 @@ toollib_DATA = $(CRT0) $(CRT1)
 
 CLEANFILES += libg.a
 
+## GNU ar has undocumented behavior when specifying the same name multiple times
+## in a single invocation, so we have to dedupe ourselves.  The algorithm here:
+## - Generates the set of unique objects based on the basename.
+## - Favors objects later in the list (since machine objects come last).
+## - Outputs object list in same order as input for reproducibility.
+## https://sourceware.org/PR28917
+AWK_UNIQUE_OBJS = $(AWK) '{ \
+  for (i = NF; i > 0; --i) { \
+    split($$i, parts, "/"); \
+    name = parts[length(parts)]; \
+    if (!(name in seen)) { \
+      objs[i] = $$i; \
+      seen[name] = 1; \
+    } \
+  } \
+  for (i in objs) \
+    print objs[i]; \
+}'
+
 # The functions ldexp, frexp and modf are traditionally supplied in
 # both libc.a and libm.a.  We build them in libm.a and copy them over,
 # along with some required supporting routines.
@@ -122,8 +141,17 @@ libm_a_SOURCES =
 libm_a_CFLAGS = $(AM_CFLAGS) $(libm_a_CFLAGS_$(subst /,_,$(@D))) $(libm_a_CFLAGS_$(subst /,_,$(@D)_$(<F)))
 libm_a_CCASFLAGS = $(AM_CCASFLAGS) $(libm_a_CCASFLAGS_$(subst /,_,$(@D))) $(libm_a_CCASFLAGS_$(subst /,_,$(@D)_$(<F)))
 libm_a_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/libm/common $(libm_a_CPPFLAGS_$(subst /,_,$(@D))) $(libm_a_CPPFLAGS_$(subst /,_,$(@D)_$(<F)))
+## Best to avoid libm_a_LIBADD entirely to avoid having 2 independent lists
+## with separate overriding behavior (libm_a_OBJECTS is the other).  See the
+## AWK_UNIQUE_OBJS comment aove for more details.
 $(libm_a_OBJECTS): stmp-targ-include
 
+libm.a: $(libm_a_OBJECTS) $(libm_a_DEPENDENCIES)
+	$(AM_V_at)rm -f $@
+	$(AM_V_AR)objs=`echo $(libm_a_OBJECTS) | $(AWK_UNIQUE_OBJS)` || exit $$?; \
+	  $(AR) $(ARFLAGS) $@ $$objs
+	$(AM_V_at)$(RANLIB) $@
+
 if HAVE_MULTISUBDIR
 $(BUILD_MULTISUBDIR):
 	$(MKDIR_P) $@
diff --git a/newlib/Makefile.in b/newlib/Makefile.in
index 2b60ef1ca..cc7afc704 100644
--- a/newlib/Makefile.in
+++ b/newlib/Makefile.in
@@ -1361,6 +1361,19 @@ toollib_LIBRARIES = libm.a \
 
 @HAVE_MULTISUBDIR_TRUE@BUILD_MULTISUBDIR = $(builddir)$(MULTISUBDIR)
 toollib_DATA = $(CRT0) $(CRT1)
+AWK_UNIQUE_OBJS = $(AWK) '{ \
+  for (i = NF; i > 0; --i) { \
+    split($$i, parts, "/"); \
+    name = parts[length(parts)]; \
+    if (!(name in seen)) { \
+      objs[i] = $$i; \
+      seen[name] = 1; \
+    } \
+  } \
+  for (i in objs) \
+    print objs[i]; \
+}'
+
 
 # The functions ldexp, frexp and modf are traditionally supplied in
 # both libc.a and libm.a.  We build them in libm.a and copy them over,
@@ -3248,11 +3261,6 @@ libm/machine/x86_64/libm_a-fetestexcept.$(OBJEXT):  \
 libm/machine/x86_64/libm_a-feupdateenv.$(OBJEXT):  \
 	libm/machine/x86_64/$(am__dirstamp)
 
-libm.a: $(libm_a_OBJECTS) $(libm_a_DEPENDENCIES) $(EXTRA_libm_a_DEPENDENCIES) 
-	$(AM_V_at)-rm -f libm.a
-	$(AM_V_AR)$(libm_a_AR) libm.a $(libm_a_OBJECTS) $(libm_a_LIBADD)
-	$(AM_V_at)$(RANLIB) libm.a
-
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
 	-rm -f libm/common/*.$(OBJEXT)
@@ -8650,6 +8658,12 @@ libg.a: libc.a
 	$(AM_V_GEN)ln libc.a libg.a >/dev/null 2>/dev/null || cp libc.a libg.a
 $(libm_a_OBJECTS): stmp-targ-include
 
+libm.a: $(libm_a_OBJECTS) $(libm_a_DEPENDENCIES)
+	$(AM_V_at)rm -f $@
+	$(AM_V_AR)objs=`echo $(libm_a_OBJECTS) | $(AWK_UNIQUE_OBJS)` || exit $$?; \
+	  $(AR) $(ARFLAGS) $@ $$objs
+	$(AM_V_at)$(RANLIB) $@
+
 @HAVE_MULTISUBDIR_TRUE@$(BUILD_MULTISUBDIR):
 @HAVE_MULTISUBDIR_TRUE@	$(MKDIR_P) $@


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-02-24  2:56 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-24  2:56 [newlib-cygwin] newlib: libm: workaround ar duplicate member behavior Michael Frysinger

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).