diff mbox

configure: Define NCURSES_WIDECHAR if we're using curses

Message ID 1496414138-7622-1-git-send-email-peter.maydell@linaro.org
State Accepted
Commit b01a4fd3bd7d6f2ebd9eeba9cb6502d423c3bc85
Headers show

Commit Message

Peter Maydell June 2, 2017, 2:35 p.m. UTC
We want the wide character functions from the ncurses header.
Unfortunately it doesn't provide them by default, but only
if either:
 * NCURSES_WIDECHAR is defined (for ncurses 20111030 and up)
 * _XOPEN_SOURCE/_XOPEN_SOURCE_EXTENDED are suitably defined

So far we have been implicitly relying on the latter, because
for GNU libc when we define _GNU_SOURCE this causes libc
to define the _XOPEN_SOURCE macros for us. Unfortunately
this doesn't work on all libcs, because some (like OSX and
musl libc) do not define _XOPEN_SOURCE when _GNU_SOURCE
is defined.

We can't fix this by defining _XOPEN_SOURCE ourselves, because
that also means "and don't provide any functions that aren't in
that standard", and not all libcs provide any way to override
that to also get the non-standard functions. In particular
FreeBSD has no such mechanism, and OSX's _DARWIN_C_SOURCE
doesn't reenable everything (for instance getpagesize()
is still not prototyped if _DARWIN_C_SOURCE and _XOPEN_SOURCE
are both defined).

So we have to define NCURSES_WIDECHAR. (This will only work
if your ncurses is at least 20111030, as older versions
don't honour this macro.)

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

---
Testing from the people with musl libc and OSX-with-ncurses
appreciated, as I don't have any systems which have the bug
which this patch is attempting to fix...

 configure | 2 ++
 1 file changed, 2 insertions(+)

-- 
2.7.4

Comments

Laszlo Ersek June 2, 2017, 9:58 p.m. UTC | #1
On 06/02/17 16:35, Peter Maydell wrote:
> We want the wide character functions from the ncurses header.

> Unfortunately it doesn't provide them by default, but only

> if either:

>  * NCURSES_WIDECHAR is defined (for ncurses 20111030 and up)

>  * _XOPEN_SOURCE/_XOPEN_SOURCE_EXTENDED are suitably defined

> 

> So far we have been implicitly relying on the latter, because

> for GNU libc when we define _GNU_SOURCE this causes libc

> to define the _XOPEN_SOURCE macros for us. Unfortunately

> this doesn't work on all libcs, because some (like OSX and

> musl libc) do not define _XOPEN_SOURCE when _GNU_SOURCE

> is defined.

> 

> We can't fix this by defining _XOPEN_SOURCE ourselves, because

> that also means "and don't provide any functions that aren't in

> that standard", and not all libcs provide any way to override

> that to also get the non-standard functions. In particular

> FreeBSD has no such mechanism, and OSX's _DARWIN_C_SOURCE

> doesn't reenable everything (for instance getpagesize()

> is still not prototyped if _DARWIN_C_SOURCE and _XOPEN_SOURCE

> are both defined).

> 

