On Mon, Oct 19, 2020 at 5:45 PM Paolo Bonzini 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 > --- > 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 > + #include > + #include > + 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 > - #include > - #include > - 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 uoyonggang@gmail.com> -- 此致 礼 罗勇刚 Yours sincerely, Yonggang Luo