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.
This commit is contained in:
parent
8d75828378
commit
5ad394510b
|
@ -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) $@
|
||||
|
|
|
@ -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) $@
|
||||
|
||||
|
|
Loading…
Reference in New Issue