> So we have to define NCURSES_WIDECHAR. (This will only work

> if your ncurses is at least 20111030, as older versions

> don't honour this macro.)

> 

> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

> ---

> Testing from the people with musl libc and OSX-with-ncurses

> appreciated, as I don't have any systems which have the bug

> which this patch is attempting to fix...

> 

>  configure | 2 ++

>  1 file changed, 2 insertions(+)

> 

> diff --git a/configure b/configure

> index 0586ec9..6aca5d1 100755

> --- a/configure

> +++ b/configure

> @@ -3053,6 +3053,8 @@ int main(void) {

>  EOF

>    IFS=:

>    for curses_inc in $curses_inc_list; do

> +    # Make sure we get the wide character prototypes

> +    curses_inc="-DNCURSES_WIDECHAR $curses_inc"

>      IFS=:

>      for curses_lib in $curses_lib_list; do

>        unset IFS

> 


Given that we're already consciously using non-portable functions, this
solution looks the least messy to me.

Acked-by: Laszlo Ersek <lersek@redhat.com>


Thanks
Laszlo
Kamil Rytarowski June 3, 2017, 9:43 a.m. UTC | #2
On 02.06.2017 23:58, Laszlo Ersek wrote:
> On 06/02/17 16:35, Peter Maydell wrote:

>> We want the wide character functions from the ncurses header.

>> Unfortunately it doesn't provide them by default, but only

>> if either:

>>  * NCURSES_WIDECHAR is defined (for ncurses 20111030 and up)

>>  * _XOPEN_SOURCE/_XOPEN_SOURCE_EXTENDED are suitably defined

>>

>> So far we have been implicitly relying on the latter, because

>> for GNU libc when we define _GNU_SOURCE this causes libc

>> to define the _XOPEN_SOURCE macros for us. Unfortunately

>> this doesn't work on all libcs, because some (like OSX and

>> musl libc) do not define _XOPEN_SOURCE when _GNU_SOURCE

>> is defined.

>>

>> We can't fix this by defining _XOPEN_SOURCE ourselves, because

>> that also means "and don't provide any functions that aren't in

>> that standard", and not all libcs provide any way to override

>> that to also get the non-standard functions. In particular

>> FreeBSD has no such mechanism, and OSX's _DARWIN_C_SOURCE

>> doesn't reenable everything (for instance getpagesize()

>> is still not prototyped if _DARWIN_C_SOURCE and _XOPEN_SOURCE

>> are both defined).

>>

