diff mbox series

[3/3] toolchain: suppot gconv modules fro mglibc >= 2.34

Message ID 8818_1665746314_6349458A_8818_181_1_964b37c54bd0ea2c0ca9a24787249f3276aec699.1665746266.git.yann.morin@orange.com
State Accepted
Headers show
Series [1/3] Makefile: really generate glibc locales in parallel | expand

Commit Message

Yann E. MORIN Oct. 14, 2022, 11:18 a.m. UTC
Startig with glibc 2.34, the gconv modules description has been split in
two:
  - a common definition in the old location, /usr/lib/gconv/gconv-modules
  - specific defitions in a subdirectory, /usr/lib/gconv/gconv-modules.d/

This is done so as to simplify the handling of glibc gconv modules, and
eventually to segregate those outside of glibc, and so that third-parties
may also provide their own gconv converters and their definitions.

And starting with that same glibc version, most of the gconv modules
definition is moved to an extra configuration file in that
sub-directory.

It is thus no longer possible to use special code pages, like cp850,
which are very usefull to access FAT-formatted devices.

Add suppot for this new gconv layout, while keeping support for older
glibc versions. Note that the modules themselves are not moved or
renaed, just the definition files have changed.

Instead of passing the one old gonv modules definitions file on stdin,
we pass the base directory to that file, and move into the script the
responsibility to find all the gconv definition files.

Signed-off-by: Yann E. MORIN <yann.morin@orange.com>
Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Cc: Romain Naour <romain.naour@gmail.com>
Cc: Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
Cc: Giulio Benetti <giulio.benetti@benettiengineering.com>
---
 support/scripts/expunge-gconv-modules | 22 ++++++++++++++++------
 toolchain/toolchain.mk                |  9 +++++++--
 2 files changed, 23 insertions(+), 8 deletions(-)

Comments

Yann E. MORIN Oct. 21, 2022, 7:10 p.m. UTC | #1
Yann, All,

In the title: *support, from glibc

Also, many typoes in the commit log...

On 2022-10-14 13:18 +0200, yann.morin@orange.com spake thusly:
> Startig with glibc 2.34, the gconv modules description has been split in
> two:
>   - a common definition in the old location, /usr/lib/gconv/gconv-modules
>   - specific defitions in a subdirectory, /usr/lib/gconv/gconv-modules.d/
> 
> This is done so as to simplify the handling of glibc gconv modules, and
> eventually to segregate those outside of glibc, and so that third-parties
> may also provide their own gconv converters and their definitions.
> 
> And starting with that same glibc version, most of the gconv modules
> definition is moved to an extra configuration file in that
> sub-directory.
> 
> It is thus no longer possible to use special code pages, like cp850,
> which are very usefull to access FAT-formatted devices.
> 
> Add suppot for this new gconv layout, while keeping support for older
> glibc versions. Note that the modules themselves are not moved or
> renaed, just the definition files have changed.
> 
> Instead of passing the one old gonv modules definitions file on stdin,
> we pass the base directory to that file, and move into the script the
> responsibility to find all the gconv definition files.
> 
> Signed-off-by: Yann E. MORIN <yann.morin@orange.com>
> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
> Cc: Romain Naour <romain.naour@gmail.com>
> Cc: Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
> Cc: Giulio Benetti <giulio.benetti@benettiengineering.com>

Applied to master with the many typoes fixed, thanks.

Regards,
Yann E. MORIN.

