This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[ping4][PATCH 03/19 v2] Auto-generate libc-modules.h
- From: Siddhesh Poyarekar <siddhesh at redhat dot com>
- To: libc-alpha at sourceware dot org
- Cc: Roland McGrath <roland at hack dot frob dot com>
- Date: Tue, 14 Oct 2014 21:51:17 +0530
- Subject: [ping4][PATCH 03/19 v2] Auto-generate libc-modules.h
- Authentication-results: sourceware.org; auth=none
- References: <1408618663-2281-1-git-send-email-siddhesh at redhat dot com> <1408618663-2281-4-git-send-email-siddhesh at redhat dot com> <20140828061128 dot GH8020 at spoyarek dot pnq dot redhat dot com> <20140917124329 dot GV6586 at spoyarek dot pnq dot redhat dot com> <20140924090632 dot GJ1716 at spoyarek dot pnq dot redhat dot com> <20141001081750 dot GH2217 at spoyarek dot pnq dot redhat dot com>
Ping!
On Wed, Oct 01, 2014 at 01:47:50PM +0530, Siddhesh Poyarekar wrote:
> Rebased against current master and verified that the generated code is
> still unchanged.
>
> Siddhesh
>
> commit 33724079bde7aca8149fa9c2831578041cf7da03
> Author: Siddhesh Poyarekar <siddhesh@redhat.com>
> Date: Thu Aug 21 11:44:54 2014 +0530
>
> Auto-generate libc-modules.h
>
> Remove libc-modules.h from the tree and auto-generate it from
> soversions.i and a new file build.list. Macros generated from
> soversions.i have lower values starting from 1, while those from
> build.list start from a special value MODULE_OTHER_BEGIN, which has a
> high enough value (1000). 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 (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.
> * build.list: New file.
> * 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.
>
> diff --git a/Makeconfig b/Makeconfig
> index 671eceb..5ffbd92 100644
> --- a/Makeconfig
> +++ b/Makeconfig
> @@ -813,10 +813,22 @@ endif # $(+cflags) == ""
> # of many little headers in the include directory.
> libio-include = -I$(..)libio
>
> +# 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 = $(strip $(foreach lib,$(libof-$(basename $(@F))) $(libof-$(<F)) \
> $(libof-$(@F)),-DIN_MODULE=MODULE_$(lib)))
>
> module-def = $(if $(in-module),$(in-module),-DIN_MODULE=MODULE_libc)
> +module-cppflags-real = -include $(common-objpfx)libc-modules.h $(module-def)
> +
> +# 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
> @@ -824,9 +836,9 @@ module-def = $(if $(in-module),$(in-module),-DIN_MODULE=MODULE_libc)
> # 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 $@)) $(module-def) \
> + $(CPPFLAGS-$(suffix $@)) \
> $(foreach lib,$(libof-$(basename $(@F))) \
> $(libof-$(<F)) $(libof-$(@F)),$(CPPFLAGS-$(lib))) \
> $(CPPFLAGS-$(<F)) $(CPPFLAGS-$(@F)) $(CPPFLAGS-$(basename $(@F)))
> @@ -986,6 +998,24 @@ 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 \
> + $(..)build.list
> + $(AWK) -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/build.list b/build.list
> new file mode 100644
> index 0000000..eab57c7
> --- /dev/null
> +++ b/build.list
> @@ -0,0 +1,15 @@
> +iconvprogs
> +iconvdata
> +ldconfig
> +lddlibc4
> +libmemusage
> +libSegFault
> +libpcprofile
> +librpcsvc
> +libutil
> +locale_programs
> +memusagestat
> +nonlib
> +nscd
> +extramodules
> +libnldbl
> diff --git a/include/libc-modules.h b/include/libc-modules.h
> deleted file mode 100644
> index d12fb90..0000000
> --- a/include/libc-modules.h
> +++ /dev/null
> @@ -1,37 +0,0 @@
> -#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 131d7eb..9b8208b 100644
> --- a/include/libc-symbols.h
> +++ b/include/libc-symbols.h
> @@ -20,8 +20,6 @@
> #ifndef _LIBC_SYMBOLS_H
> #define _LIBC_SYMBOLS_H 1
>
> -#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 0000000..d3382b6
> --- /dev/null
> +++ b/scripts/gen-libc-modules.awk
> @@ -0,0 +1,40 @@
> +# 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 mentioned one-per-line in build.list.
> +BEGIN {
> + PROCINFO["sorted_in"] = "@val_type_asc"
> + shlibs = 1
> + others = 1000
> + libs["OTHERS_BEGIN"] = others++
> +}
> +
> +# Skip over comments.
> +$1 == "#" {
> + next
> +}
> +
> +# build.list is simply one module per line.
> +match (FILENAME, ".*build.list") {
> + libs[$0] = others++
> +}
> +
> +# 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"
> +
> + if (!(name in libs)) {
> + libs[name] = shlibs++
> + }
> +}
> +
> +# Finally, print out the header file.
> +END {
> + printf ("/* AUTOGENERATED BY gen-libc-modules.awk, DO NOT EDIT. */\n\n")
> + i = 1
> + for (l in libs) {
> + printf ("#define MODULE_%s %d\n", l, libs[l])
> + }
> +}
> diff --git a/sysdeps/unix/Makefile b/sysdeps/unix/Makefile
> index 0e535b6..573e90d 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)' \