diff mbox series

[v1,2/3] package/postgresql: needs locale command

Message ID 20200920150659.7562-2-ps.report@gmx.net
State Changes Requested
Headers show
Series [v1,1/3] package/glibc: install locale cmd independent of NLS | expand

Commit Message

Peter Seiderer Sept. 20, 2020, 3:06 p.m. UTC
Running (as e.g. /etc/init.d/S50postgresql does):

  su - postgres -c '/usr/bin/pg_ctl initdb -D /var/lib/pgsql'

gives the following warning:

  performing post-bootstrap initialization ... sh: locale: not found
  1970-01-01 01:13:43.498 UTC [246] WARNING:  no usable system locales were found
  ok

Strace (greped for locale) of the command shows:

  247   execve("/bin/sh", ["sh", "-c", "locale -a"], 0x1ece86e0 /* 18 vars */ <unfinished ...>
  247   newfstatat(AT_FDCWD, "/bin/locale", 0x7fcbe31a30, 0) = -1 ENOENT (No such file or directory)
  247   newfstatat(AT_FDCWD, "/sbin/locale", 0x7fcbe31a30, 0) = -1 ENOENT (No such file or directory)
  247   newfstatat(AT_FDCWD, "/usr/bin/locale", 0x7fcbe31a30, 0) = -1 ENOENT (No such file or directory)
  247   newfstatat(AT_FDCWD, "/usr/sbin/locale", 0x7fcbe31a30, 0) = -1 ENOENT (No such file or directory)
  247   write(2, "locale: not found", 17) = 17

Fix it by selecting BR2_PACKAGE_GLIBC_UTILS providing the locale command
for glibc.

Signed-off-by: Peter Seiderer <ps.report@gmx.net>
---
Notes:

 - tested with the following defconfig

    BR2_aarch64=y
    BR2_cortex_a72=y
    BR2_ARM_FPU_VFPV4=y
    BR2_TOOLCHAIN_BUILDROOT_GLIBC=y
    BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_5_4=y
    BR2_TOOLCHAIN_BUILDROOT_CXX=y
    BR2_SYSTEM_DHCP="eth0"
    BR2_ROOTFS_POST_BUILD_SCRIPT="board/raspberrypi4-64/post-build.sh"
    BR2_ROOTFS_POST_IMAGE_SCRIPT="board/raspberrypi4-64/post-image.sh"
    BR2_ROOTFS_POST_SCRIPT_ARGS="--add-miniuart-bt-overlay --aarch64"
    BR2_LINUX_KERNEL=y
    BR2_LINUX_KERNEL_CUSTOM_TARBALL=y
    BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION="$(call github,raspberrypi,linux,1c64f4bc22811d2d371b271daa3fb27895a8abdd)/linux-1c64f4bc22811d2d371b271daa3fb27895a8abdd.tar.gz"
    BR2_LINUX_KERNEL_DEFCONFIG="bcm2711"
    BR2_LINUX_KERNEL_DTS_SUPPORT=y
    BR2_LINUX_KERNEL_INTREE_DTS_NAME="broadcom/bcm2711-rpi-4-b"
    BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL=y
    BR2_PACKAGE_STRACE=y
    BR2_PACKAGE_RPI_FIRMWARE=y
    BR2_PACKAGE_RPI_FIRMWARE_VARIANT_PI4=y
    BR2_PACKAGE_POSTGRESQL=y
    BR2_TARGET_ROOTFS_EXT2=y
    BR2_TARGET_ROOTFS_EXT2_4=y
    BR2_TARGET_ROOTFS_EXT2_SIZE="192M"
    # BR2_TARGET_ROOTFS_TAR is not set
    BR2_PACKAGE_HOST_DOSFSTOOLS=y
    BR2_PACKAGE_HOST_GENIMAGE=y
    BR2_PACKAGE_HOST_MTOOLS=y
---
 package/postgresql/Config.in | 1 +
 1 file changed, 1 insertion(+)

Comments

Thomas Petazzoni Sept. 21, 2020, 8:20 a.m. UTC | #1
Hello,

On Sun, 20 Sep 2020 17:06:58 +0200
Peter Seiderer <ps.report@gmx.net> wrote:

> Running (as e.g. /etc/init.d/S50postgresql does):
> 
>   su - postgres -c '/usr/bin/pg_ctl initdb -D /var/lib/pgsql'
> 
> gives the following warning:
> 
>   performing post-bootstrap initialization ... sh: locale: not found
>   1970-01-01 01:13:43.498 UTC [246] WARNING:  no usable system locales were found
>   ok

What is the situation with uClibc and musl toolchains ? Do they provide
the "locale" command as well ?

What about external glibc toolchains ? Do we install/copy the locale
tool to the target ?

Thomas
Peter Seiderer Sept. 21, 2020, 8:04 p.m. UTC | #2
Hello Thomas,

On Mon, 21 Sep 2020 10:20:13 +0200, Thomas Petazzoni <thomas.petazzoni@bootlin.com> wrote:

> Hello,
>
> On Sun, 20 Sep 2020 17:06:58 +0200
> Peter Seiderer <ps.report@gmx.net> wrote:
>
> > Running (as e.g. /etc/init.d/S50postgresql does):
> >
> >   su - postgres -c '/usr/bin/pg_ctl initdb -D /var/lib/pgsql'
> >
> > gives the following warning:
> >
> >   performing post-bootstrap initialization ... sh: locale: not found
> >   1970-01-01 01:13:43.498 UTC [246] WARNING:  no usable system locales were found
> >   ok
>
> What is the situation with uClibc and musl toolchains ? Do they provide
> the "locale" command as well ?

- uclibc without BR2_TOOLCHAIN_BUILDROOT_LOCALE: no warning, no locale command ([1])
- uclicc with BR2_TOOLCHAIN_BUILDROOT_LOCALE: no warning, locale command installed on target
- musl: 'locale: not found' warning, no locale commmand

But it is 'only' a warning... and easy to fix for gcc/buildroot toolchain...

>
> What about external glibc toolchains ? Do we install/copy the locale
> tool to the target ?

Do not know...., but it is only a warning...

Regards,
Peter

[1] The usage of the locale command depends on 'HAVE_LOCALE_T' which depends
on the availability of the locale_t type (see postgresql-12.4/config/c-library.m4
and postgresql-12.4/src/backend/commands/collationcmds.c)

>
> Thomas
Arnout Vandecappelle Sept. 21, 2020, 9:22 p.m. UTC | #3
Hi Peter,

On 21/09/2020 22:04, Peter Seiderer wrote:
> Hello Thomas,
> 
> On Mon, 21 Sep 2020 10:20:13 +0200, Thomas Petazzoni <thomas.petazzoni@bootlin.com> wrote:
> 
>> Hello,
>>
>> On Sun, 20 Sep 2020 17:06:58 +0200
>> Peter Seiderer <ps.report@gmx.net> wrote:
>>
>>> Running (as e.g. /etc/init.d/S50postgresql does):
>>>
>>>   su - postgres -c '/usr/bin/pg_ctl initdb -D /var/lib/pgsql'
>>>
>>> gives the following warning:
>>>
>>>   performing post-bootstrap initialization ... sh: locale: not found
>>>   1970-01-01 01:13:43.498 UTC [246] WARNING:  no usable system locales were found
>>>   ok
>>
>> What is the situation with uClibc and musl toolchains ? Do they provide
>> the "locale" command as well ?
> 
> - uclibc without BR2_TOOLCHAIN_BUILDROOT_LOCALE: no warning, no locale command ([1])
> - uclicc with BR2_TOOLCHAIN_BUILDROOT_LOCALE: no warning, locale command installed on target
> - musl: 'locale: not found' warning, no locale commmand
> 
> But it is 'only' a warning... and easy to fix for gcc/buildroot toolchain...
> 
>>
>> What about external glibc toolchains ? Do we install/copy the locale
>> tool to the target ?

 I checked - no, we don't install it, even if it is part of the toolchain sysroot.

> Do not know...., but it is only a warning...

 It is only a warning, but this patch is meant to get rid of that warning, no?
If this series only fixes that warning for the internal toolchain, I don't think
it's very useful.

 But probably toolchain-external-pkg.mk should be fixed to install locale if
available, just like we do for ldd. And maybe also ldconfig and getconf (the
other two glibc utils we install) should be handled in the same way?


> Regards,
> Peter
> 
> [1] The usage of the locale command depends on 'HAVE_LOCALE_T' which depends
> on the availability of the locale_t type (see postgresql-12.4/config/c-library.m4
> and postgresql-12.4/src/backend/commands/collationcmds.c)

 We could instead prepopulate the cache variable pgac_cv_type_locale_t with the
presence of the locale binary in the target directory. Something like:

POSTGRESQL_CONF_ENV += pgac_cv_type_locale_t=$(if $(wildcard
$(TARGET_DIR)/usr/bin/locale),yes,no)

 This is assuming that the presence of the locale executable corresponds with
the availability of locales (which is apparently not the case for musl, but I
think that that should be considered a bug in our musl integration). But at
least for glibc and uClibc it seems to be correct.

 This solution also removes the need for patch 1/3, which I thought was a bit
iffy anyway.

 Regards,
 Arnout
Peter Seiderer Sept. 22, 2020, 9:20 p.m. UTC | #4
Hello Arnout,

On Mon, 21 Sep 2020 23:22:24 +0200, Arnout Vandecappelle <arnout@mind.be> wrote:

>  Hi Peter,
>
> On 21/09/2020 22:04, Peter Seiderer wrote:
> > Hello Thomas,
> >
> > On Mon, 21 Sep 2020 10:20:13 +0200, Thomas Petazzoni <thomas.petazzoni@bootlin.com> wrote:
> >
> >> Hello,
> >>
> >> On Sun, 20 Sep 2020 17:06:58 +0200
> >> Peter Seiderer <ps.report@gmx.net> wrote:
> >>
> >>> Running (as e.g. /etc/init.d/S50postgresql does):
> >>>
> >>>   su - postgres -c '/usr/bin/pg_ctl initdb -D /var/lib/pgsql'
> >>>
> >>> gives the following warning:
> >>>
> >>>   performing post-bootstrap initialization ... sh: locale: not found
> >>>   1970-01-01 01:13:43.498 UTC [246] WARNING:  no usable system locales were found
> >>>   ok
> >>
> >> What is the situation with uClibc and musl toolchains ? Do they provide
> >> the "locale" command as well ?
> >
> > - uclibc without BR2_TOOLCHAIN_BUILDROOT_LOCALE: no warning, no locale command ([1])
> > - uclicc with BR2_TOOLCHAIN_BUILDROOT_LOCALE: no warning, locale command installed on target
> > - musl: 'locale: not found' warning, no locale commmand
> >
> > But it is 'only' a warning... and easy to fix for gcc/buildroot toolchain...
> >
> >>
> >> What about external glibc toolchains ? Do we install/copy the locale
> >> tool to the target ?
>
>  I checked - no, we don't install it, even if it is part of the toolchain sysroot.
>
> > Do not know...., but it is only a warning...
>
>  It is only a warning, but this patch is meant to get rid of that warning, no?
> If this series only fixes that warning for the internal toolchain, I don't think
> it's very useful.

Get rid of the warning for one use case (where it is easy to fix) ;-)

