about summary refs log tree commit diff
path: root/Makeconfig
diff options
context:
space:
mode:
Diffstat (limited to 'Makeconfig')
-rw-r--r--Makeconfig121
1 files changed, 44 insertions, 77 deletions
diff --git a/Makeconfig b/Makeconfig
index 64ab926666..a0638f8343 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -99,7 +99,20 @@ binfmt-subdir = aout
 endif
 
 # Complete path to sysdep dirs.
-export full_config_sysdirs := $(addprefix $(..),$(config-sysdirs))
+# `configure' writes a definition of `config-sysdirs' in `config.make'.
+sysdirs := $(foreach D,$(config-sysdirs),$(firstword $(filter /%,$D) $(..)$D))
+
+# Add-ons that contribute sysdeps trees get added to the include list
+# after sysdeps/generic.  This makes #include <sysdeps/...> work right
+# to find specific add-on files without assuming the add-on directory name.
+# It also means that headers can go into an add-on's base directory
+# instead of the add-on needing a sysdeps/generic of its own.
++sysdep_dirs := $(sysdirs) $(foreach add-on,$(sysdeps-add-ons),\
+				     $(firstword $(filter /%,$(add-on)) \
+						 $(..)$(add-on)))
+ifdef objdir
++sysdep_dirs := $(objdir) $(+sysdep_dirs)
+endif
 
 # Run config.status to update config.make and config.h.  We don't show the
 # dependence of config.h to Make, because it is only touched when it
@@ -113,16 +126,16 @@ $(common-objpfx)config.make: $(common-objpfx)config.status \
 # Find all the add-on and sysdeps configure fragments, to make sure we
 # re-run configure when any of them changes.
 $(common-objpfx)config.status: $(..)version.h $(..)configure \
-			       $(foreach dir,$(full_config_sysdirs),\
-					 $(wildcard \
-					   $(dir)/Implies) \
+			       $(foreach dir,$(sysdirs),\
+					 $(wildcard $(dir)/Implies) \
 					 $(patsubst %.in,%,\
 						    $(firstword $(wildcard \
  $(addprefix $(dir)/,configure configure.in))))) \
 			       $(patsubst %.in,%,\
-					  $(foreach dir,$(add-ons),\
+					  $(foreach add-on,$(add-ons),\
 						    $(firstword $(wildcard \
- $(addprefix $(..)$(dir)/,configure configure.in)))))
+ $(addprefix $(firstword $(filter /%,$(add-on)) $(..)$(add-on))/,\
+	     configure configure.in)))))
 	@cd $(@D); if test -f $(@F); then exec $(SHELL) $(@F) --recheck; else \
 	 echo The GNU C library has not been configured. >&2; \
 	 echo Run \`configure\' to configure it before building. >&2; \
@@ -632,11 +645,10 @@ endif	# $(+cflags) == ""
 # include files (including ones given in angle brackets) in the parent
 # library source directory, in the include directory, and in the
 # current directory.
-# `+sysdep-includes' will be defined by Makerules.
-+includes = -I$(..)include \
-	    $(patsubst %/,-I%,$(objpfx)) $(+sysdep-includes) \
-	    $(patsubst %/,-I%,$(..)) $(libio-include) $(includes) -I. \
-	    $(sysincludes)
++sysdep-includes = $(addprefix -I,$(+sysdep_dirs))
++includes = -I$(..)include $(if $(subdir),$(objpfx:%/=-I%)) \
+	    $(+sysdep-includes) \
+	    $(patsubst %/,-I%,$(..)) $(libio-include) -I. $(sysincludes)
 
 # Since libio has several internal header files, we use a -I instead
 # of many little headers in the include directory.
@@ -753,12 +765,10 @@ endif
 
 move-if-change = $(SHELL) $(..)scripts/move-if-change
 
--include $(common-objpfx)sysd-dirs
-
-ifeq ($(sysd-dirs-done),t)
 -include $(common-objpfx)sysd-sorted
 subdirs = $(sorted-subdirs)
-endif
+subdir-srcdirs = $(foreach dir,$(subdirs),\
+			   $(firstword $($(dir)-srcdir) $(..)$(dir)))
 
 ifeq (yes, $(build-shared))
 
@@ -789,9 +799,8 @@ ifndef avoid-generated
 # This lets add-ons give more-specific matches that override defaults
 # in the top-level file.
 $(common-objpfx)shlib-versions.v.i: \
