Compile failure on nl_langinfo

Started by Euler Taveira de Oliveiraover 21 years ago7 messages
#1Euler Taveira de Oliveira
euler@ufgnet.ufg.br
1 attachment(s)

Hi,

I am seeing the following compile failure in currrent CVS.

gmake[4]: Leaving directory `/dados/pgsql/cvs/pgsql/src/port'
gcc -O2 -fno-strict-aliasing -g -Wall -Wmissing-prototypes -Wmissing-declarations -DFRONTEND -I../../../src/interfaces/libpq -I../../../src/include -I/usr/local/include -I/usr/local/include/tcl8.4 -c -o initdb.o initdb.c -MMD
initdb.c: In function `get_encoding_from_locale':
initdb.c:758: `CODESET' undeclared (first use in this function)
initdb.c:758: (Each undeclared identifier is reported only once
initdb.c:758: for each function it appears in.)
gmake[3]: *** [initdb.o] Error 1
gmake[3]: Leaving directory `/dados/pgsql/cvs/pgsql/src/bin/initdb'
gmake[2]: *** [all] Error 2
gmake[2]: Leaving directory `/dados/pgsql/cvs/pgsql/src/bin'
gmake[1]: *** [all] Error 2
gmake[1]: Leaving directory `/dados/pgsql/cvs/pgsql/src'
gmake: *** [all] Error 2
$

I am using an OpenBSD 3.5. OpenBSD doesn't have 'CODESET' symbol.
How can we fix it?