>
>  But probably toolchain-external-pkg.mk should be fixed to install locale if
> available, just like we do for ldd. And maybe also ldconfig and getconf (the
> other two glibc utils we install) should be handled in the same way?

Will take a look...

>
>
> > Regards,
> > Peter
> >
> > [1] The usage of the locale command depends on 'HAVE_LOCALE_T' which depends
> > on the availability of the locale_t type (see postgresql-12.4/config/c-library.m4
> > and postgresql-12.4/src/backend/commands/collationcmds.c)
>
>  We could instead prepopulate the cache variable pgac_cv_type_locale_t with the
> presence of the locale binary in the target directory. Something like:
>
> POSTGRESQL_CONF_ENV += pgac_cv_type_locale_t=$(if $(wildcard
> $(TARGET_DIR)/usr/bin/locale),yes,no)
>
>  This is assuming that the presence of the locale executable corresponds with
> the availability of locales (which is apparently not the case for musl, but I
> think that that should be considered a bug in our musl integration). But at
> least for glibc and uClibc it seems to be correct.

I believe false assumption, locale_t type availability (and the availability of
different locale definitions) does not automatically mean the locale command will
be available (see glibc case without  BR2_PACKAGE_GLIBC_UTILS, and without
BR2_SYSTEM_ENABLE_NLS before patch 1)...

>
>  This solution also removes the need for patch 1/3, which I thought was a bit
> iffy anyway.

See above and any reasons why the locale command should be bound to NSL support?

Regards,
Peter

>
>  Regards,
>  Arnout
diff mbox series

Patch

diff --git a/package/postgresql/Config.in b/package/postgresql/Config.in
index 2f677daf5b..b15d34d3f0 100644
--- a/package/postgresql/Config.in
+++ b/package/postgresql/Config.in
@@ -6,6 +6,7 @@  config BR2_PACKAGE_POSTGRESQL
 	# postgresql is unlikely to be used in a pure statically
 	# linked environment.
 	depends on !BR2_STATIC_LIBS
+	select BR2_PACKAGE_GLIBC_UTILS if BR2_PACKAGE_GLIBC # locale cmd
 	help
 	  PostgreSQL is a powerful, open source object-relational
 	  database system.