qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] meson: rewrite curses/iconv test


From: Yonggang Luo
Subject: Re: [PATCH] meson: rewrite curses/iconv test
Date: Tue, 20 Oct 2020 03:58:38 +0800



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 <luoyonggang@gmail.com>


--
         此致

罗勇刚
Yours
    sincerely,
Yonggang Luo

reply via email to

[Prev in Thread] Current Thread [Next in Thread]