summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSiddhesh Poyarekar <siddhesh@redhat.com>2014-11-19 12:16:00 +0530
committerSiddhesh Poyarekar <siddhesh@redhat.com>2014-11-19 12:16:00 +0530
commit130ac68ca25c9aa65e027e3e37337bc048205c69 (patch)
tree14b5c6ef5c52c1e466952961bcb35356a5d51bc4
parent286663c34b006c1409df4a71f89d6d4d5d01df09 (diff)
downloadglibc-130ac68ca25c9aa65e027e3e37337bc048205c69.tar.gz
Auto-generate libc-modules.h
Remove libc-modules.h from the tree and auto-generate it from soversions.i and the list of modules in the built-modules variable defined in Makeconfig. Macros generated have increasing numbered values, with built-modules having lower values starting from 1, following which a separator value LIBS_BEGIN is added and then finally the library names from soversions.i are appended to the list. This allows us to conveniently differentiate between the versioned libraries and other built modules, which is needed in errno.h and netdb.h to decide whether to use an internal symbol or an external one. Verified that generated code remains unchanged on x86_64. * Makeconfig (built-modules): List non-library modules to be built. (module-cppflags): Include libc-modules.h for everything except shlib-versions.v.i. (CPPFLAGS): Use it. (before-compile): Add libc-modules.h. ($(common-objpfx)libc-modules.h, $(common-objpfx)libc-modules.stmp): New targets. (common-generated): Add libc-modules.h and libc-modules.stmp. ($(common-objpfx)Versions.v.i): Depend on libc-modules.h. * include/libc-symbols.h: Don't include libc-modules.h. * include/libc-modules.h: Remove file. * scripts/gen-libc-modules.awk: New script to generate libc-modules.h. * sysdeps/unix/Makefile ($(common-objpfx)sysd-syscalls): Depend on libc-modules.stmp.
-rw-r--r--ChangeLog17
-rw-r--r--Makeconfig40
-rw-r--r--include/libc-modules.h41
-rw-r--r--include/libc-symbols.h3
-rw-r--r--scripts/gen-libc-modules.awk34
-rw-r--r--sysdeps/unix/Makefile3
6 files changed, 91 insertions, 47 deletions
diff --git a/ChangeLog b/ChangeLog
index d2460f86cf..09e308c9c7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,22 @@
2014-11-19 Siddhesh Poyarekar <siddhesh@redhat.com>
+ * Makeconfig (built-modules): List non-library modules to be
+ built.
+ (module-cppflags): Include libc-modules.h for
+ everything except shlib-versions.v.i.
+ (CPPFLAGS): Use it.
+ (before-compile): Add libc-modules.h.
+ ($(common-objpfx)libc-modules.h,
+ $(common-objpfx)libc-modules.stmp): New targets.
+ (common-generated): Add libc-modules.h and libc-modules.stmp.
+ ($(common-objpfx)Versions.v.i): Depend on libc-modules.h.
+ * include/libc-symbols.h: Don't include libc-modules.h.
+ * include/libc-modules.h: Remove file.
+ * scripts/gen-libc-modules.awk: New script to generate
+ libc-modules.h.
+ * sysdeps/unix/Makefile ($(common-objpfx)sysd-syscalls):
+ Depend on libc-modules.stmp.
+
* include/shlib-compat.h (_SHLIB_COMPAT): Use IS_IN.
* Makeconfig (in-module): Get value of libof set for the
diff --git a/Makeconfig b/Makeconfig
index 9f88f7ca5b..1a26cc5568 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -813,20 +813,39 @@ endif # $(+cflags) == ""
# of many little headers in the include directory.
libio-include = -I$(..)libio
+# List of non-library modules that we build.
+built-modules = iconvprogs iconvdata ldconfig lddlibc4 libmemusage \
+ libSegFault libpcprofile librpcsvc locale-programs \
+ memusagestat nonlib nscd extramodules libnldbl
+
+# We don't include libc-modules.h when these targets are being built. These
+# targets don't (and will likely never need to) use the IS_IN facility. In
+# fact, shlib-versions should not use it because that will create a circular
+# dependency as libc-modules.h is generated from shlib-versions.
+skip-module-cppflags = shlib-versions.v.i Versions.v.i
+
in-module = $(subst -,_,$(firstword $(libof-$(basename $(@F))) \
$(libof-$(<F)) \
$(libof-$(@F)) \
libc))
+module-cppflags-real = -include $(common-objpfx)libc-modules.h \
+ -DIN_MODULE=MODULE_$(in-module)
+
+# We don't need libc-modules.h and the IN_MODULE definition for
+# shlib-version.v.i.
+module-cppflags = $(if $(filter $(@F),$(skip-module-cppflags)), \
+ ,$(module-cppflags-real))
+
# These are the variables that the implicit compilation rules use.
# Note that we can't use -std=* in CPPFLAGS, because it overrides
# the implicit -lang-asm and breaks cpp behavior for .S files--notably
# it causes cpp to stop predefining __ASSEMBLER__.
CPPFLAGS = $(config-extra-cppflags) $(CPPUNDEFS) $(CPPFLAGS-config) \
$($(subdir)-CPPFLAGS) \
- $(+includes) $(defines) \
+ $(+includes) $(defines) $(module-cppflags) \
-include $(..)include/libc-symbols.h $(sysdep-CPPFLAGS) \
- $(CPPFLAGS-$(suffix $@)) -DIN_MODULE=MODULE_$(in-module) \
+ $(CPPFLAGS-$(suffix $@)) \
$(foreach lib,$(libof-$(basename $(@F))) \
$(libof-$(<F)) $(libof-$(@F)),$(CPPFLAGS-$(lib))) \
$(CPPFLAGS-$(<F)) $(CPPFLAGS-$(@F)) $(CPPFLAGS-$(basename $(@F)))
@@ -986,6 +1005,23 @@ endif
postclean-generated += soversions.mk soversions.i \
shlib-versions.v shlib-versions.v.i
+before-compile += $(common-objpfx)libc-modules.h
+ifeq ($(soversions.mk-done),t)
+# Generate a header with macro definitions for use with the IS_IN macro.
+# These are the possible values for the IN_MODULE macro defined when building
+# sources, to identify which module the translation unit is going to be built
+# into.
+$(common-objpfx)libc-modules.h: $(common-objpfx)libc-modules.stmp; @:
+$(common-objpfx)libc-modules.stmp: $(..)scripts/gen-libc-modules.awk \
+ $(common-objpfx)soversions.i
+ $(AWK) -v buildlist="$(subst -,_,$(built-modules))" -f $^ > ${@:stmp=T}
+ $(move-if-change) ${@:stmp=T} ${@:stmp=h}
+ touch $@
+
+endif
+
+common-generated += libc-modules.h libc-modules.stmp
+
# The name under which the run-time dynamic linker is installed.
# We are currently going for the convention that `/lib/ld.so.1'
# names the SVR4/ELF ABI-compliant dynamic linker.
diff --git a/include/libc-modules.h b/include/libc-modules.h
deleted file mode 100644
index 029b600bea..0000000000
--- a/include/libc-modules.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Valid values for the IN_MODULE macro, which is defined for each source file
- during compilation to indicate which module it is to be built into.
-
- TODO: This file should eventually be auto-generated. */
-#define MODULE_libc 1
-#define MODULE_libpthread 2
-#define MODULE_rtld 3
-#define MODULE_libdl 4
-#define MODULE_libm 5
-#define MODULE_iconvprogs 6
-#define MODULE_iconvdata 7
-#define MODULE_lddlibc4 8
-#define MODULE_locale_programs 9
-#define MODULE_memusagestat 10
-#define MODULE_libutil 12
-#define MODULE_libBrokenLocale 13
-#define MODULE_libmemusage 15
-#define MODULE_libresolv 16
-#define MODULE_libnss_db 17
-#define MODULE_libnss_files 18
-#define MODULE_libnss_dns 19
-#define MODULE_libnss_compat 20
-#define MODULE_libnss_hesiod 21
-#define MODULE_libnss_nis 22
-#define MODULE_libnss_nisplus 23
-#define MODULE_libanl 24
-#define MODULE_librt 25
-#define MODULE_libSegFault 26
-#define MODULE_libthread_db 27
-#define MODULE_libcidn 28
-#define MODULE_libcrypt 29
-#define MODULE_libnsl 30
-#define MODULE_libpcprofile 31
-#define MODULE_librpcsvc 32
-#define MODULE_nscd 33
-#define MODULE_ldconfig 34
-#define MODULE_libnldbl 35
-
-/* Catch-all for test modules and other binaries. */
-#define MODULE_nonlib 98
-#define MODULE_extramodules 99
diff --git a/include/libc-symbols.h b/include/libc-symbols.h
index 58c357725d..9c5c9bb850 100644
--- a/include/libc-symbols.h
+++ b/include/libc-symbols.h
@@ -20,9 +20,6 @@
#ifndef _LIBC_SYMBOLS_H
#define _LIBC_SYMBOLS_H 1
-/* Pull in definitions for the MODULE_* macros. */
-#include <libc-modules.h>
-
#define IS_IN(lib) (IN_MODULE == MODULE_##lib)
/* This file's macros are included implicitly in the compilation of every
diff --git a/scripts/gen-libc-modules.awk b/scripts/gen-libc-modules.awk
new file mode 100644
index 0000000000..2f92cd41b2
--- /dev/null
+++ b/scripts/gen-libc-modules.awk
@@ -0,0 +1,34 @@
+# Generate a header file that defines the MODULE_* macros for each library and
+# module we build in glibc. The library names are pulled in from soversions.i
+# and the additional modules are passed in the BUILDLIST variable.
+BEGIN {
+ # BUILDLIST is set from the build-list variable in Makeconfig and is a space
+ # separated list of non-library modules that we build in glibc.
+ num = split (buildlist, libs, " ")
+ # Separate the built modules from the libraries.
+ libs[++num] = "LIBS_BEGIN"
+}
+
+# Skip over comments.
+$1 == "#" {
+ next
+}
+
+# We have only one special case in soversions.i parsing, which is to replace ld
+# with rtld since that's what we call it throughout the sources.
+match (FILENAME, ".*soversions.i") {
+ name = $2
+ if (name == "ld")
+ name = "rtld"
+
+ # Library names are not duplicated in soversions.i.
+ libs[++num] = name
+}
+
+# Finally, print out the header file.
+END {
+ printf ("/* AUTOGENERATED BY gen-libc-modules.awk, DO NOT EDIT. */\n\n")
+ for (l in libs) {
+ printf ("#define MODULE_%s %d\n", libs[l], l)
+ }
+}
diff --git a/sysdeps/unix/Makefile b/sysdeps/unix/Makefile
index 0e535b63f9..573e90d57f 100644
--- a/sysdeps/unix/Makefile
+++ b/sysdeps/unix/Makefile
@@ -79,7 +79,8 @@ compile-syscall = $(COMPILE.S) -o $@ -x assembler-with-cpp - \
ifndef avoid-generated
$(common-objpfx)sysd-syscalls: $(..)sysdeps/unix/make-syscalls.sh \
- $(wildcard $(+sysdep_dirs:%=%/syscalls.list))
+ $(wildcard $(+sysdep_dirs:%=%/syscalls.list)) \
+ $(common-objpfx)libc-modules.stmp
for dir in $(+sysdep_dirs); do \
test -f $$dir/syscalls.list && \
{ sysdirs='$(sysdirs)' \