-	$(wildcard $(patsubst %, $(..)%/shlib-versions,$(add-ons) \
-						       $(config-sysdirs) \
-						       $(subdirs))) \
+	$(wildcard $(+sysdep_dirs:=/shlib-versions) \
+		   $(subdir-srcdirs:=/shlib-versions)) \
 	$(..)shlib-versions
 
 soversions-default-setname = $(patsubst %, %,\
@@ -891,81 +900,39 @@ endif
 
 # These are the subdirectories containing the library source.  The order
 # is more or less arbitrary.  The sorting step will take care of the
-# dependencies.  Only the $(binfmt-subdir) should always be kept at the
-# end of the list.
+# dependencies.
 all-subdirs = csu assert ctype locale intl catgets math setjmp signal	    \
-	      stdlib stdio-common libio malloc string wcsmbs time dirent \
+	      stdlib stdio-common libio malloc string wcsmbs time dirent    \
 	      grp pwd posix io termios resource misc socket sysvipc gmon    \
 	      gnulib iconv iconvdata wctype manual shadow po argp	    \
-	      crypt $(add-ons) nss localedata timezone rt conform debug	    \
-	      $(sysdep-subdirs) $(dlfcn) $(binfmt-subdir)
-all-subdirs := $(filter-out $(sysdep-inhibit-subdirs),$(all-subdirs))
-
-# The mach and hurd subdirectories have many generated header files which
-# much of the rest of the library depends on, so it is best to build them
-# first (and mach before hurd, at that).  The before-compile additions in
-# sysdeps/{mach,hurd}/Makefile should make it reliably work for these files
-# not to exist when making in other directories, but it will be slower that
-# way with more somewhat expensive `make' invocations.
-subdirs	:= $(filter mach,$(subdirs)) $(filter hurd,$(subdirs)) \
-	   $(filter-out mach hurd,$(subdirs))
+	      crypt nss localedata timezone rt conform debug		    \
+	      $(add-on-subdirs) $(dlfcn) $(binfmt-subdir)
 
 ifndef avoid-generated
-all-Subdirs-files = $(wildcard $(config-sysdirs:%=$(..)%/Subdirs))
-$(common-objpfx)sysd-dirs: $(common-objpfx)config.make $(all-Subdirs-files)
-	$(AWK) 'BEGIN { subdirs = ""; inhibit = "" };			\
-		/^#/ { next };						\
-		/^[^-]/ { subdirs = subdirs " " $$0 };			\
-		/^-/ { inhibit = inhibit " " substr($$0, 2) };		\
-		END { printf "sysdep-subdirs =%s\n", subdirs;		\
-		      printf "sysdep-inhibit-subdirs =%s\n", inhibit;	\
-		      print "sysd-dirs-done = t" }'			\
-	       $(patsubst $<,/dev/null,$^) > $@-tmp
-	mv -f $@-tmp $@
-
-all-Depend-files = $(wildcard $(..)*/Depend)
-$(common-objpfx)sysd-sorted: $(..)scripts/gen-sorted.awk $(all-Depend-files) \
-			     $(common-objpfx)sysd-dirs $(..)Makeconfig
-	{ { dirs='$(patsubst $(..)%/Depend,%,$(filter %/Depend,$^))';	  \
-	    for d in $$dirs; do						  \
-	      while read on; do						  \
-		echo "depend $$d $$on";					  \
-	      done < $(..)$$d/Depend;					  \
-	    done;							  \
-	    for f in $(all-subdirs); do					  \
-	      echo $$f;							  \
-	    done;							  \
-	  } | $(AWK) -f $< &&						  \
-	  echo sysd-sorted-done = t;					  \
-	} > $@-tmp
+all-Depend-files := $(wildcard $(foreach dir,$(all-subdirs),\
+					 $(firstword $($(dir)-srcdir) \
+						     $(..)$(dir))/Depend))
+$(common-objpfx)sysd-sorted: $(..)scripts/gen-sorted.awk \
+			     $(common-objpfx)config.make $(..)Makeconfig \
+			     $(wildcard $(sysdirs:=/Subdirs)) \
+			     $(all-Depend-files)
+	$(AWK) -f $< \
+	       -v subdirs='$(all-subdirs)' \
+	       -v srcpfx='$(..)' \
+	       $(filter %/Subdirs %/Depend,$^) > $@-tmp
 	mv -f $@-tmp $@
 $(all-Depend-files): ;
 endif
 
 # Let sysdeps/ subdirs contain a Makeconfig fragment for us to include here.
-sysdep-makeconfigs := $(wildcard $(patsubst %,$(..)%/Makeconfig,\
-					    $(config-sysdirs) $(add-ons)))
-
+sysdep-makeconfigs := $(wildcard $(+sysdep_dirs:=/Makeconfig))
 ifneq (,$(sysdep-makeconfigs))
-Makeconfig-doing-sysdep := $(sysdep-makeconfigs)
-# Before each one, include ourselves again to do the bit below that
-# will set `Makeconfig-add-on' in an add-on's Makeconfig fragment.
-include $(foreach M,$(sysdep-makeconfigs),$(..)Makeconfig $M)
+include $(sysdep-makeconfigs)
 endif
 
 
 endif # Makeconfig not yet included
 
-# The whole body above didn't run when we are included as a subroutine
-# of ourselves in the sysdep-makeconfigs include line.  This bit runs.
-ifneq (,$(Makeconfig-doing-sysdep))
-sysdep-Makeconfig := $(firstword $(Makeconfig-doing-sysdep))
-Makeconfig-doing-sysdep := $(filter-out $(sysdep-Makeconfig),\
-					$(Makeconfig-doing-sysdep))
-Makeconfig-add-on := $(filter $(add-ons),$(patsubst $(..)%/Makeconfig,%,\
-						    $(sysdep-Makeconfig)))
-endif
-
 # Local Variables:
 # mode: makefile
 # End: