This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH v2] Fix multilib build


If there are no other objections, I am ok with this change and
will check it in prior to the Dec 22nd snapshot.

-- Jeff J.

----- Original Message -----
> This is an attempt to fix the problem described here:
> 
> https://sourceware.org/ml/newlib/2016/msg01139.html
> https://gcc.gnu.org/ml/gcc/2016-12/msg00010.html
> 
> There is no change if libtool is used.
> 
> Some run-time support libraries provided by GCC (e.g. libgomp) use
> configure checks to detect certain features, e.g. availability of
> thread-local storage.  The configure script generates a test program and
> tries to compile and link it.  It should use target libraries and
> startfiles of the build tree if available and not random ones from the
> installation prefix for this procedure.  The search directories
> specified by -B are a bit special, see for_each_path() in gcc.c of the
> GCC sources.  First a search is performed on all search paths with the
> multilib directory appended (if desired), then a second search is
> performed on demand with the base directory only.  For each multilib
> there is a "newlib" subdirectory.  This directory is specified by a -B
> option for the support libraries.  In order to find the newlib artifacts
> (ctr0.o, libc.a, libg.a and libm.a) they must be located in a proper
> multilib subdirectory withing the build directory.
> 
> Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
> ---
> v2: Use AM_CONDITIONAL()
> 
>  newlib/Makefile.am  | 38 +++++++++++++++++++++++++++++++-------
>  newlib/Makefile.in  | 30 ++++++++++++++++++++++++------
>  newlib/configure    | 52
>  +++++++++++++++++++++++++++++++++++++++++++++++-----
>  newlib/configure.in | 24 ++++++++++++++++++++----
>  4 files changed, 122 insertions(+), 22 deletions(-)
> 
> diff --git a/newlib/Makefile.am b/newlib/Makefile.am
> index 20ab163..f04e5d6 100644
> --- a/newlib/Makefile.am
> +++ b/newlib/Makefile.am
> @@ -77,15 +77,22 @@ toollibdir = $(tooldir)/lib$(MULTISUBDIR)
>  
>  AR_FLAGS = rc
>  
> +noinst_DATA = stmp-targ-include
> +
>  if USE_LIBTOOL
>  toollib_LTLIBRARIES = libm.la \
>  	libc.la
>  else
>  toollib_LIBRARIES = libm.a \
>  	libc.a
> +if HAVE_MULTISUBDIR
> +BUILD_MULTISUBDIR = $(builddir)$(MULTISUBDIR)
> +if HAVE_CRT0
> +noinst_DATA += $(BUILD_MULTISUBDIR)/$(CRT0)
> +endif
> +noinst_DATA += $(BUILD_MULTISUBDIR)/libc.a $(BUILD_MULTISUBDIR)/libm.a
> +endif
>  endif
> -
> -noinst_DATA = stmp-targ-include
>  
>  toollib_DATA = $(CRT0) $(CRT1)
>  
> @@ -171,23 +178,40 @@ libc/libc.a: ; @true
>  
>  libm.a: libm/libm.a
>  	rm -f $@
> -	ln libm/libm.a $@ >/dev/null 2>/dev/null || cp libm/libm.a $@
> +	ln $< $@ >/dev/null 2>/dev/null || cp $< $@
>  
>  libm/libm.a: ; @true
>  
>  endif # USE_LIBTOOL
>  
> +if HAVE_MULTISUBDIR
> +$(BUILD_MULTISUBDIR):
> +	$(MKDIR_P) $@
> +
> +$(BUILD_MULTISUBDIR)/crt0.o: $(CRT0_DIR)$(CRT0) $(BUILD_MULTISUBDIR)
> +	rm -f $@
> +	ln $< $@ >/dev/null 2>/dev/null || cp $< $@
> +
> +$(BUILD_MULTISUBDIR)/libc.a: libc.a $(BUILD_MULTISUBDIR)
> +	rm -f $@ $(BUILD_MULTISUBDIR)/libg.a
> +	ln $< $@ >/dev/null 2>/dev/null || cp $< $@
> +	ln libg.a $(BUILD_MULTISUBDIR)/libg.a >/dev/null 2>/dev/null || \
> +	  cp libg.a $(BUILD_MULTISUBDIR)/libg.a
> +
> +$(BUILD_MULTISUBDIR)/libm.a: libm.a $(BUILD_MULTISUBDIR)
> +	rm -f $@
> +	ln $< $@ >/dev/null 2>/dev/null || cp $< $@
> +endif
> +
>  crt0.o: $(CRT0_DIR)$(CRT0)
>  	rm -f $@
> -	ln $(CRT0_DIR)$(CRT0) $@ >/dev/null 2>/dev/null \
> -	 || cp $(CRT0_DIR)$(CRT0) $@
> +	ln $< $@ >/dev/null 2>/dev/null || cp $< $@
>  
>  $(CRT0_DIR)$(CRT0): ; @true
>  
>  crt1.o: $(CRT1_DIR)$(CRT1)
>  	rm -f $@
> -	ln $< $@ >/dev/null 2>/dev/null \
> -	 || cp $< $@
> +	ln $< $@ >/dev/null 2>/dev/null || cp $< $@
>  
>  $(CRT1_DIR)$(CRT1): ; @true
>  
> diff --git a/newlib/Makefile.in b/newlib/Makefile.in
> index f0296b6..63bec1c 100644
> --- a/newlib/Makefile.in
> +++ b/newlib/Makefile.in
> @@ -53,6 +53,8 @@ PRE_UNINSTALL = :
>  POST_UNINSTALL = :
>  build_triplet = @build@
>  host_triplet = @host@
> +@HAVE_CRT0_TRUE@@HAVE_MULTISUBDIR_TRUE@@USE_LIBTOOL_FALSE@am__append_1 =
> $(BUILD_MULTISUBDIR)/$(CRT0)
> +@HAVE_MULTISUBDIR_TRUE@@USE_LIBTOOL_FALSE@am__append_2 =
> $(BUILD_MULTISUBDIR)/libc.a $(BUILD_MULTISUBDIR)/libm.a
>  subdir = .
>  DIST_COMMON = NEWS README ChangeLog $(srcdir)/Makefile.in \
>  	$(srcdir)/Makefile.am $(top_srcdir)/configure \
> @@ -380,13 +382,14 @@ SUBDIRS = libc libm \
>  tooldir = $(exec_prefix)/$(host_alias)
>  toollibdir = $(tooldir)/lib$(MULTISUBDIR)
>  AR_FLAGS = rc
> +noinst_DATA = stmp-targ-include $(am__append_1) $(am__append_2)
>  @USE_LIBTOOL_TRUE@toollib_LTLIBRARIES = libm.la \
>  @USE_LIBTOOL_TRUE@	libc.la
>  
>  @USE_LIBTOOL_FALSE@toollib_LIBRARIES = libm.a \
>  @USE_LIBTOOL_FALSE@	libc.a
>  
> -noinst_DATA = stmp-targ-include
> +@HAVE_MULTISUBDIR_TRUE@@USE_LIBTOOL_FALSE@BUILD_MULTISUBDIR =
> $(builddir)$(MULTISUBDIR)
>  toollib_DATA = $(CRT0) $(CRT1)
>  
>  # The functions ldexp, frexp and modf are traditionally supplied in
> @@ -930,21 +933,36 @@ uninstall-am: uninstall-toollibDATA
> uninstall-toollibLIBRARIES \
>  
>  @USE_LIBTOOL_FALSE@libm.a: libm/libm.a
>  @USE_LIBTOOL_FALSE@	rm -f $@
> -@USE_LIBTOOL_FALSE@	ln libm/libm.a $@ >/dev/null 2>/dev/null || cp
> libm/libm.a $@
> +@USE_LIBTOOL_FALSE@	ln $< $@ >/dev/null 2>/dev/null || cp $< $@
>  
>  @USE_LIBTOOL_FALSE@libm/libm.a: ; @true
>  
> +@HAVE_MULTISUBDIR_TRUE@$(BUILD_MULTISUBDIR):
> +@HAVE_MULTISUBDIR_TRUE@	$(MKDIR_P) $@
> +
> +@HAVE_MULTISUBDIR_TRUE@$(BUILD_MULTISUBDIR)/crt0.o: $(CRT0_DIR)$(CRT0)
> $(BUILD_MULTISUBDIR)
> +@HAVE_MULTISUBDIR_TRUE@	rm -f $@
> +@HAVE_MULTISUBDIR_TRUE@	ln $< $@ >/dev/null 2>/dev/null || cp $< $@
> +
> +@HAVE_MULTISUBDIR_TRUE@$(BUILD_MULTISUBDIR)/libc.a: libc.a
> $(BUILD_MULTISUBDIR)
> +@HAVE_MULTISUBDIR_TRUE@	rm -f $@ $(BUILD_MULTISUBDIR)/libg.a
> +@HAVE_MULTISUBDIR_TRUE@	ln $< $@ >/dev/null 2>/dev/null || cp $< $@
> +@HAVE_MULTISUBDIR_TRUE@	ln libg.a $(BUILD_MULTISUBDIR)/libg.a >/dev/null
> 2>/dev/null || \
> +@HAVE_MULTISUBDIR_TRUE@	  cp libg.a $(BUILD_MULTISUBDIR)/libg.a
> +
> +@HAVE_MULTISUBDIR_TRUE@$(BUILD_MULTISUBDIR)/libm.a: libm.a
> $(BUILD_MULTISUBDIR)
> +@HAVE_MULTISUBDIR_TRUE@	rm -f $@
> +@HAVE_MULTISUBDIR_TRUE@	ln $< $@ >/dev/null 2>/dev/null || cp $< $@
> +
>  crt0.o: $(CRT0_DIR)$(CRT0)
>  	rm -f $@
> -	ln $(CRT0_DIR)$(CRT0) $@ >/dev/null 2>/dev/null \
> -	 || cp $(CRT0_DIR)$(CRT0) $@
> +	ln $< $@ >/dev/null 2>/dev/null || cp $< $@
>  
>  $(CRT0_DIR)$(CRT0): ; @true
>  
>  crt1.o: $(CRT1_DIR)$(CRT1)
>  	rm -f $@
> -	ln $< $@ >/dev/null 2>/dev/null \
> -	 || cp $< $@
> +	ln $< $@ >/dev/null 2>/dev/null || cp $< $@
>  
>  $(CRT1_DIR)$(CRT1): ; @true
>  
> diff --git a/newlib/configure b/newlib/configure
> index 30e1d57..24f41e0 100755
> --- a/newlib/configure
> +++ b/newlib/configure
> @@ -632,7 +632,11 @@ CRT1_DIR
>  CRT1
>  CRT0_DIR
>  CRT0
> +HAVE_CRT0_FALSE
> +HAVE_CRT0_TRUE
>  EXTRA_DIRS
> +HAVE_MULTISUBDIR_FALSE
> +HAVE_MULTISUBDIR_TRUE
>  HAVE_DOC_FALSE
>  HAVE_DOC_TRUE
>  subdirs
> @@ -11776,7 +11780,7 @@ else
>    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
>    lt_status=$lt_dlunknown
>    cat > conftest.$ac_ext <<_LT_EOF
> -#line 11779 "configure"
> +#line 11783 "configure"
>  #include "confdefs.h"
>  
>  #if HAVE_DLFCN_H
> @@ -11882,7 +11886,7 @@ else
>    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
>    lt_status=$lt_dlunknown
>    cat > conftest.$ac_ext <<_LT_EOF
> -#line 11885 "configure"
> +#line 11889 "configure"
>  #include "confdefs.h"
>  
>  #if HAVE_DLFCN_H
> @@ -12157,13 +12161,13 @@ subdirs="$subdirs libm"
>  
>  
>  if test -z "${with_multisubdir}"; then
> +  have_multisubdir=no
>    subdirs="$subdirs doc"
>  
> -  have_doc=yes
>  else
> -  have_doc=
> +  have_multisubdir=yes
>  fi
> - if test x$have_doc = xyes; then
> + if test x$have_multisubdir = xno; then
>    HAVE_DOC_TRUE=
>    HAVE_DOC_FALSE='#'
>  else
> @@ -12172,6 +12176,28 @@ else
>  fi
>  
>  
> +# Some run-time support libraries provided by GCC (e.g. libgomp) use
> configure
> +# checks to detect certain features, e.g. availability of thread-local
> storage.
> +# The configure script generates a test program and tries to compile and
> link
> +# it.  It should use target libraries and startfiles of the build tree if
> +# available and not random ones from the installation prefix for this
> +# procedure.  The search directories specified by -B are a bit special, see
> +# for_each_path() in gcc.c of the GCC sources.  First a search is performed
> on
> +# all search paths with the multilib directory appended (if desired), then a
> +# second search is performed on demand with the base directory only.  For
> each
> +# multilib there is a "newlib" subdirectory.  This directory is specified by
> a
> +# -B option for the support libraries.  In order to find the newlib
> artifacts
> +# (ctr0.o, libc.a, libg.a and libm.a) they must be located in a proper
> multilib
> +# subdirectory withing the build directory.
> + if test x$have_multisubdir = xyes; then
> +  HAVE_MULTISUBDIR_TRUE=
> +  HAVE_MULTISUBDIR_FALSE='#'
> +else
> +  HAVE_MULTISUBDIR_TRUE='#'
> +  HAVE_MULTISUBDIR_FALSE=
> +fi
> +
> +
>  EXTRA_DIRS=
>  case $host in
>    i[34567]86-pc-linux-*)
> @@ -12188,6 +12214,14 @@ if test "x${have_crt0}" = "xyes"; then
>    CRT0=crt0.o
>    CRT0_DIR=libc/
>  fi
> + if test x$have_crt0 = xyes; then
> +  HAVE_CRT0_TRUE=
> +  HAVE_CRT0_FALSE='#'
> +else
> +  HAVE_CRT0_TRUE='#'
> +  HAVE_CRT0_FALSE=
> +fi
> +
>  
>  
>  
> @@ -12827,6 +12861,14 @@ if test -z "${HAVE_DOC_TRUE}" && test -z
> "${HAVE_DOC_FALSE}"; then
>    as_fn_error $? "conditional \"HAVE_DOC\" was never defined.
>  Usually this means the macro was only invoked conditionally." "$LINENO" 5
>  fi
> +if test -z "${HAVE_MULTISUBDIR_TRUE}" && test -z
> "${HAVE_MULTISUBDIR_FALSE}"; then
> +  as_fn_error $? "conditional \"HAVE_MULTISUBDIR\" was never defined.
> +Usually this means the macro was only invoked conditionally." "$LINENO" 5
> +fi
> +if test -z "${HAVE_CRT0_TRUE}" && test -z "${HAVE_CRT0_FALSE}"; then
> +  as_fn_error $? "conditional \"HAVE_CRT0\" was never defined.
> +Usually this means the macro was only invoked conditionally." "$LINENO" 5
> +fi
>  if test -z "${HAVE_LONG_DOUBLE_TRUE}" && test -z
>  "${HAVE_LONG_DOUBLE_FALSE}"; then
>    as_fn_error $? "conditional \"HAVE_LONG_DOUBLE\" was never defined.
>  Usually this means the macro was only invoked conditionally." "$LINENO" 5
> diff --git a/newlib/configure.in b/newlib/configure.in
> index 01c6367..bfaf038 100644
> --- a/newlib/configure.in
> +++ b/newlib/configure.in
> @@ -261,12 +261,27 @@ AC_CONFIG_SUBDIRS(libc)
>  AC_CONFIG_SUBDIRS(libm)
>  
>  if test -z "${with_multisubdir}"; then
> +  have_multisubdir=no
>    AC_CONFIG_SUBDIRS(doc)
> -  have_doc=yes
>  else
> -  have_doc=
> -fi
> -AM_CONDITIONAL(HAVE_DOC, test x$have_doc = xyes)
> +  have_multisubdir=yes
> +fi
> +AM_CONDITIONAL(HAVE_DOC, test x$have_multisubdir = xno)
> +
> +# Some run-time support libraries provided by GCC (e.g. libgomp) use
> configure
> +# checks to detect certain features, e.g. availability of thread-local
> storage.
> +# The configure script generates a test program and tries to compile and
> link
> +# it.  It should use target libraries and startfiles of the build tree if
> +# available and not random ones from the installation prefix for this
> +# procedure.  The search directories specified by -B are a bit special, see
> +# for_each_path() in gcc.c of the GCC sources.  First a search is performed
> on
> +# all search paths with the multilib directory appended (if desired), then a
> +# second search is performed on demand with the base directory only.  For
> each
> +# multilib there is a "newlib" subdirectory.  This directory is specified by
> a
> +# -B option for the support libraries.  In order to find the newlib
> artifacts
> +# (ctr0.o, libc.a, libg.a and libm.a) they must be located in a proper
> multilib
> +# subdirectory withing the build directory.
> +AM_CONDITIONAL(HAVE_MULTISUBDIR, test x$have_multisubdir = xyes)
>  
>  EXTRA_DIRS=
>  case $host in
> @@ -283,6 +298,7 @@ if test "x${have_crt0}" = "xyes"; then
>    CRT0=crt0.o
>    CRT0_DIR=libc/
>  fi
> +AM_CONDITIONAL(HAVE_CRT0, test x$have_crt0 = xyes)
>  AC_SUBST(CRT0)
>  AC_SUBST(CRT0_DIR)
>  
> --
> 1.8.4.5
> 
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]