>> So we have to define NCURSES_WIDECHAR. (This will only work

>> if your ncurses is at least 20111030, as older versions

>> don't honour this macro.)

>>

>> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

>> ---

>> Testing from the people with musl libc and OSX-with-ncurses

>> appreciated, as I don't have any systems which have the bug

>> which this patch is attempting to fix...

>>

>>  configure | 2 ++

>>  1 file changed, 2 insertions(+)

>>

>> diff --git a/configure b/configure

>> index 0586ec9..6aca5d1 100755

>> --- a/configure

>> +++ b/configure

>> @@ -3053,6 +3053,8 @@ int main(void) {

>>  EOF

>>    IFS=:

>>    for curses_inc in $curses_inc_list; do

>> +    # Make sure we get the wide character prototypes

>> +    curses_inc="-DNCURSES_WIDECHAR $curses_inc"

>>      IFS=:

>>      for curses_lib in $curses_lib_list; do

>>        unset IFS

>>

> 

> Given that we're already consciously using non-portable functions, this

> solution looks the least messy to me.

> 


These functions are enough portable to work on NetBSD curses(3).

pkgsrc had an equivalent patch to define NCURSES_WIDECHAR=1 to fix build
on Darwin.

> Acked-by: Laszlo Ersek <lersek@redhat.com>

> 

> Thanks

> Laszlo

>
Rainer Müller June 3, 2017, 10:13 a.m. UTC | #3
On 2017-06-02 16:35, Peter Maydell wrote:
> diff --git a/configure b/configure

> index 0586ec9..6aca5d1 100755

> --- a/configure

> +++ b/configure

> @@ -3053,6 +3053,8 @@ int main(void) {

>  EOF

>    IFS=:

>    for curses_inc in $curses_inc_list; do

> +    # Make sure we get the wide character prototypes

> +    curses_inc="-DNCURSES_WIDECHAR $curses_inc"

>      IFS=:

>      for curses_lib in $curses_lib_list; do

>        unset IFS

> 


Thank you for getting back to this. I can confirm that this patch fixes
--enable-curses for me on Mac OS X.

Although this already works as is, I would use -DNCURSES_WIDECHAR=1 as
ncurses.h uses #if and not #ifdef to check for this.

Rainer
Kamil Rytarowski June 3, 2017, 10:17 a.m. UTC | #4
On 03.06.2017 12:13, Rainer Müller wrote:
> On 2017-06-02 16:35, Peter Maydell wrote:

>> diff --git a/configure b/configure

>> index 0586ec9..6aca5d1 100755

>> --- a/configure

>> +++ b/configure

>> @@ -3053,6 +3053,8 @@ int main(void) {

>>  EOF

>>    IFS=:

>>    for curses_inc in $curses_inc_list; do

>> +    # Make sure we get the wide character prototypes

>> +    curses_inc="-DNCURSES_WIDECHAR $curses_inc"

>>      IFS=:

>>      for curses_lib in $curses_lib_list; do

>>        unset IFS

>>

> 

> Thank you for getting back to this. I can confirm that this patch fixes

> --enable-curses for me on Mac OS X.

> 

> Although this already works as is, I would use -DNCURSES_WIDECHAR=1 as

> ncurses.h uses #if and not #ifdef to check for this.

> 


-DNCURSES_WIDECHAR evaluates to 1 for #if

> Rainer

>
Laszlo Ersek June 3, 2017, 4:08 p.m. UTC | #5
On 06/03/17 11:43, Kamil Rytarowski wrote:
> On 02.06.2017 23:58, Laszlo Ersek wrote:

>> On 06/02/17 16:35, Peter Maydell wrote:

>>> We want the wide character functions from the ncurses header.

>>> Unfortunately it doesn't provide them by default, but only

>>> if either:

>>>  * NCURSES_WIDECHAR is defined (for ncurses 20111030 and up)

>>>  * _XOPEN_SOURCE/_XOPEN_SOURCE_EXTENDED are suitably defined

>>>

>>> So far we have been implicitly relying on the latter, because

>>> for GNU libc when we define _GNU_SOURCE this causes libc

>>> to define the _XOPEN_SOURCE macros for us. Unfortunately

>>> this doesn't work on all libcs, because some (like OSX and

>>> musl libc) do not define _XOPEN_SOURCE when _GNU_SOURCE

>>> is defined.

>>>

>>> We can't fix this by defining _XOPEN_SOURCE ourselves, because

>>> that also means "and don't provide any functions that aren't in

>>> that standard", and not all libcs provide any way to override

>>> that to also get the non-standard functions. In particular

>>> FreeBSD has no such mechanism, and OSX's _DARWIN_C_SOURCE

>>> doesn't reenable everything (for instance getpagesize()

>>> is still not prototyped if _DARWIN_C_SOURCE and _XOPEN_SOURCE

>>> are both defined).

>>>

>>> So we have to define NCURSES_WIDECHAR. (This will only work

>>> if your ncurses is at least 20111030, as older versions

>>> don't honour this macro.)

>>>

>>> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

>>> ---

>>> Testing from the people with musl libc and OSX-with-ncurses

>>> appreciated, as I don't have any systems which have the bug

>>> which this patch is attempting to fix...

>>>

>>>  configure | 2 ++

>>>  1 file changed, 2 insertions(+)

>>>

>>> diff --git a/configure b/configure

>>> index 0586ec9..6aca5d1 100755

>>> --- a/configure

>>> +++ b/configure

>>> @@ -3053,6 +3053,8 @@ int main(void) {

>>>  EOF

>>>    IFS=:

>>>    for curses_inc in $curses_inc_list; do

>>> +    # Make sure we get the wide character prototypes

>>> +    curses_inc="-DNCURSES_WIDECHAR $curses_inc"

>>>      IFS=:

>>>      for curses_lib in $curses_lib_list; do

>>>        unset IFS

>>>

>>

>> Given that we're already consciously using non-portable functions,

>> this solution looks the least messy to me.

>>

>

> These functions are enough portable to work on NetBSD curses(3).


Sorry, that's not what I meant by "non-portable functions".

Peter wrote,

>>> We can't fix this by defining _XOPEN_SOURCE ourselves, because

>>> that also means "and don't provide any functions that aren't in

>>> that standard", and not all libcs provide any way to override

>>> that to also get the non-standard functions.


So basically, if we only used standard (SUSv2, SUSv3 or SUSv4, i.e.
_XOPEN_SOURCE=500, =600 or =700) functions, then the wide char curses
functions could also be declared just through _XOPEN_SOURCE:

  http://pubs.opengroup.org/onlinepubs/007908799/xcurses/implement.html

(

Note that X/Open Curses, Issue 4 Version 2, does provide the wide char
stuff; see for example the add_wch() function at
<http://pubs.opengroup.org/onlinepubs/007908799/xcurses/add_wch.html>,
and my "/usr/include/curses.h" has:

  #ifndef NCURSES_WIDECHAR
  #if defined(_XOPEN_SOURCE_EXTENDED) || (defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE - 0 >= 500))
  #define NCURSES_WIDECHAR 1
  #else
  #define NCURSES_WIDECHAR 0
  #endif
  #endif /* NCURSES_WIDECHAR */
  ...
  #if NCURSES_WIDECHAR
  ...
  extern NCURSES_EXPORT(int) add_wch (const cchar_t *);                   /* generated:WIDEC */

)

Since we can't use _XOPEN_SOURCE (because of our reliance on non-std
functions), we have to go with "whatever works" (basically abandoning
any benefit that the SUS / POSIX standardization brings), and then
NCURSES_WIDECHAR looks simple enough.

Thanks
Laszlo
Peter Maydell June 26, 2017, 1:31 p.m. UTC | #6
On 2 June 2017 at 15:35, Peter Maydell <peter.maydell@linaro.org> wrote:
> We want the wide character functions from the ncurses header.

> Unfortunately it doesn't provide them by default, but only

> if either:

>  * NCURSES_WIDECHAR is defined (for ncurses 20111030 and up)

>  * _XOPEN_SOURCE/_XOPEN_SOURCE_EXTENDED are suitably defined

>

> So far we have been implicitly relying on the latter, because

> for GNU libc when we define _GNU_SOURCE this causes libc

> to define the _XOPEN_SOURCE macros for us. Unfortunately

> this doesn't work on all libcs, because some (like OSX and

> musl libc) do not define _XOPEN_SOURCE when _GNU_SOURCE

> is defined.

>

> We can't fix this by defining _XOPEN_SOURCE ourselves, because

> that also means "and don't provide any functions that aren't in

> that standard", and not all libcs provide any way to override

> that to also get the non-standard functions. In particular

> FreeBSD has no such mechanism, and OSX's _DARWIN_C_SOURCE

> doesn't reenable everything (for instance getpagesize()

> is still not prototyped if _DARWIN_C_SOURCE and _XOPEN_SOURCE

> are both defined).

>

> So we have to define NCURSES_WIDECHAR. (This will only work

> if your ncurses is at least 20111030, as older versions

> don't honour this macro.)

>

> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>


Applied, thanks.

-- PMM
Stefan Weil June 6, 2021, 6:13 p.m. UTC | #7
Am 02.06.17 um 16:35 schrieb Peter Maydell:

> We want the wide character functions from the ncurses header.

> Unfortunately it doesn't provide them by default, but only

> if either:

>   * NCURSES_WIDECHAR is defined (for ncurses 20111030 and up)

>   * _XOPEN_SOURCE/_XOPEN_SOURCE_EXTENDED are suitably defined

>

> So far we have been implicitly relying on the latter, because

> for GNU libc when we define _GNU_SOURCE this causes libc

> to define the _XOPEN_SOURCE macros for us. Unfortunately

> this doesn't work on all libcs, because some (like OSX and

> musl libc) do not define _XOPEN_SOURCE when _GNU_SOURCE

> is defined.

>

> We can't fix this by defining _XOPEN_SOURCE ourselves, because

> that also means "and don't provide any functions that aren't in

> that standard", and not all libcs provide any way to override

> that to also get the non-standard functions. In particular

> FreeBSD has no such mechanism, and OSX's _DARWIN_C_SOURCE

> doesn't reenable everything (for instance getpagesize()

> is still not prototyped if _DARWIN_C_SOURCE and _XOPEN_SOURCE

> are both defined).

>

> So we have to define NCURSES_WIDECHAR. (This will only work

> if your ncurses is at least 20111030, as older versions

> don't honour this macro.)



I answer to this very old e-mail because I noticed today that defining 
NCURSES_WIDECHAR does not work with the latest MacOS on M1:

Apple still delivers a curses.h which indicates NCURSES_VERSION "5.7" 
(20081102). It does not know NCURSES_WIDECHAR, but support for curses 
can be enabled with _XOPEN_SOURCE_EXTENDED=1.

I used this patch for git master:

diff --git a/meson.build b/meson.build
index 626cf932c1..513332a76d 100644
--- a/meson.build
+++ b/meson.build
@@ -606,7 +606,7 @@ if have_system and not get_option('curses').disabled()
      endif
    endforeach
    msg = get_option('curses').enabled() ? 'curses library not found' : ''
-  curses_compile_args = ['-DNCURSES_WIDECHAR']
+  curses_compile_args = ['-DNCURSES_WIDECHAR', 
'-D_XOPEN_SOURCE_EXTENDED=1']
    if curses.found()
      if cc.links(curses_test, args: curses_compile_args, dependencies: 
[curses])
        curses = declare_dependency(compile_args: curses_compile_args, 
dependencies: [curses])


Then curses is detected and works when configure is given the right 
PKG_CONFIG_PATH:

PKG_CONFIG_PATH=/opt/homebrew/Library/Homebrew/os/mac/pkgconfig/11 
./configure

Regards

Stefan
Laszlo Ersek June 7, 2021, 12:57 p.m. UTC | #8
On 06/06/21 20:13, Stefan Weil wrote:
> Am 02.06.17 um 16:35 schrieb Peter Maydell:

> 

>> We want the wide character functions from the ncurses header.

>> Unfortunately it doesn't provide them by default, but only

>> if either:

>>   * NCURSES_WIDECHAR is defined (for ncurses 20111030 and up)

>>   * _XOPEN_SOURCE/_XOPEN_SOURCE_EXTENDED are suitably defined

>>

>> So far we have been implicitly relying on the latter, because

>> for GNU libc when we define _GNU_SOURCE this causes libc

>> to define the _XOPEN_SOURCE macros for us. Unfortunately

>> this doesn't work on all libcs, because some (like OSX and

>> musl libc) do not define _XOPEN_SOURCE when _GNU_SOURCE

>> is defined.

>>

>> We can't fix this by defining _XOPEN_SOURCE ourselves, because

>> that also means "and don't provide any functions that aren't in

>> that standard", and not all libcs provide any way to override

>> that to also get the non-standard functions. In particular

>> FreeBSD has no such mechanism, and OSX's _DARWIN_C_SOURCE

>> doesn't reenable everything (for instance getpagesize()

>> is still not prototyped if _DARWIN_C_SOURCE and _XOPEN_SOURCE

>> are both defined).

>>

>> So we have to define NCURSES_WIDECHAR. (This will only work

>> if your ncurses is at least 20111030, as older versions

>> don't honour this macro.)

> 

> 

> I answer to this very old e-mail because I noticed today that defining

> NCURSES_WIDECHAR does not work with the latest MacOS on M1:

> 

> Apple still delivers a curses.h which indicates NCURSES_VERSION "5.7"

> (20081102). It does not know NCURSES_WIDECHAR, but support for curses

> can be enabled with _XOPEN_SOURCE_EXTENDED=1.

> 

> I used this patch for git master:

> 

> diff --git a/meson.build b/meson.build

> index 626cf932c1..513332a76d 100644

> --- a/meson.build

> +++ b/meson.build

> @@ -606,7 +606,7 @@ if have_system and not get_option('curses').disabled()

>      endif

>    endforeach

>    msg = get_option('curses').enabled() ? 'curses library not found' : ''

> -  curses_compile_args = ['-DNCURSES_WIDECHAR']

> +  curses_compile_args = ['-DNCURSES_WIDECHAR',

> '-D_XOPEN_SOURCE_EXTENDED=1']

>    if curses.found()

>      if cc.links(curses_test, args: curses_compile_args, dependencies:

> [curses])

>        curses = declare_dependency(compile_args: curses_compile_args,

> dependencies: [curses])

> 

> 

> Then curses is detected and works when configure is given the right

> PKG_CONFIG_PATH:

> 

> PKG_CONFIG_PATH=/opt/homebrew/Library/Homebrew/os/mac/pkgconfig/11

> ./configure


_XOPEN_SOURCE_EXTENDED is only supposed to make a difference in SUSv2.
If MacOS needs it, whatever, but I don't view it as a good idea for any
other host OS.

Just my two cents, since I've been CC'd.

Laszlo
Daniel P. Berrangé June 7, 2021, 1:05 p.m. UTC | #9
On Mon, Jun 07, 2021 at 02:57:41PM +0200, Laszlo Ersek wrote:
> On 06/06/21 20:13, Stefan Weil wrote:

> > Am 02.06.17 um 16:35 schrieb Peter Maydell:

> > 

> >> We want the wide character functions from the ncurses header.

> >> Unfortunately it doesn't provide them by default, but only

> >> if either:

> >>   * NCURSES_WIDECHAR is defined (for ncurses 20111030 and up)

> >>   * _XOPEN_SOURCE/_XOPEN_SOURCE_EXTENDED are suitably defined

> >>

> >> So far we have been implicitly relying on the latter, because

> >> for GNU libc when we define _GNU_SOURCE this causes libc

> >> to define the _XOPEN_SOURCE macros for us. Unfortunately

> >> this doesn't work on all libcs, because some (like OSX and

> >> musl libc) do not define _XOPEN_SOURCE when _GNU_SOURCE

> >> is defined.

> >>

> >> We can't fix this by defining _XOPEN_SOURCE ourselves, because

> >> that also means "and don't provide any functions that aren't in

> >> that standard", and not all libcs provide any way to override

> >> that to also get the non-standard functions. In particular

> >> FreeBSD has no such mechanism, and OSX's _DARWIN_C_SOURCE

> >> doesn't reenable everything (for instance getpagesize()

> >> is still not prototyped if _DARWIN_C_SOURCE and _XOPEN_SOURCE

> >> are both defined).

> >>

> >> So we have to define NCURSES_WIDECHAR. (This will only work

> >> if your ncurses is at least 20111030, as older versions

> >> don't honour this macro.)

> > 

> > 

> > I answer to this very old e-mail because I noticed today that defining

> > NCURSES_WIDECHAR does not work with the latest MacOS on M1:

> > 

> > Apple still delivers a curses.h which indicates NCURSES_VERSION "5.7"

> > (20081102). It does not know NCURSES_WIDECHAR, but support for curses

> > can be enabled with _XOPEN_SOURCE_EXTENDED=1.

> > 

> > I used this patch for git master:

> > 

> > diff --git a/meson.build b/meson.build

> > index 626cf932c1..513332a76d 100644

> > --- a/meson.build

> > +++ b/meson.build

> > @@ -606,7 +606,7 @@ if have_system and not get_option('curses').disabled()

> >      endif

> >    endforeach

> >    msg = get_option('curses').enabled() ? 'curses library not found' : ''

> > -  curses_compile_args = ['-DNCURSES_WIDECHAR']

> > +  curses_compile_args = ['-DNCURSES_WIDECHAR',

> > '-D_XOPEN_SOURCE_EXTENDED=1']

> >    if curses.found()

> >      if cc.links(curses_test, args: curses_compile_args, dependencies:

> > [curses])

> >        curses = declare_dependency(compile_args: curses_compile_args,

> > dependencies: [curses])

> > 

> > 

> > Then curses is detected and works when configure is given the right

> > PKG_CONFIG_PATH:

> > 

> > PKG_CONFIG_PATH=/opt/homebrew/Library/Homebrew/os/mac/pkgconfig/11

> > ./configure

> 

> _XOPEN_SOURCE_EXTENDED is only supposed to make a difference in SUSv2.

> If MacOS needs it, whatever, but I don't view it as a good idea for any

> other host OS.


Easy to do with

  if host_machine.system() == 'darwin'
    curses_compile_args = [ '-D_XOPEN_SOURCE_EXTENDED=1']
  else
    curses_compile_args = ['-DNCURSES_WIDECHAR']
  endif

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|
diff mbox

Patch

diff --git a/configure b/configure
index 0586ec9..6aca5d1 100755
--- a/configure
+++ b/configure
@@ -3053,6 +3053,8 @@  int main(void) {
 EOF
   IFS=:
   for curses_inc in $curses_inc_list; do
+    # Make sure we get the wide character prototypes
+    curses_inc="-DNCURSES_WIDECHAR $curses_inc"
     IFS=:
     for curses_lib in $curses_lib_list; do
       unset IFS