qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] meson: rewrite curses/iconv test
@ 2020-10-19  9:45 Paolo Bonzini
  2020-10-19 19:58 ` 罗勇刚(Yonggang Luo)
  0 siblings, 1 reply; 3+ messages in thread
From: Paolo Bonzini @ 2020-10-19  9:45 UTC (permalink / raw)
  To: qemu-devel; +Cc: luoyonggang, kraxel

Redo the curses test to do the same tests that the configure
check used to do.  OpenBSD triggers the warning because
it does not support NCURSES_WIDECHAR and thus the cc.links
test fails.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 meson.build | 109 +++++++++++++++++++++++++++++-----------------------
 1 file changed, 60 insertions(+), 49 deletions(-)

diff --git a/meson.build b/meson.build
index 05fb59a00b..d1155aea65 100644
--- a/meson.build
+++ b/meson.build
@@ -463,6 +463,59 @@ endif
 iconv = not_found
 curses = not_found
 if have_system and not get_option('curses').disabled()
+  curses_test = '''
+    #include <locale.h>
+    #include <curses.h>
+    #include <wchar.h>
+    int main(void) {
+      wchar_t wch = L'w';
+      setlocale(LC_ALL, "");
+      resize_term(0, 0);
+      addwstr(L"wide chars\n");
+      addnwstr(&wch, 1);
+      add_wch(WACS_DEGREE);
+      return 0;
+    }'''
+
+  curses = dependency((targetos == 'windows' ? 'ncurses' : 'ncursesw'),
+                      required: false,
+                      method: 'pkg-config',
+                      static: enable_static)
+  msg = get_option('curses').enabled() ? 'curses library not found' : ''
+  if curses.found()
+    if cc.links(curses_test, dependencies: [curses])
+      curses = declare_dependency(compile_args: '-DNCURSES_WIDECHAR', dependencies: [curses])
+    else
+      msg = 'curses package not usable'
+      curses = not_found
+    endif
+  endif
+  if not curses.found()
+    curses_compile_args = ['-DNCURSES_WIDECHAR']
+    has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
+    if targetos != 'windows' and not has_curses_h
+      message('Trying with /usr/include/ncursesw')
+      curses_compile_args += ['-I/usr/include/ncursesw']
+      has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
+    endif
+    if has_curses_h
+      curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
+      foreach curses_libname : curses_libname_list
+        libcurses = cc.find_library(curses_libname,
+                                    required: false,
+                                    static: enable_static)
+        if libcurses.found()
+          if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
+            curses = declare_dependency(compile_args: curses_compile_args,
+                                        dependencies: [libcurses])
+            break
+          else
+            msg = 'curses library not usable'
+          endif
+        endif
+      endforeach
+    endif
+  endif
   if not get_option('iconv').disabled()
     libiconv = cc.find_library('iconv',
                                required: false,
@@ -476,57 +529,15 @@ if have_system and not get_option('curses').disabled()
       iconv = declare_dependency(dependencies: [libiconv])
     endif
   endif
-  if get_option('iconv').enabled() and not iconv.found()
-    error('Cannot detect iconv API')
+  if curses.found() and not iconv.found()
+    msg = 'iconv required for curses UI but not available'
+    curses = not_found
   endif
-  if iconv.found()
-    curses_libname_list = ['ncursesw', 'ncurses', 'cursesw', 'pdcurses']
-    curses_test = '''
-      #include <locale.h>
-      #include <curses.h>
-      #include <wchar.h>
-      int main(void) {
-        wchar_t wch = L'w';
-        setlocale(LC_ALL, "");
-        resize_term(0, 0);
-        addwstr(L"wide chars\n");
-        addnwstr(&wch, 1);
-        add_wch(WACS_DEGREE);
-        return 0;
-      }'''
-    foreach curses_libname : curses_libname_list
-      libcurses = dependency(curses_libname,
-                             required: false,
-                             method: 'pkg-config',
-                             static: enable_static)
-
-      if not libcurses.found()
-        dirs = ['/usr/include/ncursesw']
-        if targetos == 'windows'
-          dirs = []
-        endif
-        libcurses = cc.find_library(curses_libname,
-                                    required: false,
-                                    dirs: dirs,
-                                    static: enable_static)
-      endif
-      if libcurses.found()
-        if cc.links(curses_test, dependencies: [libcurses])
-          curses = declare_dependency(compile_args: '-DNCURSES_WIDECHAR', dependencies: [libcurses])
-          break
-        endif
-      endif
-    endforeach
-  endif
-  if not curses.found()
-    if iconv.found()
-      if get_option('curses').enabled()
-        error('Cannot find curses')
-      endif
-    elif get_option('curses').enabled()
-      error('iconv required for curses UI but not available')
+  if not curses.found() and msg != ''
+    if get_option('curses').enabled()
+      error(msg)
     else
-      warning('iconv required for curses UI but not available, disabling')
+      warning(msg + ', disabling')
     endif
   endif
 endif
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] meson: rewrite curses/iconv test
  2020-10-19  9:45 [PATCH] meson: rewrite curses/iconv test Paolo Bonzini
@ 2020-10-19 19:58 ` 罗勇刚(Yonggang Luo)
  2020-10-20  9:12   ` Paolo Bonzini
  0 siblings, 1 reply; 3+ messages in thread
From: 罗勇刚(Yonggang Luo) @ 2020-10-19 19:58 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-level, Gerd Hoffmann

[-- Attachment #1: Type: text/plain, Size: 5855 bytes --]

On Mon, Oct 19, 2020 at 5:45 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> Redo the curses test to do the same tests that the configure
> check used to do.  OpenBSD triggers the warning because
> it does not support NCURSES_WIDECHAR and thus the cc.links
> test fails.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  meson.build | 109 +++++++++++++++++++++++++++++-----------------------
>  1 file changed, 60 insertions(+), 49 deletions(-)
>
> diff --git a/meson.build b/meson.build
> index 05fb59a00b..d1155aea65 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -463,6 +463,59 @@ endif
>  iconv = not_found
>  curses = not_found
>  if have_system and not get_option('curses').disabled()
> +  curses_test = '''
> +    #include <locale.h>
> +    #include <curses.h>
> +    #include <wchar.h>
> +    int main(void) {
> +      wchar_t wch = L'w';
> +      setlocale(LC_ALL, "");
> +      resize_term(0, 0);
> +      addwstr(L"wide chars\n");
> +      addnwstr(&wch, 1);
> +      add_wch(WACS_DEGREE);
> +      return 0;
> +    }'''
> +
> +  curses = dependency((targetos == 'windows' ? 'ncurses' : 'ncursesw'),
> +                      required: false,
> +                      method: 'pkg-config',
> +                      static: enable_static)
> +  msg = get_option('curses').enabled() ? 'curses library not found' : ''
> +  if curses.found()
> +    if cc.links(curses_test, dependencies: [curses])
> +      curses = declare_dependency(compile_args: '-DNCURSES_WIDECHAR',
dependencies: [curses])
> +    else
> +      msg = 'curses package not usable'
> +      curses = not_found
> +    endif
> +  endif
> +  if not curses.found()
> +    curses_compile_args = ['-DNCURSES_WIDECHAR']

Here is what I think need improve in meson, when declare dependencies, we
need a extra option compile_args
for easily testing extra compile args, and maybe also need link_args, and
after suceed, these flags should as a
part of the dependencies.

> +    has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
> +    if targetos != 'windows' and not has_curses_h
> +      message('Trying with /usr/include/ncursesw')
> +      curses_compile_args += ['-I/usr/include/ncursesw']
> +      has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
> +    endif
> +    if has_curses_h
> +      curses_libname_list = (targetos == 'windows' ? ['pdcurses'] :
['ncursesw', 'cursesw'])
> +      foreach curses_libname : curses_libname_list
> +        libcurses = cc.find_library(curses_libname,
> +                                    required: false,
> +                                    static: enable_static)
> +        if libcurses.found()
> +          if cc.links(curses_test, args: curses_compile_args,
dependencies: libcurses)
> +            curses = declare_dependency(compile_args:
curses_compile_args,
> +                                        dependencies: [libcurses])
> +            break
> +          else
> +            msg = 'curses library not usable'
> +          endif
> +        endif
> +      endforeach
> +    endif
> +  endif
>    if not get_option('iconv').disabled()
>      libiconv = cc.find_library('iconv',
>                                 required: false,
> @@ -476,57 +529,15 @@ if have_system and not
get_option('curses').disabled()
>        iconv = declare_dependency(dependencies: [libiconv])
>      endif
>    endif
> -  if get_option('iconv').enabled() and not iconv.found()
> -    error('Cannot detect iconv API')
> +  if curses.found() and not iconv.found()
> +    msg = 'iconv required for curses UI but not available'
> +    curses = not_found
>    endif
> -  if iconv.found()
> -    curses_libname_list = ['ncursesw', 'ncurses', 'cursesw', 'pdcurses']
> -    curses_test = '''
> -      #include <locale.h>
> -      #include <curses.h>
> -      #include <wchar.h>
> -      int main(void) {
> -        wchar_t wch = L'w';
> -        setlocale(LC_ALL, "");
> -        resize_term(0, 0);
> -        addwstr(L"wide chars\n");
> -        addnwstr(&wch, 1);
> -        add_wch(WACS_DEGREE);
> -        return 0;
> -      }'''
> -    foreach curses_libname : curses_libname_list
> -      libcurses = dependency(curses_libname,
> -                             required: false,
> -                             method: 'pkg-config',
> -                             static: enable_static)
> -
> -      if not libcurses.found()
> -        dirs = ['/usr/include/ncursesw']
> -        if targetos == 'windows'
> -          dirs = []
> -        endif
> -        libcurses = cc.find_library(curses_libname,
> -                                    required: false,
> -                                    dirs: dirs,
> -                                    static: enable_static)
> -      endif
> -      if libcurses.found()
> -        if cc.links(curses_test, dependencies: [libcurses])
> -          curses = declare_dependency(compile_args:
'-DNCURSES_WIDECHAR', dependencies: [libcurses])
> -          break
> -        endif
> -      endif
> -    endforeach
> -  endif
> -  if not curses.found()
> -    if iconv.found()
> -      if get_option('curses').enabled()
> -        error('Cannot find curses')
> -      endif
> -    elif get_option('curses').enabled()
> -      error('iconv required for curses UI but not available')
> +  if not curses.found() and msg != ''
> +    if get_option('curses').enabled()
> +      error(msg)
>      else
> -      warning('iconv required for curses UI but not available,
disabling')
> +      warning(msg + ', disabling')
>      endif
>    endif
>  endif
> --
> 2.26.2
>

Reviewed-by: Yonggang Luo <l <f4bug@amsat.org>uoyonggang@gmail.com>


--
         此致
礼
罗勇刚
Yours
    sincerely,
Yonggang Luo

[-- Attachment #2: Type: text/html, Size: 7920 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] meson: rewrite curses/iconv test
  2020-10-19 19:58 ` 罗勇刚(Yonggang Luo)
@ 2020-10-20  9:12   ` Paolo Bonzini
  0 siblings, 0 replies; 3+ messages in thread
From: Paolo Bonzini @ 2020-10-20  9:12 UTC (permalink / raw)
  To: luoyonggang; +Cc: qemu-level, Gerd Hoffmann

On 19/10/20 21:58, 罗勇刚(Yonggang Luo) wrote:
> 
>> +  if not curses.found() +    curses_compile_args =
>> ['-DNCURSES_WIDECHAR']
> 
> Here is what I think need improve in meson, when declare
> dependencies, we need a extra option compile_args for easily testing
> extra compile args, and maybe also need link_args, and after suceed,
> these flags should as a part of the dependencies.

I think it would make sense if cc.find_library had extra arguments that
would be added to the dependency and, in case of compile_args, to the
has_headers check.  It's a tradeoff between keeping the language simple
and making the users' code smaller.

Another possible extension is for cc.links to allow internal
dependencies, as long as they do not depend on sources.

Paolo



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-10-20  9:13 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-19  9:45 [PATCH] meson: rewrite curses/iconv test Paolo Bonzini
2020-10-19 19:58 ` 罗勇刚(Yonggang Luo)
2020-10-20  9:12   ` Paolo Bonzini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).