Message ID | 20201019094534.1713842-1-pbonzini@redhat.com |
---|---|
State | New |
Headers | show |
Series | meson: rewrite curses/iconv test | expand |
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 <div dir="ltr"><br><br>On Mon, Oct 19, 2020 at 5:45 PM Paolo Bonzini <<a href="mailto:pbonzini@redhat.com">pbonzini@redhat.com</a>> wrote:<br>><br>> Redo the curses test to do the same tests that the configure<br>> check used to do. OpenBSD triggers the warning because<br>> it does not support NCURSES_WIDECHAR and thus the cc.links<br>> test fails.<br>><br>> Signed-off-by: Paolo Bonzini <<a href="mailto:pbonzini@redhat.com">pbonzini@redhat.com</a>><br>> ---<br>> meson.build | 109 +++++++++++++++++++++++++++++-----------------------<br>> 1 file changed, 60 insertions(+), 49 deletions(-)<br>><br>> diff --git a/meson.build b/meson.build<br>> index 05fb59a00b..d1155aea65 100644<br>> --- a/meson.build<br>> +++ b/meson.build<br>> @@ -463,6 +463,59 @@ endif<br>> iconv = not_found<br>> curses = not_found<br>> if have_system and not get_option('curses').disabled()<br>> + curses_test = '''<br>> + #include <locale.h><br>> + #include <curses.h><br>> + #include <wchar.h><br>> + int main(void) {<br>> + wchar_t wch = L'w';<br>> + setlocale(LC_ALL, "");<br>> + resize_term(0, 0);<br>> + addwstr(L"wide chars\n");<br>> + addnwstr(&wch, 1);<br>> + add_wch(WACS_DEGREE);<br>> + return 0;<br>> + }'''<br>> +<br>> + curses = dependency((targetos == 'windows' ? 'ncurses' : 'ncursesw'),<br>> + required: false,<br>> + method: 'pkg-config',<br>> + static: enable_static)<br>> + msg = get_option('curses').enabled() ? 'curses library not found' : ''<br>> + if curses.found()<br>> + if cc.links(curses_test, dependencies: [curses])<br>> + curses = declare_dependency(compile_args: '-DNCURSES_WIDECHAR', dependencies: [curses])<br>> + else<br>> + msg = 'curses package not usable'<br>> + curses = not_found<br>> + endif<br>> + endif<br>> + if not curses.found()<br>> + curses_compile_args = ['-DNCURSES_WIDECHAR']<div><br></div><div>Here is what I think need improve in meson, when declare dependencies, we need a extra option compile_args</div><div>for easily testing extra compile args, and maybe also need link_args, and after suceed, these flags should as a </div><div>part of the dependencies.</div><div><br>> + has_curses_h = cc.has_header('curses.h', args: curses_compile_args)<br>> + if targetos != 'windows' and not has_curses_h<br>> + message('Trying with /usr/include/ncursesw')<br>> + curses_compile_args += ['-I/usr/include/ncursesw']<br>> + has_curses_h = cc.has_header('curses.h', args: curses_compile_args)<br>> + endif<br>> + if has_curses_h<br>> + curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])<br>> + foreach curses_libname : curses_libname_list<br>> + libcurses = cc.find_library(curses_libname,<br>> + required: false,<br>> + static: enable_static)<br>> + if libcurses.found()<br>> + if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)<br>> + curses = declare_dependency(compile_args: curses_compile_args,<br>> + dependencies: [libcurses])<br>> + break<br>> + else<br>> + msg = 'curses library not usable'<br>> + endif<br>> + endif<br>> + endforeach<br>> + endif<br>> + endif<br>> if not get_option('iconv').disabled()<br>> libiconv = cc.find_library('iconv',<br>> required: false,<br>> @@ -476,57 +529,15 @@ if have_system and not get_option('curses').disabled()<br>> iconv = declare_dependency(dependencies: [libiconv])<br>> endif<br>> endif<br>> - if get_option('iconv').enabled() and not iconv.found()<br>> - error('Cannot detect iconv API')<br>> + if curses.found() and not iconv.found()<br>> + msg = 'iconv required for curses UI but not available'<br>> + curses = not_found<br>> endif<br>> - if iconv.found()<br>> - curses_libname_list = ['ncursesw', 'ncurses', 'cursesw', 'pdcurses']<br>> - curses_test = '''<br>> - #include <locale.h><br>> - #include <curses.h><br>> - #include <wchar.h><br>> - int main(void) {<br>> - wchar_t wch = L'w';<br>> - setlocale(LC_ALL, "");<br>> - resize_term(0, 0);<br>> - addwstr(L"wide chars\n");<br>> - addnwstr(&wch, 1);<br>> - add_wch(WACS_DEGREE);<br>> - return 0;<br>> - }'''<br>> - foreach curses_libname : curses_libname_list<br>> - libcurses = dependency(curses_libname,<br>> - required: false,<br>> - method: 'pkg-config',<br>> - static: enable_static)<br>> -<br>> - if not libcurses.found()<br>> - dirs = ['/usr/include/ncursesw']<br>> - if targetos == 'windows'<br>> - dirs = []<br>> - endif<br>> - libcurses = cc.find_library(curses_libname,<br>> - required: false,<br>> - dirs: dirs,<br>> - static: enable_static)<br>> - endif<br>> - if libcurses.found()<br>> - if cc.links(curses_test, dependencies: [libcurses])<br>> - curses = declare_dependency(compile_args: '-DNCURSES_WIDECHAR', dependencies: [libcurses])<br>> - break<br>> - endif<br>> - endif<br>> - endforeach<br>> - endif<br>> - if not curses.found()<br>> - if iconv.found()<br>> - if get_option('curses').enabled()<br>> - error('Cannot find curses')<br>> - endif<br>> - elif get_option('curses').enabled()<br>> - error('iconv required for curses UI but not available')<br>> + if not curses.found() and msg != ''<br>> + if get_option('curses').enabled()<br>> + error(msg)<br>> else<br>> - warning('iconv required for curses UI but not available, disabling')<br>> + warning(msg + ', disabling')<br>> endif<br>> endif<br>> endif<br>> --<br>> 2.26.2<br>></div><div></div><div><br></div><div>Reviewed-by: Yonggang Luo <<a href="mailto:f4bug@amsat.org" target="_blank">l</a><a href="mailto:uoyonggang@gmail.com">uoyonggang@gmail.com</a>></div><div><br class="gmail-Apple-interchange-newline"><br>--<br> 此致<br>礼<br>罗勇刚<br>Yours<br> sincerely,<br>Yonggang Luo</div></div>
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
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
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(-)