> ---
>  support/scripts/expunge-gconv-modules | 22 ++++++++++++++++------
>  toolchain/toolchain.mk                |  9 +++++++--
>  2 files changed, 23 insertions(+), 8 deletions(-)
> 
> diff --git a/support/scripts/expunge-gconv-modules b/support/scripts/expunge-gconv-modules
> index bc60fc0ce4..e9ac48ca3f 100755
> --- a/support/scripts/expunge-gconv-modules
> +++ b/support/scripts/expunge-gconv-modules
> @@ -1,11 +1,17 @@
>  #!/usr/bin/env bash
>  
>  # This script is used to generate a gconv-modules file that takes into
> -# account only the gconv modules installed by Buildroot. It receives
> -# on its standard input the original complete gconv-modules file from
> -# the toolchain, and as arguments the list of gconv modules that were
> -# actually installed, and writes on its standard output the new
> -# gconv-modules file.
> +# account only the gconv modules installed by Buildroot, and generates
> +# a stripped-down gconv-moduels file on its stdout.
> +# It takes two arguments:
> +#   $1: the directory where to look for gconv modules definitions
> +#   $2: a space-separated list of gconv modules that were actually
> +#       installed
> +
> +# Starting with glibc-2.34, modules definitions are located in multiple
> +# files:
> +#   ${1}/gconv-modules
> +#   ${1}/gconv-modules.d/*.conf
>  
>  # The format of gconv-modules is precisely documented in the
>  # file itself. It consists of two different directives:
> @@ -19,7 +25,11 @@
>  # we handle each with slightly different code, since the second never has
>  # associated aliases.
>  
> -awk -v files="${2}" '
> +for f in ${1}/gconv-modules ${1}/gconv-modules.d/*.conf; do
> +    [ -e "${f}" ] || continue
> +    cat "${f}"
> +done \
> +|awk -v files="${2}" '
>  $1 == "alias" {
>      aliases[$3] = aliases[$3] " " $2;
>  }
> diff --git a/toolchain/toolchain.mk b/toolchain/toolchain.mk
> index 08d1649603..fe87a72ed4 100644
> --- a/toolchain/toolchain.mk
> +++ b/toolchain/toolchain.mk
> @@ -27,6 +27,10 @@ define TOOLCHAIN_GLIBC_COPY_GCONV_LIBS
>  		$(INSTALL) -m 0644 $(STAGING_DIR)/usr/lib/$${d}/gconv/*.so \
>  				   $(TARGET_DIR)/usr/lib/gconv \
>  		|| exit 1; \
> +		if [ -d $(STAGING_DIR)/usr/lib/$${d}/gconv/gconv-modules.d ]; then \
> +			cp -a $(STAGING_DIR)/usr/lib/$${d}/gconv/gconv-modules.d \
> +				$(TARGET_DIR)/usr/lib/gconv/ || exit 1; \
> +		fi; \
>  	else \
>  		for l in $(TOOLCHAIN_GLIBC_GCONV_LIBS); do \
>  			$(INSTALL) -m 0644 -D $(STAGING_DIR)/usr/lib/$${d}/gconv/$${l}.so \
> @@ -41,8 +45,9 @@ define TOOLCHAIN_GLIBC_COPY_GCONV_LIBS
>  				 || exit 1; \
>  			done; \
>  		done; \
> -		./support/scripts/expunge-gconv-modules "$(TOOLCHAIN_GLIBC_GCONV_LIBS)" \
> -			<$(STAGING_DIR)/usr/lib/$${d}/gconv/gconv-modules \
> +		./support/scripts/expunge-gconv-modules \
> +			$(STAGING_DIR)/usr/lib/$${d}/gconv \
> +			"$(TOOLCHAIN_GLIBC_GCONV_LIBS)" \
>  			>$(TARGET_DIR)/usr/lib/gconv/gconv-modules; \
>  	fi
>  endef
> -- 
> 2.25.1
> 
> 
> _________________________________________________________________________________________________________________________
> 
> Ce message et ses pieces jointes peuvent contenir des informations confidentielles ou privilegiees et ne doivent donc
> pas etre diffuses, exploites ou copies sans autorisation. Si vous avez recu ce message par erreur, veuillez le signaler
> a l'expediteur et le detruire ainsi que les pieces jointes. Les messages electroniques etant susceptibles d'alteration,
> Orange decline toute responsabilite si ce message a ete altere, deforme ou falsifie. Merci.
> 
> This message and its attachments may contain confidential or privileged information that may be protected by law;
> they should not be distributed, used or copied without authorisation.
> If you have received this email in error, please notify the sender and delete this message and its attachments.
> As emails may be altered, Orange is not liable for messages that have been modified, changed or falsified.
> Thank you.
> 
> _______________________________________________
> buildroot mailing list
> buildroot@buildroot.org
> https://lists.buildroot.org/mailman/listinfo/buildroot
Peter Korsgaard Nov. 4, 2022, 7:43 a.m. UTC | #2
>>>>>   <yann.morin@orange.com> writes:

 > Startig with glibc 2.34, the gconv modules description has been split in
 > two:
 >   - a common definition in the old location, /usr/lib/gconv/gconv-modules
 >   - specific defitions in a subdirectory, /usr/lib/gconv/gconv-modules.d/

 > This is done so as to simplify the handling of glibc gconv modules, and
 > eventually to segregate those outside of glibc, and so that third-parties
 > may also provide their own gconv converters and their definitions.

 > And starting with that same glibc version, most of the gconv modules
 > definition is moved to an extra configuration file in that
 > sub-directory.

 > It is thus no longer possible to use special code pages, like cp850,
 > which are very usefull to access FAT-formatted devices.

 > Add suppot for this new gconv layout, while keeping support for older
 > glibc versions. Note that the modules themselves are not moved or
 > renaed, just the definition files have changed.

 > Instead of passing the one old gonv modules definitions file on stdin,
 > we pass the base directory to that file, and move into the script the
 > responsibility to find all the gconv definition files.

 > Signed-off-by: Yann E. MORIN <yann.morin@orange.com>
 > Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
 > Cc: Romain Naour <romain.naour@gmail.com>
 > Cc: Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
 > Cc: Giulio Benetti <giulio.benetti@benettiengineering.com>

Committed to 2022.08.x and 2022.02.x, thanks.
diff mbox series

Patch

diff --git a/support/scripts/expunge-gconv-modules b/support/scripts/expunge-gconv-modules
index bc60fc0ce4..e9ac48ca3f 100755
--- a/support/scripts/expunge-gconv-modules
+++ b/support/scripts/expunge-gconv-modules
@@ -1,11 +1,17 @@ 
 #!/usr/bin/env bash
 
 # This script is used to generate a gconv-modules file that takes into
-# account only the gconv modules installed by Buildroot. It receives
-# on its standard input the original complete gconv-modules file from
-# the toolchain, and as arguments the list of gconv modules that were
-# actually installed, and writes on its standard output the new
-# gconv-modules file.
+# account only the gconv modules installed by Buildroot, and generates
+# a stripped-down gconv-moduels file on its stdout.
+# It takes two arguments:
+#   $1: the directory where to look for gconv modules definitions
+#   $2: a space-separated list of gconv modules that were actually
+#       installed
+
+# Starting with glibc-2.34, modules definitions are located in multiple
+# files:
+#   ${1}/gconv-modules
+#   ${1}/gconv-modules.d/*.conf
 
 # The format of gconv-modules is precisely documented in the
 # file itself. It consists of two different directives:
@@ -19,7 +25,11 @@ 
 # we handle each with slightly different code, since the second never has
 # associated aliases.
 
-awk -v files="${2}" '
+for f in ${1}/gconv-modules ${1}/gconv-modules.d/*.conf; do
+    [ -e "${f}" ] || continue
+    cat "${f}"
+done \
+|awk -v files="${2}" '
 $1 == "alias" {
     aliases[$3] = aliases[$3] " " $2;
 }
diff --git a/toolchain/toolchain.mk b/toolchain/toolchain.mk
index 08d1649603..fe87a72ed4 100644
--- a/toolchain/toolchain.mk
+++ b/toolchain/toolchain.mk
@@ -27,6 +27,10 @@  define TOOLCHAIN_GLIBC_COPY_GCONV_LIBS
 		$(INSTALL) -m 0644 $(STAGING_DIR)/usr/lib/$${d}/gconv/*.so \
 				   $(TARGET_DIR)/usr/lib/gconv \
 		|| exit 1; \
+		if [ -d $(STAGING_DIR)/usr/lib/$${d}/gconv/gconv-modules.d ]; then \
+			cp -a $(STAGING_DIR)/usr/lib/$${d}/gconv/gconv-modules.d \
+				$(TARGET_DIR)/usr/lib/gconv/ || exit 1; \
+		fi; \
 	else \
 		for l in $(TOOLCHAIN_GLIBC_GCONV_LIBS); do \
 			$(INSTALL) -m 0644 -D $(STAGING_DIR)/usr/lib/$${d}/gconv/$${l}.so \
@@ -41,8 +45,9 @@  define TOOLCHAIN_GLIBC_COPY_GCONV_LIBS
 				 || exit 1; \
 			done; \
 		done; \
-		./support/scripts/expunge-gconv-modules "$(TOOLCHAIN_GLIBC_GCONV_LIBS)" \
-			<$(STAGING_DIR)/usr/lib/$${d}/gconv/gconv-modules \
+		./support/scripts/expunge-gconv-modules \
+			$(STAGING_DIR)/usr/lib/$${d}/gconv \
+			"$(TOOLCHAIN_GLIBC_GCONV_LIBS)" \
 			>$(TARGET_DIR)/usr/lib/gconv/gconv-modules; \
 	fi
 endef