1) just define it on configure.in when we don't have it. Like this:
dnl Check for nl_langinfo and CODESET
AC_MSG_CHECKING([for nl_langinfo (CODESET)])
AC_TRY_LINK([#include <langinfo.h>],
[char *codeset = nl_langinfo (CODESET);],
[AC_MSG_RESULT(yes)],
[AC_MSG_RESULT(no)
AC_DEFINE(CODESET, 0, [Define to 0 if you don't have CODESET.])
])

2) define a 'HAVE_CODESET' symbol and just ifdef in initdb.c

3) another?

Personally I prefer the first one. The completed patch is attached. It requires to run 'autoheader' and 'autoconf'. CODESET 0 is ASCII.
So in those plataforms that do not have 'CODESET' we'll always go with locale C.

Comments?

--
Euler Taveira de Oliveira
euler (at) ufgnet.ufg.br
Desenvolvedor Web e Administrador de Sistemas
UFGNet - Universidade Federal de Goiás

Attachments:

foo.diffapplication/octet-stream; name=foo.diffDownload
*** configure.in.orig	Mon Jul 26 12:05:57 2004
--- configure.in	Mon Jul 26 13:39:14 2004
***************
*** 922,927 ****
--- 922,935 ----
    AC_CHECK_FUNCS([replace_history_entry])
  fi
  
+ dnl Check for nl_langinfo and CODESET
+ AC_MSG_CHECKING([for nl_langinfo(CODESET)])
+ AC_TRY_LINK([#include <langinfo.h>],
+             [char *codeset = nl_langinfo (CODESET);],
+             [AC_MSG_RESULT(yes)],
+             [AC_MSG_RESULT(no)
+ 	    AC_DEFINE(CODESET, 0, [Define to 0 if you don't have CODESET.])
+             ])
  
  dnl Cannot use AC_CHECK_FUNC because finite may be a macro
  AC_MSG_CHECKING(for finite)
#2Peter Eisentraut
peter_e@gmx.net
In reply to: Euler Taveira de Oliveira (#1)
Re: Compile failure on nl_langinfo

Euler Taveira de Oliveira wrote:

I am using an OpenBSD 3.5. OpenBSD doesn't have 'CODESET' symbol.
How can we fix it?

Put #ifdef CODESET around the offending code.

--
Peter Eisentraut
http://developer.postgresql.org/~petere/

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Euler Taveira de Oliveira (#1)
Re: Compile failure on nl_langinfo

Euler Taveira de Oliveira <euler@ufgnet.ufg.br> writes:

I am using an OpenBSD 3.5. OpenBSD doesn't have 'CODESET' symbol.
How can we fix it?

1) just define it on configure.in when we don't have it. Like this:

You've got to be kidding. That will cause get_encoding_from_locale to
return some random bit of information (whatever is mapped to zero),
with who-knows-what result.

A configure-time probe seems unnecessary anyway, since we can just do
"#ifdef CODESET" in initdb.c. The real question is what we should do
if it isn't defined. We can certainly make get_encoding_from_locale
return NULL, but it looks like initdb will behave moderately
unpleasantly if we do that (ie, force you to specify -E in most cases).
Is there any reasonable fallback behavior?

regards, tom lane

#4Euler Taveira de Oliveira
euler@ufgnet.ufg.br
In reply to: Peter Eisentraut (#2)
1 attachment(s)
Re: Compile failure on nl_langinfo

Hi Peter,

I am using an OpenBSD 3.5. OpenBSD doesn't have 'CODESET' symbol.
How can we fix it?

Put #ifdef CODESET around the offending code.

OK. Another try.

--
Euler Taveira de Oliveira
euler (at) ufgnet.ufg.br
Desenvolvedor Web e Administrador de Sistemas
UFGNet - Universidade Federal de Goiás

Attachments:

initdb.diffapplication/octet-stream; name=initdb.diffDownload
*** ./src/bin/initdb/initdb.c.orig	Sat Jul 31 12:12:55 2004
--- ./src/bin/initdb/initdb.c	Sat Jul 31 12:31:00 2004
***************
*** 755,761 ****
--- 755,765 ----
  	save = xstrdup(save);
  
  	setlocale(LC_CTYPE, ctype);
+ #ifdef CODESET
  	sys = nl_langinfo(CODESET);
+ #else
+ 	sys = nl_langinfo(NULL);
+ #endif
  	sys = xstrdup(sys);
  
  	setlocale(LC_CTYPE, save);
#5Andrew Dunstan
andrew@dunslane.net
In reply to: Tom Lane (#3)
Re: Compile failure on nl_langinfo

Tom Lane wrote:

Euler Taveira de Oliveira <euler@ufgnet.ufg.br> writes:

I am using an OpenBSD 3.5. OpenBSD doesn't have 'CODESET' symbol.
How can we fix it?

1) just define it on configure.in when we don't have it. Like this:

You've got to be kidding. That will cause get_encoding_from_locale to
return some random bit of information (whatever is mapped to zero),
with who-knows-what result.

A configure-time probe seems unnecessary anyway, since we can just do
"#ifdef CODESET" in initdb.c. The real question is what we should do
if it isn't defined. We can certainly make get_encoding_from_locale
return NULL, but it looks like initdb will behave moderately
unpleasantly if we do that (ie, force you to specify -E in most cases).
Is there any reasonable fallback behavior?

A quick Google shows Mozilla falling back to ISO-8859-1

cheers

andrew

#6Peter Eisentraut
peter_e@gmx.net
In reply to: Euler Taveira de Oliveira (#4)
Re: Compile failure on nl_langinfo

Euler Taveira de Oliveira wrote:

I am using an OpenBSD 3.5. OpenBSD doesn't have 'CODESET' symbol.
How can we fix it?

Put #ifdef CODESET around the offending code.

OK. Another try.

What does

nl_langinfo(NULL)

return? Probably not a valid codepage.

--
Peter Eisentraut
http://developer.postgresql.org/~petere/

#7Euler Taveira de Oliveira
euler@ufgnet.ufg.br
In reply to: Peter Eisentraut (#6)
Re: Compile failure on nl_langinfo

Hi Peter,

I am using an OpenBSD 3.5. OpenBSD doesn't have 'CODESET' symbol.
How can we fix it?

Put #ifdef CODESET around the offending code.

OK. Another try.

What does

nl_langinfo(NULL)

return? Probably not a valid codepage.

No. Just "". See
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/locale/nl_langinfo.c?rev=1.3&amp;content-type=text/x-cvsweb-markup

Isn't it acceptable? I just got locale C at initdb. But I saw this we I try to set an specific locale:

$ initdb --locale=pt_BR
initdb: invalid locale name "pt_BR"
initdb: invalid locale name "pt_BR"
initdb: invalid locale name "pt_BR"
initdb: invalid locale name "pt_BR"
initdb: invalid locale name "pt_BR"
initdb: invalid locale name "pt_BR"
The files belonging to this database system will be owned by user "euler".
This user must also own the server process.

The database cluster will be initialized with locale C.
....

The chklocale() seems to fail. I don't set neither LC_* nor LANG.

--
Euler Taveira de Oliveira
euler (at) ufgnet.ufg.br
Desenvolvedor Web e Administrador de Sistemas
UFGNet - Universidade Federal de Goiás