qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PULL 0/9] Ui 20201014 patches
@ 2020-10-14  8:21 Gerd Hoffmann
  2020-10-14  8:21 ` [PULL 1/9] qemu-edid: drop cast Gerd Hoffmann
                   ` (9 more replies)
  0 siblings, 10 replies; 15+ messages in thread
From: Gerd Hoffmann @ 2020-10-14  8:21 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefan Weil, Gerd Hoffmann

The following changes since commit 96292515c07e3a99f5a29540ed2f257b1ff75111:

  Merge remote-tracking branch 'remotes/vivier2/tags/trivial-branch-for-5.2-pull-request' into staging (2020-10-13 14:06:22 +0100)

are available in the Git repository at:

  git://git.kraxel.org/qemu tags/ui-20201014-pull-request

for you to fetch changes up to 41d004d8af59885da2c21460a73898b1aa09690f:

  ui: Fix default window_id value (2020-10-14 10:20:26 +0200)

----------------------------------------------------------------
ui: fixes for sdl, curses, vnc, input-linux.

----------------------------------------------------------------

Colin Xu (1):
  input-linux: Reset il->fd handler before closing it

Gerd Hoffmann (1):
  qemu-edid: drop cast

Jan Henrik Weinstock (1):
  SDL: enable OpenGL context creation

Jason Andryuk (1):
  vnc-stubs: Allow -vnc none

Samuel Thibault (1):
  ui: Fix default window_id value

Yonggang Luo (4):
  curses: Fixes compiler error that complain don't have langinfo.h on
    msys2/mingw
  curses: Fixes curses compiling errors.
  win32: Simplify gmtime_r detection not depends on if _POSIX_C_SOURCE
    are defined on msys2/mingw
  configure: Fixes ncursesw detection under msys2/mingw by convert them
    to meson

 configure                 | 155 ++------------------------------------
 meson_options.txt         |   4 +
 include/sysemu/os-win32.h |   4 +-
 qemu-edid.c               |   2 +-
 ui/console.c              |   1 +
 ui/curses.c               |  14 ++--
 ui/input-linux.c          |   1 +
 ui/sdl2.c                 |   5 ++
 ui/vnc-stubs.c            |   3 +
 util/oslib-win32.c        |   4 +-
 meson.build               |  83 +++++++++++++++++---
 ui/meson.build            |   2 +-
 12 files changed, 105 insertions(+), 173 deletions(-)

-- 
2.27.0




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

* [PULL 1/9] qemu-edid: drop cast
  2020-10-14  8:21 [PULL 0/9] Ui 20201014 patches Gerd Hoffmann
@ 2020-10-14  8:21 ` Gerd Hoffmann
  2020-10-14  8:21 ` [PULL 2/9] curses: Fixes compiler error that complain don't have langinfo.h on msys2/mingw Gerd Hoffmann
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 15+ messages in thread
From: Gerd Hoffmann @ 2020-10-14  8:21 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefan Weil, Daniel P . Berrangé, Gerd Hoffmann

Not needed and makes some compilers error out with:

qemu-edid.c:15:1: error: initializer element is not constant

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Message-id: 20201013091615.14166-1-kraxel@redhat.com
---
 qemu-edid.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/qemu-edid.c b/qemu-edid.c
index 1db3372b982c..1cd6a9517238 100644
--- a/qemu-edid.c
+++ b/qemu-edid.c
@@ -9,7 +9,7 @@
 #include "qemu/cutils.h"
 #include "hw/display/edid.h"
 
-static qemu_edid_info info = (qemu_edid_info) {
+static qemu_edid_info info = {
     .prefx = 1024,
     .prefy = 768,
 };
-- 
2.27.0



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

* [PULL 2/9] curses: Fixes compiler error that complain don't have langinfo.h on msys2/mingw
  2020-10-14  8:21 [PULL 0/9] Ui 20201014 patches Gerd Hoffmann
  2020-10-14  8:21 ` [PULL 1/9] qemu-edid: drop cast Gerd Hoffmann
@ 2020-10-14  8:21 ` Gerd Hoffmann
  2020-10-14  8:21 ` [PULL 3/9] curses: Fixes curses compiling errors Gerd Hoffmann
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 15+ messages in thread
From: Gerd Hoffmann @ 2020-10-14  8:21 UTC (permalink / raw)
  To: qemu-devel
  Cc: Stefan Weil, Yonggang Luo, Daniel P . Berrangé,
	Gerd Hoffmann, Philippe Mathieu-Daudé

From: Yonggang Luo <luoyonggang@gmail.com>

msys2/mingw lacks the POSIX-required langinfo.h.

gcc test.c -DNCURSES_WIDECHAR -I/mingw64/include/ncursesw -pipe -lncursesw -lgnurx -ltre -lintl -liconv
test.c:4:10: fatal error: langinfo.h: No such file or directory
    4 | #include <langinfo.h>
      |          ^~~~~~~~~~~~
compilation terminated.

So we using g_get_codeset instead of nl_langinfo(CODESET)

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-id: 20201012234348.1427-3-luoyonggang@gmail.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 configure   |  5 +----
 ui/curses.c | 10 +++++-----
 2 files changed, 6 insertions(+), 9 deletions(-)

diff --git a/configure b/configure
index 1b6348852171..71a574f718fa 100755
--- a/configure
+++ b/configure
@@ -3530,17 +3530,14 @@ if test "$curses" != "no" ; then
 #include <locale.h>
 #include <curses.h>
 #include <wchar.h>
-#include <langinfo.h>
 int main(void) {
-  const char *codeset;
   wchar_t wch = L'w';
   setlocale(LC_ALL, "");
   resize_term(0, 0);
   addwstr(L"wide chars\n");
   addnwstr(&wch, 1);
   add_wch(WACS_DEGREE);
-  codeset = nl_langinfo(CODESET);
-  return codeset != 0;
+  return 0;
 }
 EOF
   IFS=:
diff --git a/ui/curses.c b/ui/curses.c
index a59b23a9cf63..12bc682cf9b0 100644
--- a/ui/curses.c
+++ b/ui/curses.c
@@ -30,7 +30,6 @@
 #endif
 #include <locale.h>
 #include <wchar.h>
-#include <langinfo.h>
 #include <iconv.h>
 
 #include "qapi/error.h"
@@ -526,6 +525,7 @@ static void font_setup(void)
     iconv_t nativecharset_to_ucs2;
     iconv_t font_conv;
     int i;
+    g_autofree gchar *local_codeset = g_get_codeset();
 
     /*
      * Control characters are normally non-printable, but VGA does have
@@ -566,14 +566,14 @@ static void font_setup(void)
       0x25bc
     };
 
-    ucs2_to_nativecharset = iconv_open(nl_langinfo(CODESET), "UCS-2");
+    ucs2_to_nativecharset = iconv_open(local_codeset, "UCS-2");
     if (ucs2_to_nativecharset == (iconv_t) -1) {
         fprintf(stderr, "Could not convert font glyphs from UCS-2: '%s'\n",
                         strerror(errno));
         exit(1);
     }
 
-    nativecharset_to_ucs2 = iconv_open("UCS-2", nl_langinfo(CODESET));
+    nativecharset_to_ucs2 = iconv_open("UCS-2", local_codeset);
     if (nativecharset_to_ucs2 == (iconv_t) -1) {
         iconv_close(ucs2_to_nativecharset);
         fprintf(stderr, "Could not convert font glyphs to UCS-2: '%s'\n",
@@ -581,7 +581,7 @@ static void font_setup(void)
         exit(1);
     }
 
-    font_conv = iconv_open(nl_langinfo(CODESET), font_charset);
+    font_conv = iconv_open(local_codeset, font_charset);
     if (font_conv == (iconv_t) -1) {
         iconv_close(ucs2_to_nativecharset);
         iconv_close(nativecharset_to_ucs2);
@@ -602,7 +602,7 @@ static void font_setup(void)
     /* DEL */
     convert_ucs(0x7F, 0x2302, ucs2_to_nativecharset);
 
-    if (strcmp(nl_langinfo(CODESET), "UTF-8")) {
+    if (strcmp(local_codeset, "UTF-8")) {
         /* Non-Unicode capable, use termcap equivalents for those available */
         for (i = 0; i <= 0xFF; i++) {
             wchar_t wch[CCHARW_MAX];
-- 
2.27.0



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

* [PULL 3/9] curses: Fixes curses compiling errors.
  2020-10-14  8:21 [PULL 0/9] Ui 20201014 patches Gerd Hoffmann
  2020-10-14  8:21 ` [PULL 1/9] qemu-edid: drop cast Gerd Hoffmann
  2020-10-14  8:21 ` [PULL 2/9] curses: Fixes compiler error that complain don't have langinfo.h on msys2/mingw Gerd Hoffmann
@ 2020-10-14  8:21 ` Gerd Hoffmann
  2020-10-14  8:21 ` [PULL 4/9] win32: Simplify gmtime_r detection not depends on if _POSIX_C_SOURCE are defined on msys2/mingw Gerd Hoffmann
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 15+ messages in thread
From: Gerd Hoffmann @ 2020-10-14  8:21 UTC (permalink / raw)
  To: qemu-devel
  Cc: Stefan Weil, Yonggang Luo, Daniel P . Berrangé,
	Gerd Hoffmann

From: Yonggang Luo <luoyonggang@gmail.com>

This is the compiling error:
../ui/curses.c: In function 'curses_refresh':
../ui/curses.c:256:5: error: 'next_maybe_keycode' may be used uninitialized in this function [-Werror=maybe-uninitialized]
  256 |     curses2foo(_curses2keycode, _curseskey2keycode, chr, maybe_keycode)
      |     ^~~~~~~~~~
../ui/curses.c:302:32: note: 'next_maybe_keycode' was declared here
  302 |             enum maybe_keycode next_maybe_keycode;
      |                                ^~~~~~~~~~~~~~~~~~
../ui/curses.c:256:5: error: 'maybe_keycode' may be used uninitialized in this function [-Werror=maybe-uninitialized]
  256 |     curses2foo(_curses2keycode, _curseskey2keycode, chr, maybe_keycode)
      |     ^~~~~~~~~~
../ui/curses.c:265:24: note: 'maybe_keycode' was declared here
  265 |     enum maybe_keycode maybe_keycode;
      |                        ^~~~~~~~~~~~~
cc1.exe: all warnings being treated as errors

gcc version 10.2.0 (Rev1, Built by MSYS2 project)

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Message-id: 20201012234348.1427-4-luoyonggang@gmail.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 ui/curses.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/ui/curses.c b/ui/curses.c
index 12bc682cf9b0..e4f9588c3e8a 100644
--- a/ui/curses.c
+++ b/ui/curses.c
@@ -262,7 +262,7 @@ static int curses2foo(const int _curses2foo[], const int _curseskey2foo[],
 static void curses_refresh(DisplayChangeListener *dcl)
 {
     int chr, keysym, keycode, keycode_alt;
-    enum maybe_keycode maybe_keycode;
+    enum maybe_keycode maybe_keycode = CURSES_KEYCODE;
 
     curses_winch_check();
 
@@ -299,7 +299,7 @@ static void curses_refresh(DisplayChangeListener *dcl)
 
         /* alt or esc key */
         if (keycode == 1) {
-            enum maybe_keycode next_maybe_keycode;
+            enum maybe_keycode next_maybe_keycode = CURSES_KEYCODE;
             int nextchr = console_getch(&next_maybe_keycode);
 
             if (nextchr != -1) {
-- 
2.27.0



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

* [PULL 4/9] win32: Simplify gmtime_r detection not depends on if _POSIX_C_SOURCE are defined on msys2/mingw
  2020-10-14  8:21 [PULL 0/9] Ui 20201014 patches Gerd Hoffmann
                   ` (2 preceding siblings ...)
  2020-10-14  8:21 ` [PULL 3/9] curses: Fixes curses compiling errors Gerd Hoffmann
@ 2020-10-14  8:21 ` Gerd Hoffmann
  2020-10-14  8:21 ` [PULL 5/9] configure: Fixes ncursesw detection under msys2/mingw by convert them to meson Gerd Hoffmann
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 15+ messages in thread
From: Gerd Hoffmann @ 2020-10-14  8:21 UTC (permalink / raw)
  To: qemu-devel
  Cc: Stefan Weil, Yonggang Luo, Daniel P . Berrangé,
	Gerd Hoffmann

From: Yonggang Luo <luoyonggang@gmail.com>

We remove the CONFIG_LOCALTIME_R detection option in configure, and move the check
existence of gmtime_r from configure into C header and source directly by using macro
`_POSIX_THREAD_SAFE_FUNCTIONS`.
Before this patch, the configure script are always assume the compiler doesn't define
_POSIX_C_SOURCE macro at all, but that's not true, because thirdparty library such
as ncursesw may define -D_POSIX_C_SOURCE in it's pkg-config file. And that C Flags will
added -D_POSIX_C_SOURCE into each QEMU_CFLAGS. And that's causing the following compiling error:
n file included from C:/work/xemu/qemu/include/qemu/osdep.h:119,
                 from ../softmmu/main.c:25:
C:/work/xemu/qemu/include/sysemu/os-win32.h:53:12: error: redundant redeclaration of 'gmtime_r' [-Werror=redundant-decls]
   53 | struct tm *gmtime_r(const time_t *timep, struct tm *result);
      |            ^~~~~~~~
In file included from C:/work/xemu/qemu/include/qemu/osdep.h:94,
                 from ../softmmu/main.c:25:
C:/CI-Tools/msys64/mingw64/x86_64-w64-mingw32/include/time.h:284:36: note: previous definition of 'gmtime_r' was here
  284 | __forceinline struct tm *__CRTDECL gmtime_r(const time_t *_Time, struct tm *_Tm) {
      |                                    ^~~~~~~~
In file included from C:/work/xemu/qemu/include/qemu/osdep.h:119,
                 from ../softmmu/main.c:25:
C:/work/xemu/qemu/include/sysemu/os-win32.h:55:12: error: redundant redeclaration of 'localtime_r' [-Werror=redundant-decls]
   55 | struct tm *localtime_r(const time_t *timep, struct tm *result);
      |            ^~~~~~~~~~~
In file included from C:/work/xemu/qemu/include/qemu/osdep.h:94,
                 from ../softmmu/main.c:25:
C:/CI-Tools/msys64/mingw64/x86_64-w64-mingw32/include/time.h:281:36: note: previous definition of 'localtime_r' was here
  281 | __forceinline struct tm *__CRTDECL localtime_r(const time_t *_Time, struct tm *_Tm) {
      |                                    ^~~~~~~~~~~
Compiling C object libcommon.fa.p/hw_gpio_zaurus.c.obj
In file included from C:/work/xemu/qemu/include/qemu/osdep.h:119,
                 from ../hw/i2c/smbus_slave.c:16:
C:/work/xemu/qemu/include/sysemu/os-win32.h:53:12: error: redundant redeclaration of 'gmtime_r' [-Werror=redundant-decls]
   53 | struct tm *gmtime_r(const time_t *timep, struct tm *result);
      |            ^~~~~~~~
In file included from C:/work/xemu/qemu/include/qemu/osdep.h:94,
                 from ../hw/i2c/smbus_slave.c:16:
C:/CI-Tools/msys64/mingw64/x86_64-w64-mingw32/include/time.h:284:36: note: previous definition of 'gmtime_r' was here
  284 | __forceinline struct tm *__CRTDECL gmtime_r(const time_t *_Time, struct tm *_Tm) {
      |                                    ^~~~~~~~
In file included from C:/work/xemu/qemu/include/qemu/osdep.h:119,
                 from ../hw/i2c/smbus_slave.c:16:
C:/work/xemu/qemu/include/sysemu/os-win32.h:55:12: error: redundant redeclaration of 'localtime_r' [-Werror=redundant-decls]
   55 | struct tm *localtime_r(const time_t *timep, struct tm *result);
      |            ^~~~~~~~~~~
In file included from C:/work/xemu/qemu/include/qemu/osdep.h:94,
                 from ../hw/i2c/smbus_slave.c:16:
C:/CI-Tools/msys64/mingw64/x86_64-w64-mingw32/include/time.h:281:36: note: previous definition of 'localtime_r' was here
  281 | __forceinline struct tm *__CRTDECL localtime_r(const time_t *_Time, struct tm *_Tm) {
      |                                    ^~~~~~~~~~~
Compiling C object libcommon.fa.p/hw_dma_xilinx_axidma.c.obj

After this patch, whenever ncursesw or other thirdparty libraries tried to define or not
define  _POSIX_C_SOURCE, the source will building properly. Because now, we don't make any
assumption if _POSIX_C_SOURCE are defined. We solely relied on if the macro `_POSIX_THREAD_SAFE_FUNCTIONS`
are defined in msys2/mingw header.

The _POSIX_THREAD_SAFE_FUNCTIONS are defined in mingw header like this:

```
#if defined(_POSIX_C_SOURCE) && !defined(_POSIX_THREAD_SAFE_FUNCTIONS)
#define _POSIX_THREAD_SAFE_FUNCTIONS 200112L
#endif

#ifdef _POSIX_THREAD_SAFE_FUNCTIONS
__forceinline struct tm *__CRTDECL localtime_r(const time_t *_Time, struct tm *_Tm) {
  return localtime_s(_Tm, _Time) ? NULL : _Tm;
}
__forceinline struct tm *__CRTDECL gmtime_r(const time_t *_Time, struct tm *_Tm) {
  return gmtime_s(_Tm, _Time) ? NULL : _Tm;
}
__forceinline char *__CRTDECL ctime_r(const time_t *_Time, char *_Str) {
  return ctime_s(_Str, 0x7fffffff, _Time) ? NULL : _Str;
}
__forceinline char *__CRTDECL asctime_r(const struct tm *_Tm, char * _Str) {
  return asctime_s(_Str, 0x7fffffff, _Tm) ? NULL : _Str;
}
#endif
```

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Message-id: 20201012234348.1427-5-luoyonggang@gmail.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 configure                 | 34 ----------------------------------
 include/sysemu/os-win32.h |  4 ++--
 util/oslib-win32.c        |  4 ++--
 3 files changed, 4 insertions(+), 38 deletions(-)

diff --git a/configure b/configure
index 71a574f718fa..9a87685517ee 100755
--- a/configure
+++ b/configure
@@ -2386,37 +2386,6 @@ if test "$vhost_net" = ""; then
   test "$vhost_kernel" = "yes" && vhost_net=yes
 fi
 
-##########################################
-# MinGW / Mingw-w64 localtime_r/gmtime_r check
-
-if test "$mingw32" = "yes"; then
-    # Some versions of MinGW / Mingw-w64 lack localtime_r
-    # and gmtime_r entirely.
-    #
-    # Some versions of Mingw-w64 define a macro for
-    # localtime_r/gmtime_r.
-    #
-    # Some versions of Mingw-w64 will define functions
-    # for localtime_r/gmtime_r, but only if you have
-    # _POSIX_THREAD_SAFE_FUNCTIONS defined. For fun
-    # though, unistd.h and pthread.h both define
-    # that for you.
-    #
-    # So this #undef localtime_r and #include <unistd.h>
-    # are not in fact redundant.
-cat > $TMPC << EOF
-#include <unistd.h>
-#include <time.h>
-#undef localtime_r
-int main(void) { localtime_r(NULL, NULL); return 0; }
-EOF
-    if compile_prog "" "" ; then
-        localtime_r="yes"
-    else
-        localtime_r="no"
-    fi
-fi
-
 ##########################################
 # pkg-config probe
 
@@ -6610,9 +6579,6 @@ if [ "$bsd" = "yes" ] ; then
   echo "CONFIG_BSD=y" >> $config_host_mak
 fi
 
-if test "$localtime_r" = "yes" ; then
-  echo "CONFIG_LOCALTIME_R=y" >> $config_host_mak
-fi
 if test "$qom_cast_debug" = "yes" ; then
   echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
 fi
diff --git a/include/sysemu/os-win32.h b/include/sysemu/os-win32.h
index d8978e28c03f..5346d51e890e 100644
--- a/include/sysemu/os-win32.h
+++ b/include/sysemu/os-win32.h
@@ -48,12 +48,12 @@
 #define siglongjmp(env, val) longjmp(env, val)
 
 /* Missing POSIX functions. Don't use MinGW-w64 macros. */
-#ifndef CONFIG_LOCALTIME_R
+#ifndef _POSIX_THREAD_SAFE_FUNCTIONS
 #undef gmtime_r
 struct tm *gmtime_r(const time_t *timep, struct tm *result);
 #undef localtime_r
 struct tm *localtime_r(const time_t *timep, struct tm *result);
-#endif /* CONFIG_LOCALTIME_R */
+#endif /* _POSIX_THREAD_SAFE_FUNCTIONS */
 
 static inline void os_setup_signal_handling(void) {}
 static inline void os_daemonize(void) {}
diff --git a/util/oslib-win32.c b/util/oslib-win32.c
index 051afb217bc0..e99debfb8dd4 100644
--- a/util/oslib-win32.c
+++ b/util/oslib-win32.c
@@ -106,7 +106,7 @@ void qemu_anon_ram_free(void *ptr, size_t size)
     }
 }
 
-#ifndef CONFIG_LOCALTIME_R
+#ifndef _POSIX_THREAD_SAFE_FUNCTIONS
 /* FIXME: add proper locking */
 struct tm *gmtime_r(const time_t *timep, struct tm *result)
 {
@@ -130,7 +130,7 @@ struct tm *localtime_r(const time_t *timep, struct tm *result)
     }
     return p;
 }
-#endif /* CONFIG_LOCALTIME_R */
+#endif /* _POSIX_THREAD_SAFE_FUNCTIONS */
 
 static int socket_error(void)
 {
-- 
2.27.0



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

* [PULL 5/9] configure: Fixes ncursesw detection under msys2/mingw by convert them to meson
  2020-10-14  8:21 [PULL 0/9] Ui 20201014 patches Gerd Hoffmann
                   ` (3 preceding siblings ...)
  2020-10-14  8:21 ` [PULL 4/9] win32: Simplify gmtime_r detection not depends on if _POSIX_C_SOURCE are defined on msys2/mingw Gerd Hoffmann
@ 2020-10-14  8:21 ` Gerd Hoffmann
  2020-10-14 18:22   ` Bruce Rogers
  2020-10-14  8:21 ` [PULL 6/9] vnc-stubs: Allow -vnc none Gerd Hoffmann
                   ` (4 subsequent siblings)
  9 siblings, 1 reply; 15+ messages in thread
From: Gerd Hoffmann @ 2020-10-14  8:21 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefan Weil, Yonggang Luo, Gerd Hoffmann

From: Yonggang Luo <luoyonggang@gmail.com>

The mingw pkg-config are showing following absolute path and contains : as the separator,

-D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -IC:/CI-Tools/msys64/mingw64/include/ncursesw:-I/usr/include/ncursesw:
-DNCURSES_WIDECHAR -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -IC -pipe -lncursesw -lgnurx -ltre -lintl -liconv
-DNCURSES_WIDECHAR -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -IC -lncursesw
-DNCURSES_WIDECHAR -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -IC -lcursesw
-DNCURSES_WIDECHAR /CI-Tools/msys64/mingw64/include/ncursesw -pipe -lncursesw -lgnurx -ltre -lintl -liconv
-DNCURSES_WIDECHAR /CI-Tools/msys64/mingw64/include/ncursesw -lncursesw
-DNCURSES_WIDECHAR /CI-Tools/msys64/mingw64/include/ncursesw -lcursesw
-DNCURSES_WIDECHAR -I/usr/include/ncursesw -pipe -lncursesw -lgnurx -ltre -lintl -liconv
-DNCURSES_WIDECHAR -I/usr/include/ncursesw -lncursesw
-DNCURSES_WIDECHAR -I/usr/include/ncursesw -lcursesw

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
Message-id: 20201012234348.1427-6-luoyonggang@gmail.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 configure         | 118 +++-------------------------------------------
 meson_options.txt |   4 ++
 meson.build       |  83 +++++++++++++++++++++++++++-----
 ui/meson.build    |   2 +-
 4 files changed, 83 insertions(+), 124 deletions(-)

diff --git a/configure b/configure
index 9a87685517ee..f839c2a557c3 100755
--- a/configure
+++ b/configure
@@ -295,7 +295,8 @@ unset target_list_exclude
 
 brlapi=""
 curl=""
-curses=""
+iconv="auto"
+curses="auto"
 docs=""
 fdt="auto"
 netmap="no"
@@ -1173,13 +1174,13 @@ for opt do
   ;;
   --disable-safe-stack) safe_stack="no"
   ;;
-  --disable-curses) curses="no"
+  --disable-curses) curses="disabled"
   ;;
-  --enable-curses) curses="yes"
+  --enable-curses) curses="enabled"
   ;;
-  --disable-iconv) iconv="no"
+  --disable-iconv) iconv="disabled"
   ;;
-  --enable-iconv) iconv="yes"
+  --enable-iconv) iconv="enabled"
   ;;
   --disable-curl) curl="no"
   ;;
@@ -3440,102 +3441,6 @@ EOF
   fi
 fi
 
-##########################################
-# iconv probe
-if test "$iconv" != "no" ; then
-  cat > $TMPC << EOF
-#include <iconv.h>
-int main(void) {
-  iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
-  return conv != (iconv_t) -1;
-}
-EOF
-  iconv_prefix_list="/usr/local:/usr"
-  iconv_lib_list=":-liconv"
-  IFS=:
-  for iconv_prefix in $iconv_prefix_list; do
-    IFS=:
-    iconv_cflags="-I$iconv_prefix/include"
-    iconv_ldflags="-L$iconv_prefix/lib"
-    for iconv_link in $iconv_lib_list; do
-      unset IFS
-      iconv_lib="$iconv_ldflags $iconv_link"
-      echo "looking at iconv in '$iconv_cflags' '$iconv_lib'" >> config.log
-      if compile_prog "$iconv_cflags" "$iconv_lib" ; then
-        iconv_found=yes
-        break
-      fi
-    done
-    if test "$iconv_found" = yes ; then
-      break
-    fi
-  done
-  if test "$iconv_found" = "yes" ; then
-    iconv=yes
-  else
-    if test "$iconv" = "yes" ; then
-      feature_not_found "iconv" "Install iconv devel"
-    fi
-    iconv=no
-  fi
-fi
-
-##########################################
-# curses probe
-if test "$iconv" = "no" ; then
-  # curses will need iconv
-  curses=no
-fi
-if test "$curses" != "no" ; then
-  if test "$mingw32" = "yes" ; then
-    curses_inc_list="$($pkg_config --cflags ncurses 2>/dev/null):"
-    curses_lib_list="$($pkg_config --libs ncurses 2>/dev/null):-lpdcurses"
-  else
-    curses_inc_list="$($pkg_config --cflags ncursesw 2>/dev/null):-I/usr/include/ncursesw:"
-    curses_lib_list="$($pkg_config --libs ncursesw 2>/dev/null):-lncursesw:-lcursesw"
-  fi
-  curses_found=no
-  cat > $TMPC << EOF
-#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;
-}
-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
-      if compile_prog "$curses_inc" "$curses_lib" ; then
-        curses_found=yes
-        break
-      fi
-    done
-    if test "$curses_found" = yes ; then
-      break
-    fi
-  done
-  unset IFS
-  if test "$curses_found" = "yes" ; then
-    curses=yes
-  else
-    if test "$curses" = "yes" ; then
-      feature_not_found "curses" "Install ncurses devel"
-    fi
-    curses=no
-  fi
-fi
-
 ##########################################
 # curl probe
 if test "$curl" != "no" ; then
@@ -6200,16 +6105,6 @@ if test "$have_x11" = "yes" && test "$need_x11" = "yes"; then
   echo "X11_CFLAGS=$x11_cflags" >> $config_host_mak
   echo "X11_LIBS=$x11_libs" >> $config_host_mak
 fi
-if test "$iconv" = "yes" ; then
-  echo "CONFIG_ICONV=y" >> $config_host_mak
-  echo "ICONV_CFLAGS=$iconv_cflags" >> $config_host_mak
-  echo "ICONV_LIBS=$iconv_lib" >> $config_host_mak
-fi
-if test "$curses" = "yes" ; then
-  echo "CONFIG_CURSES=y" >> $config_host_mak
-  echo "CURSES_CFLAGS=$curses_inc" >> $config_host_mak
-  echo "CURSES_LIBS=$curses_lib" >> $config_host_mak
-fi
 if test "$pipe2" = "yes" ; then
   echo "CONFIG_PIPE2=y" >> $config_host_mak
 fi
@@ -7181,6 +7076,7 @@ NINJA=${ninja:-$PWD/ninjatool} $meson setup \
         -Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg -Dvnc_png=$vnc_png \
         -Dgettext=$gettext -Dxkbcommon=$xkbcommon -Du2f=$u2f \
         -Dcapstone=$capstone -Dslirp=$slirp -Dfdt=$fdt \
+        -Diconv=$iconv -Dcurses=$curses \
         $cross_arg \
         "$PWD" "$source_path"
 
diff --git a/meson_options.txt b/meson_options.txt
index 1d3c94840a90..e6cb1e589b4e 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -32,6 +32,10 @@ option('cocoa', type : 'feature', value : 'auto',
        description: 'Cocoa user interface (macOS only)')
 option('mpath', type : 'feature', value : 'auto',
        description: 'Multipath persistent reservation passthrough')
+option('iconv', type : 'feature', value : 'auto',
+       description: 'Font glyph conversion support')
+option('curses', type : 'feature', value : 'auto',
+       description: 'curses UI')
 option('sdl', type : 'feature', value : 'auto',
        description: 'SDL user interface')
 option('sdl_image', type : 'feature', value : 'auto',
diff --git a/meson.build b/meson.build
index ad6c7c90c787..1a4a48249243 100644
--- a/meson.build
+++ b/meson.build
@@ -426,6 +426,74 @@ if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
   endif
 endif
 
+iconv = not_found
+if not get_option('iconv').disabled()
+  libiconv = cc.find_library('iconv',
+                             required: false,
+                             static: enable_static)
+  if libiconv.found()
+    if cc.links('''
+      #include <iconv.h>
+      int main(void) {
+        iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
+        return conv != (iconv_t) -1;
+      }''', dependencies: [libiconv])
+      iconv = declare_dependency(dependencies: [libiconv])
+    endif
+  endif
+endif
+if get_option('iconv').enabled() and not iconv.found()
+  error('Cannot detect iconv API')
+endif
+
+curses = not_found
+if iconv.found() and not get_option('curses').disabled()
+  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 get_option('curses').enabled() and not curses.found()
+  if not iconv.found()
+    error('Cannot detect iconv API')
+  else
+    error('Cannot detect curses API')
+  endif
+endif
+
 brlapi = not_found
 if 'CONFIG_BRLAPI' in config_host
   brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
@@ -504,16 +572,6 @@ if 'CONFIG_X11' in config_host
   x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
                            link_args: config_host['X11_LIBS'].split())
 endif
-curses = not_found
-if 'CONFIG_CURSES' in config_host
-  curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
-                              link_args: config_host['CURSES_LIBS'].split())
-endif
-iconv = not_found
-if 'CONFIG_ICONV' in config_host
-  iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
-                             link_args: config_host['ICONV_LIBS'].split())
-endif
 vnc = not_found
 png = not_found
 jpeg = not_found
@@ -622,6 +680,7 @@ config_host_data.set('CONFIG_COCOA', cocoa.found())
 config_host_data.set('CONFIG_LIBUDEV', libudev.found())
 config_host_data.set('CONFIG_MPATH', mpathpersist.found())
 config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
+config_host_data.set('CONFIG_CURSES', curses.found())
 config_host_data.set('CONFIG_SDL', sdl.found())
 config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
 config_host_data.set('CONFIG_VNC', vnc.found())
@@ -1905,8 +1964,8 @@ if config_host.has_key('CONFIG_NETTLE')
 endif
 summary_info += {'libtasn1':          config_host.has_key('CONFIG_TASN1')}
 summary_info += {'PAM':               config_host.has_key('CONFIG_AUTH_PAM')}
-summary_info += {'iconv support':     config_host.has_key('CONFIG_ICONV')}
-summary_info += {'curses support':    config_host.has_key('CONFIG_CURSES')}
+summary_info += {'iconv support':     iconv.found()}
+summary_info += {'curses support':    curses.found()}
 # TODO: add back version
 summary_info += {'virgl support':     config_host.has_key('CONFIG_VIRGL')}
 summary_info += {'curl support':      config_host.has_key('CONFIG_CURL')}
diff --git a/ui/meson.build b/ui/meson.build
index 8a080c38e325..78ad792ffb8d 100644
--- a/ui/meson.build
+++ b/ui/meson.build
@@ -39,7 +39,7 @@ specific_ss.add(when: ['CONFIG_SOFTMMU'], if_true: opengl)
 
 ui_modules = {}
 
-if config_host.has_key('CONFIG_CURSES')
+if curses.found()
   curses_ss = ss.source_set()
   curses_ss.add(when: [curses, iconv], if_true: [files('curses.c'), pixman])
   ui_modules += {'curses' : curses_ss}
-- 
2.27.0



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

* [PULL 6/9] vnc-stubs: Allow -vnc none
  2020-10-14  8:21 [PULL 0/9] Ui 20201014 patches Gerd Hoffmann
                   ` (4 preceding siblings ...)
  2020-10-14  8:21 ` [PULL 5/9] configure: Fixes ncursesw detection under msys2/mingw by convert them to meson Gerd Hoffmann
@ 2020-10-14  8:21 ` Gerd Hoffmann
  2020-10-14  8:21 ` [PULL 7/9] SDL: enable OpenGL context creation Gerd Hoffmann
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 15+ messages in thread
From: Gerd Hoffmann @ 2020-10-14  8:21 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefan Weil, Gerd Hoffmann, Jason Andryuk

From: Jason Andryuk <jandryuk@gmail.com>

Currently `-vnc none` is fatal when built with `--disable-vnc`.  Make
vnc_parse accept "none", so QEMU still run without using vnc.

Signed-off-by: Jason Andryuk <jandryuk@gmail.com>
Message-id: 20201009014032.3507-1-jandryuk@gmail.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 ui/vnc-stubs.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/ui/vnc-stubs.c b/ui/vnc-stubs.c
index 06c4ac6296eb..c6b737dcec67 100644
--- a/ui/vnc-stubs.c
+++ b/ui/vnc-stubs.c
@@ -12,6 +12,9 @@ int vnc_display_pw_expire(const char *id, time_t expires)
 };
 QemuOpts *vnc_parse(const char *str, Error **errp)
 {
+    if (strcmp(str, "none") == 0) {
+        return NULL;
+    }
     error_setg(errp, "VNC support is disabled");
     return NULL;
 }
-- 
2.27.0



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

* [PULL 7/9] SDL: enable OpenGL context creation
  2020-10-14  8:21 [PULL 0/9] Ui 20201014 patches Gerd Hoffmann
                   ` (5 preceding siblings ...)
  2020-10-14  8:21 ` [PULL 6/9] vnc-stubs: Allow -vnc none Gerd Hoffmann
@ 2020-10-14  8:21 ` Gerd Hoffmann
  2020-10-14  8:21 ` [PULL 8/9] input-linux: Reset il->fd handler before closing it Gerd Hoffmann
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 15+ messages in thread
From: Gerd Hoffmann @ 2020-10-14  8:21 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefan Weil, Gerd Hoffmann, Jan Henrik Weinstock

From: Jan Henrik Weinstock <jan.weinstock@rwth-aachen.de>

We need to specify SDL_WINDOW_OPENGL if we want to create an OpenGL context on it, i.e. when using '-device virtio-gpu-pci,virgl=on'

Signed-off-by: Jan Henrik Weinstock <jan.weinstock@rwth-aachen.de>
Message-id: b2ba98b3-2975-0d4d-1c56-f659923c714d@rwth-aachen.de
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 ui/sdl2.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/ui/sdl2.c b/ui/sdl2.c
index abad7f981e50..189d26e2a951 100644
--- a/ui/sdl2.c
+++ b/ui/sdl2.c
@@ -84,6 +84,11 @@ void sdl2_window_create(struct sdl2_console *scon)
     if (scon->hidden) {
         flags |= SDL_WINDOW_HIDDEN;
     }
+#ifdef CONFIG_OPENGL
+    if (scon->opengl) {
+        flags |= SDL_WINDOW_OPENGL;
+    }
+#endif
 
     scon->real_window = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED,
                                          SDL_WINDOWPOS_UNDEFINED,
-- 
2.27.0



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

* [PULL 8/9] input-linux: Reset il->fd handler before closing it
  2020-10-14  8:21 [PULL 0/9] Ui 20201014 patches Gerd Hoffmann
                   ` (6 preceding siblings ...)
  2020-10-14  8:21 ` [PULL 7/9] SDL: enable OpenGL context creation Gerd Hoffmann
@ 2020-10-14  8:21 ` Gerd Hoffmann
  2020-10-14  8:21 ` [PULL 9/9] ui: Fix default window_id value Gerd Hoffmann
  2020-10-14 14:24 ` [PULL 0/9] Ui 20201014 patches Peter Maydell
  9 siblings, 0 replies; 15+ messages in thread
From: Gerd Hoffmann @ 2020-10-14  8:21 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefan Weil, Li Qiang, Gerd Hoffmann, Colin Xu

From: Colin Xu <colin.xu@intel.com>

If object-del input-linux object on-the-fly, instance finalize will
close evdev fd without resetting it. However the main thread is still
trying to lock_acquire/lock_release during ppoll, which leads to a very
high CPU utilization.

Signed-off-by: Colin Xu <colin.xu@intel.com>
Reviewed-by: Li Qiang <liq3ea@gmail.com>
Message-id: 20200925021808.26471-1-colin.xu@intel.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 ui/input-linux.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/ui/input-linux.c b/ui/input-linux.c
index ab351a418701..34cc531190f9 100644
--- a/ui/input-linux.c
+++ b/ui/input-linux.c
@@ -418,6 +418,7 @@ static void input_linux_instance_finalize(Object *obj)
 
     if (il->initialized) {
         QTAILQ_REMOVE(&inputs, il, next);
+        qemu_set_fd_handler(il->fd, NULL, NULL, NULL);
         close(il->fd);
     }
     g_free(il->evdev);
-- 
2.27.0



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

* [PULL 9/9] ui: Fix default window_id value
  2020-10-14  8:21 [PULL 0/9] Ui 20201014 patches Gerd Hoffmann
                   ` (7 preceding siblings ...)
  2020-10-14  8:21 ` [PULL 8/9] input-linux: Reset il->fd handler before closing it Gerd Hoffmann
@ 2020-10-14  8:21 ` Gerd Hoffmann
  2020-10-14 14:24 ` [PULL 0/9] Ui 20201014 patches Peter Maydell
  9 siblings, 0 replies; 15+ messages in thread
From: Gerd Hoffmann @ 2020-10-14  8:21 UTC (permalink / raw)
  To: qemu-devel
  Cc: Stefan Weil, Philippe Mathieu-Daudé, Gerd Hoffmann,
	Samuel Thibault

From: Samuel Thibault <samuel.thibault@ens-lyon.org>

./chardev/baum.c expects the default window_id value to be -1, and not 0
which could be confused with a proper window id (when numbered from 0 by
the ui backend).

This fixes getting Braille output with the curses and gtk frontends.

Fixes: f29b3431f62 ("console: move window ID code from baum to sdl")
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Message-Id: <20200914100637.eeommoflirxrgaeh@function>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 ui/console.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/ui/console.c b/ui/console.c
index 54a74c0b16c9..820e4081709d 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -1310,6 +1310,7 @@ static QemuConsole *new_console(DisplayState *ds, console_type_t console_type,
     }
     s->ds = ds;
     s->console_type = console_type;
+    s->window_id = -1;
 
     if (QTAILQ_EMPTY(&consoles)) {
         s->index = 0;
-- 
2.27.0



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

* Re: [PULL 0/9] Ui 20201014 patches
  2020-10-14  8:21 [PULL 0/9] Ui 20201014 patches Gerd Hoffmann
                   ` (8 preceding siblings ...)
  2020-10-14  8:21 ` [PULL 9/9] ui: Fix default window_id value Gerd Hoffmann
@ 2020-10-14 14:24 ` Peter Maydell
  9 siblings, 0 replies; 15+ messages in thread
From: Peter Maydell @ 2020-10-14 14:24 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: Stefan Weil, QEMU Developers

On Wed, 14 Oct 2020 at 09:26, Gerd Hoffmann <kraxel@redhat.com> wrote:
>
> The following changes since commit 96292515c07e3a99f5a29540ed2f257b1ff75111:
>
>   Merge remote-tracking branch 'remotes/vivier2/tags/trivial-branch-for-5.2-pull-request' into staging (2020-10-13 14:06:22 +0100)
>
> are available in the Git repository at:
>
>   git://git.kraxel.org/qemu tags/ui-20201014-pull-request
>
> for you to fetch changes up to 41d004d8af59885da2c21460a73898b1aa09690f:
>
>   ui: Fix default window_id value (2020-10-14 10:20:26 +0200)
>
> ----------------------------------------------------------------
> ui: fixes for sdl, curses, vnc, input-linux.
>
> ----------------------------------------------------------------

Applied, thanks.

Please update the changelog at https://wiki.qemu.org/ChangeLog/5.2
for any user-visible changes.

-- PMM


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

* Re: [PULL 5/9] configure: Fixes ncursesw detection under msys2/mingw by convert them to meson
  2020-10-14  8:21 ` [PULL 5/9] configure: Fixes ncursesw detection under msys2/mingw by convert them to meson Gerd Hoffmann
@ 2020-10-14 18:22   ` Bruce Rogers
  2020-10-14 19:16     ` 罗勇刚(Yonggang Luo)
  2020-10-14 19:17     ` 罗勇刚(Yonggang Luo)
  0 siblings, 2 replies; 15+ messages in thread
From: Bruce Rogers @ 2020-10-14 18:22 UTC (permalink / raw)
  To: Gerd Hoffmann, qemu-devel; +Cc: Stefan Weil, Yonggang Luo

On Wed, 2020-10-14 at 10:21 +0200, Gerd Hoffmann wrote:
> From: Yonggang Luo <luoyonggang@gmail.com>
> 
> The mingw pkg-config are showing following absolute path and contains
> : as the separator,
> 
> -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -IC:/CI-
> Tools/msys64/mingw64/include/ncursesw:-I/usr/include/ncursesw:
> -DNCURSES_WIDECHAR -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -IC
> -pipe -lncursesw -lgnurx -ltre -lintl -liconv
> -DNCURSES_WIDECHAR -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -IC
> -lncursesw
> -DNCURSES_WIDECHAR -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -IC
> -lcursesw
> -DNCURSES_WIDECHAR /CI-Tools/msys64/mingw64/include/ncursesw -pipe
> -lncursesw -lgnurx -ltre -lintl -liconv
> -DNCURSES_WIDECHAR /CI-Tools/msys64/mingw64/include/ncursesw
> -lncursesw
> -DNCURSES_WIDECHAR /CI-Tools/msys64/mingw64/include/ncursesw
> -lcursesw
> -DNCURSES_WIDECHAR -I/usr/include/ncursesw -pipe -lncursesw -lgnurx
> -ltre -lintl -liconv
> -DNCURSES_WIDECHAR -I/usr/include/ncursesw -lncursesw
> -DNCURSES_WIDECHAR -I/usr/include/ncursesw -lcursesw
> 
> Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
> Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
> Message-id: 20201012234348.1427-6-luoyonggang@gmail.com
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
>  configure         | 118 +++-----------------------------------------
> --
>  meson_options.txt |   4 ++
>  meson.build       |  83 +++++++++++++++++++++++++++-----
>  ui/meson.build    |   2 +-
>  4 files changed, 83 insertions(+), 124 deletions(-)
> 
> diff --git a/configure b/configure
> index 9a87685517ee..f839c2a557c3 100755
> --- a/configure
> +++ b/configure
> @@ -295,7 +295,8 @@ unset target_list_exclude
>  
>  brlapi=""
>  curl=""
> -curses=""
> +iconv="auto"
> +curses="auto"
>  docs=""
>  fdt="auto"
>  netmap="no"
> @@ -1173,13 +1174,13 @@ for opt do
>    ;;
>    --disable-safe-stack) safe_stack="no"
>    ;;
> -  --disable-curses) curses="no"
> +  --disable-curses) curses="disabled"
>    ;;
> -  --enable-curses) curses="yes"
> +  --enable-curses) curses="enabled"
>    ;;
> -  --disable-iconv) iconv="no"
> +  --disable-iconv) iconv="disabled"
>    ;;
> -  --enable-iconv) iconv="yes"
> +  --enable-iconv) iconv="enabled"
>    ;;
>    --disable-curl) curl="no"
>    ;;
> @@ -3440,102 +3441,6 @@ EOF
>    fi
>  fi
>  
> -##########################################
> -# iconv probe
> -if test "$iconv" != "no" ; then
> -  cat > $TMPC << EOF
> -#include <iconv.h>
> -int main(void) {
> -  iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
> -  return conv != (iconv_t) -1;
> -}
> -EOF
> -  iconv_prefix_list="/usr/local:/usr"
> -  iconv_lib_list=":-liconv"
> -  IFS=:
> -  for iconv_prefix in $iconv_prefix_list; do
> -    IFS=:
> -    iconv_cflags="-I$iconv_prefix/include"
> -    iconv_ldflags="-L$iconv_prefix/lib"
> -    for iconv_link in $iconv_lib_list; do
> -      unset IFS
> -      iconv_lib="$iconv_ldflags $iconv_link"
> -      echo "looking at iconv in '$iconv_cflags' '$iconv_lib'" >>
> config.log
> -      if compile_prog "$iconv_cflags" "$iconv_lib" ; then
> -        iconv_found=yes
> -        break
> -      fi
> -    done
> -    if test "$iconv_found" = yes ; then
> -      break
> -    fi
> -  done
> -  if test "$iconv_found" = "yes" ; then
> -    iconv=yes
> -  else
> -    if test "$iconv" = "yes" ; then
> -      feature_not_found "iconv" "Install iconv devel"
> -    fi
> -    iconv=no
> -  fi
> -fi
> -
> -##########################################
> -# curses probe
> -if test "$iconv" = "no" ; then
> -  # curses will need iconv
> -  curses=no
> -fi
> -if test "$curses" != "no" ; then
> -  if test "$mingw32" = "yes" ; then
> -    curses_inc_list="$($pkg_config --cflags ncurses 2>/dev/null):"
> -    curses_lib_list="$($pkg_config --libs ncurses 2>/dev/null):-
> lpdcurses"
> -  else
> -    curses_inc_list="$($pkg_config --cflags ncursesw 2>/dev/null):-
> I/usr/include/ncursesw:"
> -    curses_lib_list="$($pkg_config --libs ncursesw 2>/dev/null):-
> lncursesw:-lcursesw"
> -  fi
> -  curses_found=no
> -  cat > $TMPC << EOF
> -#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;
> -}
> -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
> -      if compile_prog "$curses_inc" "$curses_lib" ; then
> -        curses_found=yes
> -        break
> -      fi
> -    done
> -    if test "$curses_found" = yes ; then
> -      break
> -    fi
> -  done
> -  unset IFS
> -  if test "$curses_found" = "yes" ; then
> -    curses=yes
> -  else
> -    if test "$curses" = "yes" ; then
> -      feature_not_found "curses" "Install ncurses devel"
> -    fi
> -    curses=no
> -  fi
> -fi
> -
>  ##########################################
>  # curl probe
>  if test "$curl" != "no" ; then
> @@ -6200,16 +6105,6 @@ if test "$have_x11" = "yes" && test
> "$need_x11" = "yes"; then
>    echo "X11_CFLAGS=$x11_cflags" >> $config_host_mak
>    echo "X11_LIBS=$x11_libs" >> $config_host_mak
>  fi
> -if test "$iconv" = "yes" ; then
> -  echo "CONFIG_ICONV=y" >> $config_host_mak
> -  echo "ICONV_CFLAGS=$iconv_cflags" >> $config_host_mak
> -  echo "ICONV_LIBS=$iconv_lib" >> $config_host_mak
> -fi
> -if test "$curses" = "yes" ; then
> -  echo "CONFIG_CURSES=y" >> $config_host_mak
> -  echo "CURSES_CFLAGS=$curses_inc" >> $config_host_mak
> -  echo "CURSES_LIBS=$curses_lib" >> $config_host_mak
> -fi
>  if test "$pipe2" = "yes" ; then
>    echo "CONFIG_PIPE2=y" >> $config_host_mak
>  fi
> @@ -7181,6 +7076,7 @@ NINJA=${ninja:-$PWD/ninjatool} $meson setup \
>          -Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg
> -Dvnc_png=$vnc_png \
>          -Dgettext=$gettext -Dxkbcommon=$xkbcommon -Du2f=$u2f \
>          -Dcapstone=$capstone -Dslirp=$slirp -Dfdt=$fdt \
> +        -Diconv=$iconv -Dcurses=$curses \
>          $cross_arg \
>          "$PWD" "$source_path"
>  
> diff --git a/meson_options.txt b/meson_options.txt
> index 1d3c94840a90..e6cb1e589b4e 100644
> --- a/meson_options.txt
> +++ b/meson_options.txt
> @@ -32,6 +32,10 @@ option('cocoa', type : 'feature', value : 'auto',
>         description: 'Cocoa user interface (macOS only)')
>  option('mpath', type : 'feature', value : 'auto',
>         description: 'Multipath persistent reservation passthrough')
> +option('iconv', type : 'feature', value : 'auto',
> +       description: 'Font glyph conversion support')
> +option('curses', type : 'feature', value : 'auto',
> +       description: 'curses UI')
>  option('sdl', type : 'feature', value : 'auto',
>         description: 'SDL user interface')
>  option('sdl_image', type : 'feature', value : 'auto',
> diff --git a/meson.build b/meson.build
> index ad6c7c90c787..1a4a48249243 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -426,6 +426,74 @@ if targetos == 'linux' and have_tools and not
> get_option('mpath').disabled()
>    endif
>  endif
>  
> +iconv = not_found
> +if not get_option('iconv').disabled()
> +  libiconv = cc.find_library('iconv',
> +                             required: false,
> +                             static: enable_static)
> +  if libiconv.found()
> +    if cc.links('''
> +      #include <iconv.h>
> +      int main(void) {
> +        iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
> +        return conv != (iconv_t) -1;
> +      }''', dependencies: [libiconv])
> +      iconv = declare_dependency(dependencies: [libiconv])
> +    endif
> +  endif
> +endif
> +if get_option('iconv').enabled() and not iconv.found()
> +  error('Cannot detect iconv API')
> +endif
> +
> +curses = not_found
> +if iconv.found() and not get_option('curses').disabled()
> +  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 get_option('curses').enabled() and not curses.found()
> +  if not iconv.found()
> +    error('Cannot detect iconv API')
> +  else
> +    error('Cannot detect curses API')
> +  endif
> +endif
> +
>  brlapi = not_found
>  if 'CONFIG_BRLAPI' in config_host
>    brlapi = declare_dependency(link_args:
> config_host['BRLAPI_LIBS'].split())
> @@ -504,16 +572,6 @@ if 'CONFIG_X11' in config_host
>    x11 = declare_dependency(compile_args:
> config_host['X11_CFLAGS'].split(),
>                             link_args:
> config_host['X11_LIBS'].split())
>  endif
> -curses = not_found
> -if 'CONFIG_CURSES' in config_host
> -  curses = declare_dependency(compile_args:
> config_host['CURSES_CFLAGS'].split(),
> -                              link_args:
> config_host['CURSES_LIBS'].split())
> -endif
> -iconv = not_found
> -if 'CONFIG_ICONV' in config_host
> -  iconv = declare_dependency(compile_args:
> config_host['ICONV_CFLAGS'].split(),
> -                             link_args:
> config_host['ICONV_LIBS'].split())
> -endif
>  vnc = not_found
>  png = not_found
>  jpeg = not_found
> @@ -622,6 +680,7 @@ config_host_data.set('CONFIG_COCOA',
> cocoa.found())
>  config_host_data.set('CONFIG_LIBUDEV', libudev.found())
>  config_host_data.set('CONFIG_MPATH', mpathpersist.found())
>  config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
> +config_host_data.set('CONFIG_CURSES', curses.found())
>  config_host_data.set('CONFIG_SDL', sdl.found())
>  config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
>  config_host_data.set('CONFIG_VNC', vnc.found())
> @@ -1905,8 +1964,8 @@ if config_host.has_key('CONFIG_NETTLE')
>  endif
>  summary_info +=
> {'libtasn1':          config_host.has_key('CONFIG_TASN1')}
>  summary_info +=
> {'PAM':               config_host.has_key('CONFIG_AUTH_PAM')}
> -summary_info += {'iconv
> support':     config_host.has_key('CONFIG_ICONV')}
> -summary_info += {'curses
> support':    config_host.has_key('CONFIG_CURSES')}
> +summary_info += {'iconv support':     iconv.found()}
> +summary_info += {'curses support':    curses.found()}
>  # TODO: add back version
>  summary_info += {'virgl
> support':     config_host.has_key('CONFIG_VIRGL')}
>  summary_info += {'curl
> support':      config_host.has_key('CONFIG_CURL')}
> diff --git a/ui/meson.build b/ui/meson.build
> index 8a080c38e325..78ad792ffb8d 100644
> --- a/ui/meson.build
> +++ b/ui/meson.build
> @@ -39,7 +39,7 @@ specific_ss.add(when: ['CONFIG_SOFTMMU'], if_true:
> opengl)
>  
>  ui_modules = {}
>  
> -if config_host.has_key('CONFIG_CURSES')
> +if curses.found()
>    curses_ss = ss.source_set()
>    curses_ss.add(when: [curses, iconv], if_true: [files('curses.c'),
> pixman])
>    ui_modules += {'curses' : curses_ss}

I find that this change causes a configure failure when choosing either
--enable-iconv or --enable-curses as follows:

../configure --enable-curses results in 
../meson.build:491:4: ERROR: Problem encountered: Cannot detect iconv
API

../configure --enable-iconv results in 
../meson.build:446:2: ERROR: Problem encountered: Cannot detect iconv
API

I haven't yet learned meson well enough to identify further what is
going wrong.

Can someone take a look at what might be failing, or give me some clue
what I can check on or report on from my end which would be helpful to
resolve this?
I am running openSUSE Tumbleweed, by the way.

Thanks,

Bruce



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

* Re: [PULL 5/9] configure: Fixes ncursesw detection under msys2/mingw by convert them to meson
  2020-10-14 18:22   ` Bruce Rogers
@ 2020-10-14 19:16     ` 罗勇刚(Yonggang Luo)
  2020-10-14 19:17     ` 罗勇刚(Yonggang Luo)
  1 sibling, 0 replies; 15+ messages in thread
From: 罗勇刚(Yonggang Luo) @ 2020-10-14 19:16 UTC (permalink / raw)
  To: Bruce Rogers; +Cc: Stefan Weil, Gerd Hoffmann, qemu-level

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

Because you didn't install the iconv.

On Thu, Oct 15, 2020 at 2:22 AM Bruce Rogers <brogers@suse.com> wrote:
>
> On Wed, 2020-10-14 at 10:21 +0200, Gerd Hoffmann wrote:
> > From: Yonggang Luo <luoyonggang@gmail.com>
> >
> > The mingw pkg-config are showing following absolute path and contains
> > : as the separator,
> >
> > -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -IC:/CI-
> > Tools/msys64/mingw64/include/ncursesw:-I/usr/include/ncursesw:
> > -DNCURSES_WIDECHAR -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -IC
> > -pipe -lncursesw -lgnurx -ltre -lintl -liconv
> > -DNCURSES_WIDECHAR -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -IC
> > -lncursesw
> > -DNCURSES_WIDECHAR -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -IC
> > -lcursesw
> > -DNCURSES_WIDECHAR /CI-Tools/msys64/mingw64/include/ncursesw -pipe
> > -lncursesw -lgnurx -ltre -lintl -liconv
> > -DNCURSES_WIDECHAR /CI-Tools/msys64/mingw64/include/ncursesw
> > -lncursesw
> > -DNCURSES_WIDECHAR /CI-Tools/msys64/mingw64/include/ncursesw
> > -lcursesw
> > -DNCURSES_WIDECHAR -I/usr/include/ncursesw -pipe -lncursesw -lgnurx
> > -ltre -lintl -liconv
> > -DNCURSES_WIDECHAR -I/usr/include/ncursesw -lncursesw
> > -DNCURSES_WIDECHAR -I/usr/include/ncursesw -lcursesw
> >
> > Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
> > Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
> > Message-id: 20201012234348.1427-6-luoyonggang@gmail.com
> > Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> > ---
> >  configure         | 118 +++-----------------------------------------
> > --
> >  meson_options.txt |   4 ++
> >  meson.build       |  83 +++++++++++++++++++++++++++-----
> >  ui/meson.build    |   2 +-
> >  4 files changed, 83 insertions(+), 124 deletions(-)
> >
> > diff --git a/configure b/configure
> > index 9a87685517ee..f839c2a557c3 100755
> > --- a/configure
> > +++ b/configure
> > @@ -295,7 +295,8 @@ unset target_list_exclude
> >
> >  brlapi=""
> >  curl=""
> > -curses=""
> > +iconv="auto"
> > +curses="auto"
> >  docs=""
> >  fdt="auto"
> >  netmap="no"
> > @@ -1173,13 +1174,13 @@ for opt do
> >    ;;
> >    --disable-safe-stack) safe_stack="no"
> >    ;;
> > -  --disable-curses) curses="no"
> > +  --disable-curses) curses="disabled"
> >    ;;
> > -  --enable-curses) curses="yes"
> > +  --enable-curses) curses="enabled"
> >    ;;
> > -  --disable-iconv) iconv="no"
> > +  --disable-iconv) iconv="disabled"
> >    ;;
> > -  --enable-iconv) iconv="yes"
> > +  --enable-iconv) iconv="enabled"
> >    ;;
> >    --disable-curl) curl="no"
> >    ;;
> > @@ -3440,102 +3441,6 @@ EOF
> >    fi
> >  fi
> >
> > -##########################################
> > -# iconv probe
> > -if test "$iconv" != "no" ; then
> > -  cat > $TMPC << EOF
> > -#include <iconv.h>
> > -int main(void) {
> > -  iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
> > -  return conv != (iconv_t) -1;
> > -}
> > -EOF
> > -  iconv_prefix_list="/usr/local:/usr"
> > -  iconv_lib_list=":-liconv"
> > -  IFS=:
> > -  for iconv_prefix in $iconv_prefix_list; do
> > -    IFS=:
> > -    iconv_cflags="-I$iconv_prefix/include"
> > -    iconv_ldflags="-L$iconv_prefix/lib"
> > -    for iconv_link in $iconv_lib_list; do
> > -      unset IFS
> > -      iconv_lib="$iconv_ldflags $iconv_link"
> > -      echo "looking at iconv in '$iconv_cflags' '$iconv_lib'" >>
> > config.log
> > -      if compile_prog "$iconv_cflags" "$iconv_lib" ; then
> > -        iconv_found=yes
> > -        break
> > -      fi
> > -    done
> > -    if test "$iconv_found" = yes ; then
> > -      break
> > -    fi
> > -  done
> > -  if test "$iconv_found" = "yes" ; then
> > -    iconv=yes
> > -  else
> > -    if test "$iconv" = "yes" ; then
> > -      feature_not_found "iconv" "Install iconv devel"
> > -    fi
> > -    iconv=no
> > -  fi
> > -fi
> > -
> > -##########################################
> > -# curses probe
> > -if test "$iconv" = "no" ; then
> > -  # curses will need iconv
> > -  curses=no
> > -fi
> > -if test "$curses" != "no" ; then
> > -  if test "$mingw32" = "yes" ; then
> > -    curses_inc_list="$($pkg_config --cflags ncurses 2>/dev/null):"
> > -    curses_lib_list="$($pkg_config --libs ncurses 2>/dev/null):-
> > lpdcurses"
> > -  else
> > -    curses_inc_list="$($pkg_config --cflags ncursesw 2>/dev/null):-
> > I/usr/include/ncursesw:"
> > -    curses_lib_list="$($pkg_config --libs ncursesw 2>/dev/null):-
> > lncursesw:-lcursesw"
> > -  fi
> > -  curses_found=no
> > -  cat > $TMPC << EOF
> > -#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;
> > -}
> > -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
> > -      if compile_prog "$curses_inc" "$curses_lib" ; then
> > -        curses_found=yes
> > -        break
> > -      fi
> > -    done
> > -    if test "$curses_found" = yes ; then
> > -      break
> > -    fi
> > -  done
> > -  unset IFS
> > -  if test "$curses_found" = "yes" ; then
> > -    curses=yes
> > -  else
> > -    if test "$curses" = "yes" ; then
> > -      feature_not_found "curses" "Install ncurses devel"
> > -    fi
> > -    curses=no
> > -  fi
> > -fi
> > -
> >  ##########################################
> >  # curl probe
> >  if test "$curl" != "no" ; then
> > @@ -6200,16 +6105,6 @@ if test "$have_x11" = "yes" && test
> > "$need_x11" = "yes"; then
> >    echo "X11_CFLAGS=$x11_cflags" >> $config_host_mak
> >    echo "X11_LIBS=$x11_libs" >> $config_host_mak
> >  fi
> > -if test "$iconv" = "yes" ; then
> > -  echo "CONFIG_ICONV=y" >> $config_host_mak
> > -  echo "ICONV_CFLAGS=$iconv_cflags" >> $config_host_mak
> > -  echo "ICONV_LIBS=$iconv_lib" >> $config_host_mak
> > -fi
> > -if test "$curses" = "yes" ; then
> > -  echo "CONFIG_CURSES=y" >> $config_host_mak
> > -  echo "CURSES_CFLAGS=$curses_inc" >> $config_host_mak
> > -  echo "CURSES_LIBS=$curses_lib" >> $config_host_mak
> > -fi
> >  if test "$pipe2" = "yes" ; then
> >    echo "CONFIG_PIPE2=y" >> $config_host_mak
> >  fi
> > @@ -7181,6 +7076,7 @@ NINJA=${ninja:-$PWD/ninjatool} $meson setup \
> >          -Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg
> > -Dvnc_png=$vnc_png \
> >          -Dgettext=$gettext -Dxkbcommon=$xkbcommon -Du2f=$u2f \
> >          -Dcapstone=$capstone -Dslirp=$slirp -Dfdt=$fdt \
> > +        -Diconv=$iconv -Dcurses=$curses \
> >          $cross_arg \
> >          "$PWD" "$source_path"
> >
> > diff --git a/meson_options.txt b/meson_options.txt
> > index 1d3c94840a90..e6cb1e589b4e 100644
> > --- a/meson_options.txt
> > +++ b/meson_options.txt
> > @@ -32,6 +32,10 @@ option('cocoa', type : 'feature', value : 'auto',
> >         description: 'Cocoa user interface (macOS only)')
> >  option('mpath', type : 'feature', value : 'auto',
> >         description: 'Multipath persistent reservation passthrough')
> > +option('iconv', type : 'feature', value : 'auto',
> > +       description: 'Font glyph conversion support')
> > +option('curses', type : 'feature', value : 'auto',
> > +       description: 'curses UI')
> >  option('sdl', type : 'feature', value : 'auto',
> >         description: 'SDL user interface')
> >  option('sdl_image', type : 'feature', value : 'auto',
> > diff --git a/meson.build b/meson.build
> > index ad6c7c90c787..1a4a48249243 100644
> > --- a/meson.build
> > +++ b/meson.build
> > @@ -426,6 +426,74 @@ if targetos == 'linux' and have_tools and not
> > get_option('mpath').disabled()
> >    endif
> >  endif
> >
> > +iconv = not_found
> > +if not get_option('iconv').disabled()
> > +  libiconv = cc.find_library('iconv',
> > +                             required: false,
> > +                             static: enable_static)
> > +  if libiconv.found()
> > +    if cc.links('''
> > +      #include <iconv.h>
> > +      int main(void) {
> > +        iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
> > +        return conv != (iconv_t) -1;
> > +      }''', dependencies: [libiconv])
> > +      iconv = declare_dependency(dependencies: [libiconv])
> > +    endif
> > +  endif
> > +endif
> > +if get_option('iconv').enabled() and not iconv.found()
> > +  error('Cannot detect iconv API')
> > +endif
> > +
> > +curses = not_found
> > +if iconv.found() and not get_option('curses').disabled()
> > +  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 get_option('curses').enabled() and not curses.found()
> > +  if not iconv.found()
> > +    error('Cannot detect iconv API')
> > +  else
> > +    error('Cannot detect curses API')
> > +  endif
> > +endif
> > +
> >  brlapi = not_found
> >  if 'CONFIG_BRLAPI' in config_host
> >    brlapi = declare_dependency(link_args:
> > config_host['BRLAPI_LIBS'].split())
> > @@ -504,16 +572,6 @@ if 'CONFIG_X11' in config_host
> >    x11 = declare_dependency(compile_args:
> > config_host['X11_CFLAGS'].split(),
> >                             link_args:
> > config_host['X11_LIBS'].split())
> >  endif
> > -curses = not_found
> > -if 'CONFIG_CURSES' in config_host
> > -  curses = declare_dependency(compile_args:
> > config_host['CURSES_CFLAGS'].split(),
> > -                              link_args:
> > config_host['CURSES_LIBS'].split())
> > -endif
> > -iconv = not_found
> > -if 'CONFIG_ICONV' in config_host
> > -  iconv = declare_dependency(compile_args:
> > config_host['ICONV_CFLAGS'].split(),
> > -                             link_args:
> > config_host['ICONV_LIBS'].split())
> > -endif
> >  vnc = not_found
> >  png = not_found
> >  jpeg = not_found
> > @@ -622,6 +680,7 @@ config_host_data.set('CONFIG_COCOA',
> > cocoa.found())
> >  config_host_data.set('CONFIG_LIBUDEV', libudev.found())
> >  config_host_data.set('CONFIG_MPATH', mpathpersist.found())
> >  config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
> > +config_host_data.set('CONFIG_CURSES', curses.found())
> >  config_host_data.set('CONFIG_SDL', sdl.found())
> >  config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
> >  config_host_data.set('CONFIG_VNC', vnc.found())
> > @@ -1905,8 +1964,8 @@ if config_host.has_key('CONFIG_NETTLE')
> >  endif
> >  summary_info +=
> > {'libtasn1':          config_host.has_key('CONFIG_TASN1')}
> >  summary_info +=
> > {'PAM':               config_host.has_key('CONFIG_AUTH_PAM')}
> > -summary_info += {'iconv
> > support':     config_host.has_key('CONFIG_ICONV')}
> > -summary_info += {'curses
> > support':    config_host.has_key('CONFIG_CURSES')}
> > +summary_info += {'iconv support':     iconv.found()}
> > +summary_info += {'curses support':    curses.found()}
> >  # TODO: add back version
> >  summary_info += {'virgl
> > support':     config_host.has_key('CONFIG_VIRGL')}
> >  summary_info += {'curl
> > support':      config_host.has_key('CONFIG_CURL')}
> > diff --git a/ui/meson.build b/ui/meson.build
> > index 8a080c38e325..78ad792ffb8d 100644
> > --- a/ui/meson.build
> > +++ b/ui/meson.build
> > @@ -39,7 +39,7 @@ specific_ss.add(when: ['CONFIG_SOFTMMU'], if_true:
> > opengl)
> >
> >  ui_modules = {}
> >
> > -if config_host.has_key('CONFIG_CURSES')
> > +if curses.found()
> >    curses_ss = ss.source_set()
> >    curses_ss.add(when: [curses, iconv], if_true: [files('curses.c'),
> > pixman])
> >    ui_modules += {'curses' : curses_ss}
>
> I find that this change causes a configure failure when choosing either
> --enable-iconv or --enable-curses as follows:
>
> ../configure --enable-curses results in
> ../meson.build:491:4: ERROR: Problem encountered: Cannot detect iconv
> API
>
> ../configure --enable-iconv results in
> ../meson.build:446:2: ERROR: Problem encountered: Cannot detect iconv
> API
>
> I haven't yet learned meson well enough to identify further what is
> going wrong.
>
> Can someone take a look at what might be failing, or give me some clue
> what I can check on or report on from my end which would be helpful to
> resolve this?
> I am running openSUSE Tumbleweed, by the way.
>
> Thanks,
>
> Bruce
>


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

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

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

* Re: [PULL 5/9] configure: Fixes ncursesw detection under msys2/mingw by convert them to meson
  2020-10-14 18:22   ` Bruce Rogers
  2020-10-14 19:16     ` 罗勇刚(Yonggang Luo)
@ 2020-10-14 19:17     ` 罗勇刚(Yonggang Luo)
  2020-10-14 20:10       ` Bruce Rogers
  1 sibling, 1 reply; 15+ messages in thread
From: 罗勇刚(Yonggang Luo) @ 2020-10-14 19:17 UTC (permalink / raw)
  To: Bruce Rogers; +Cc: Stefan Weil, Gerd Hoffmann, qemu-level

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

If iconv installed then it's the meson's probme that didn't found the iconv
properly
On Thu, Oct 15, 2020 at 2:22 AM Bruce Rogers <brogers@suse.com> wrote:
>
> On Wed, 2020-10-14 at 10:21 +0200, Gerd Hoffmann wrote:
> > From: Yonggang Luo <luoyonggang@gmail.com>
> >
> > The mingw pkg-config are showing following absolute path and contains
> > : as the separator,
> >
> > -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -IC:/CI-
> > Tools/msys64/mingw64/include/ncursesw:-I/usr/include/ncursesw:
> > -DNCURSES_WIDECHAR -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -IC
> > -pipe -lncursesw -lgnurx -ltre -lintl -liconv
> > -DNCURSES_WIDECHAR -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -IC
> > -lncursesw
> > -DNCURSES_WIDECHAR -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -IC
> > -lcursesw
> > -DNCURSES_WIDECHAR /CI-Tools/msys64/mingw64/include/ncursesw -pipe
> > -lncursesw -lgnurx -ltre -lintl -liconv
> > -DNCURSES_WIDECHAR /CI-Tools/msys64/mingw64/include/ncursesw
> > -lncursesw
> > -DNCURSES_WIDECHAR /CI-Tools/msys64/mingw64/include/ncursesw
> > -lcursesw
> > -DNCURSES_WIDECHAR -I/usr/include/ncursesw -pipe -lncursesw -lgnurx
> > -ltre -lintl -liconv
> > -DNCURSES_WIDECHAR -I/usr/include/ncursesw -lncursesw
> > -DNCURSES_WIDECHAR -I/usr/include/ncursesw -lcursesw
> >
> > Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
> > Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
> > Message-id: 20201012234348.1427-6-luoyonggang@gmail.com
> > Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> > ---
> >  configure         | 118 +++-----------------------------------------
> > --
> >  meson_options.txt |   4 ++
> >  meson.build       |  83 +++++++++++++++++++++++++++-----
> >  ui/meson.build    |   2 +-
> >  4 files changed, 83 insertions(+), 124 deletions(-)
> >
> > diff --git a/configure b/configure
> > index 9a87685517ee..f839c2a557c3 100755
> > --- a/configure
> > +++ b/configure
> > @@ -295,7 +295,8 @@ unset target_list_exclude
> >
> >  brlapi=""
> >  curl=""
> > -curses=""
> > +iconv="auto"
> > +curses="auto"
> >  docs=""
> >  fdt="auto"
> >  netmap="no"
> > @@ -1173,13 +1174,13 @@ for opt do
> >    ;;
> >    --disable-safe-stack) safe_stack="no"
> >    ;;
> > -  --disable-curses) curses="no"
> > +  --disable-curses) curses="disabled"
> >    ;;
> > -  --enable-curses) curses="yes"
> > +  --enable-curses) curses="enabled"
> >    ;;
> > -  --disable-iconv) iconv="no"
> > +  --disable-iconv) iconv="disabled"
> >    ;;
> > -  --enable-iconv) iconv="yes"
> > +  --enable-iconv) iconv="enabled"
> >    ;;
> >    --disable-curl) curl="no"
> >    ;;
> > @@ -3440,102 +3441,6 @@ EOF
> >    fi
> >  fi
> >
> > -##########################################
> > -# iconv probe
> > -if test "$iconv" != "no" ; then
> > -  cat > $TMPC << EOF
> > -#include <iconv.h>
> > -int main(void) {
> > -  iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
> > -  return conv != (iconv_t) -1;
> > -}
> > -EOF
> > -  iconv_prefix_list="/usr/local:/usr"
> > -  iconv_lib_list=":-liconv"
> > -  IFS=:
> > -  for iconv_prefix in $iconv_prefix_list; do
> > -    IFS=:
> > -    iconv_cflags="-I$iconv_prefix/include"
> > -    iconv_ldflags="-L$iconv_prefix/lib"
> > -    for iconv_link in $iconv_lib_list; do
> > -      unset IFS
> > -      iconv_lib="$iconv_ldflags $iconv_link"
> > -      echo "looking at iconv in '$iconv_cflags' '$iconv_lib'" >>
> > config.log
> > -      if compile_prog "$iconv_cflags" "$iconv_lib" ; then
> > -        iconv_found=yes
> > -        break
> > -      fi
> > -    done
> > -    if test "$iconv_found" = yes ; then
> > -      break
> > -    fi
> > -  done
> > -  if test "$iconv_found" = "yes" ; then
> > -    iconv=yes
> > -  else
> > -    if test "$iconv" = "yes" ; then
> > -      feature_not_found "iconv" "Install iconv devel"
> > -    fi
> > -    iconv=no
> > -  fi
> > -fi
> > -
> > -##########################################
> > -# curses probe
> > -if test "$iconv" = "no" ; then
> > -  # curses will need iconv
> > -  curses=no
> > -fi
> > -if test "$curses" != "no" ; then
> > -  if test "$mingw32" = "yes" ; then
> > -    curses_inc_list="$($pkg_config --cflags ncurses 2>/dev/null):"
> > -    curses_lib_list="$($pkg_config --libs ncurses 2>/dev/null):-
> > lpdcurses"
> > -  else
> > -    curses_inc_list="$($pkg_config --cflags ncursesw 2>/dev/null):-
> > I/usr/include/ncursesw:"
> > -    curses_lib_list="$($pkg_config --libs ncursesw 2>/dev/null):-
> > lncursesw:-lcursesw"
> > -  fi
> > -  curses_found=no
> > -  cat > $TMPC << EOF
> > -#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;
> > -}
> > -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
> > -      if compile_prog "$curses_inc" "$curses_lib" ; then
> > -        curses_found=yes
> > -        break
> > -      fi
> > -    done
> > -    if test "$curses_found" = yes ; then
> > -      break
> > -    fi
> > -  done
> > -  unset IFS
> > -  if test "$curses_found" = "yes" ; then
> > -    curses=yes
> > -  else
> > -    if test "$curses" = "yes" ; then
> > -      feature_not_found "curses" "Install ncurses devel"
> > -    fi
> > -    curses=no
> > -  fi
> > -fi
> > -
> >  ##########################################
> >  # curl probe
> >  if test "$curl" != "no" ; then
> > @@ -6200,16 +6105,6 @@ if test "$have_x11" = "yes" && test
> > "$need_x11" = "yes"; then
> >    echo "X11_CFLAGS=$x11_cflags" >> $config_host_mak
> >    echo "X11_LIBS=$x11_libs" >> $config_host_mak
> >  fi
> > -if test "$iconv" = "yes" ; then
> > -  echo "CONFIG_ICONV=y" >> $config_host_mak
> > -  echo "ICONV_CFLAGS=$iconv_cflags" >> $config_host_mak
> > -  echo "ICONV_LIBS=$iconv_lib" >> $config_host_mak
> > -fi
> > -if test "$curses" = "yes" ; then
> > -  echo "CONFIG_CURSES=y" >> $config_host_mak
> > -  echo "CURSES_CFLAGS=$curses_inc" >> $config_host_mak
> > -  echo "CURSES_LIBS=$curses_lib" >> $config_host_mak
> > -fi
> >  if test "$pipe2" = "yes" ; then
> >    echo "CONFIG_PIPE2=y" >> $config_host_mak
> >  fi
> > @@ -7181,6 +7076,7 @@ NINJA=${ninja:-$PWD/ninjatool} $meson setup \
> >          -Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg
> > -Dvnc_png=$vnc_png \
> >          -Dgettext=$gettext -Dxkbcommon=$xkbcommon -Du2f=$u2f \
> >          -Dcapstone=$capstone -Dslirp=$slirp -Dfdt=$fdt \
> > +        -Diconv=$iconv -Dcurses=$curses \
> >          $cross_arg \
> >          "$PWD" "$source_path"
> >
> > diff --git a/meson_options.txt b/meson_options.txt
> > index 1d3c94840a90..e6cb1e589b4e 100644
> > --- a/meson_options.txt
> > +++ b/meson_options.txt
> > @@ -32,6 +32,10 @@ option('cocoa', type : 'feature', value : 'auto',
> >         description: 'Cocoa user interface (macOS only)')
> >  option('mpath', type : 'feature', value : 'auto',
> >         description: 'Multipath persistent reservation passthrough')
> > +option('iconv', type : 'feature', value : 'auto',
> > +       description: 'Font glyph conversion support')
> > +option('curses', type : 'feature', value : 'auto',
> > +       description: 'curses UI')
> >  option('sdl', type : 'feature', value : 'auto',
> >         description: 'SDL user interface')
> >  option('sdl_image', type : 'feature', value : 'auto',
> > diff --git a/meson.build b/meson.build
> > index ad6c7c90c787..1a4a48249243 100644
> > --- a/meson.build
> > +++ b/meson.build
> > @@ -426,6 +426,74 @@ if targetos == 'linux' and have_tools and not
> > get_option('mpath').disabled()
> >    endif
> >  endif
> >
> > +iconv = not_found
> > +if not get_option('iconv').disabled()
> > +  libiconv = cc.find_library('iconv',
> > +                             required: false,
> > +                             static: enable_static)
> > +  if libiconv.found()
> > +    if cc.links('''
> > +      #include <iconv.h>
> > +      int main(void) {
> > +        iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
> > +        return conv != (iconv_t) -1;
> > +      }''', dependencies: [libiconv])
> > +      iconv = declare_dependency(dependencies: [libiconv])
> > +    endif
> > +  endif
> > +endif
> > +if get_option('iconv').enabled() and not iconv.found()
> > +  error('Cannot detect iconv API')
> > +endif
> > +
> > +curses = not_found
> > +if iconv.found() and not get_option('curses').disabled()
> > +  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 get_option('curses').enabled() and not curses.found()
> > +  if not iconv.found()
> > +    error('Cannot detect iconv API')
> > +  else
> > +    error('Cannot detect curses API')
> > +  endif
> > +endif
> > +
> >  brlapi = not_found
> >  if 'CONFIG_BRLAPI' in config_host
> >    brlapi = declare_dependency(link_args:
> > config_host['BRLAPI_LIBS'].split())
> > @@ -504,16 +572,6 @@ if 'CONFIG_X11' in config_host
> >    x11 = declare_dependency(compile_args:
> > config_host['X11_CFLAGS'].split(),
> >                             link_args:
> > config_host['X11_LIBS'].split())
> >  endif
> > -curses = not_found
> > -if 'CONFIG_CURSES' in config_host
> > -  curses = declare_dependency(compile_args:
> > config_host['CURSES_CFLAGS'].split(),
> > -                              link_args:
> > config_host['CURSES_LIBS'].split())
> > -endif
> > -iconv = not_found
> > -if 'CONFIG_ICONV' in config_host
> > -  iconv = declare_dependency(compile_args:
> > config_host['ICONV_CFLAGS'].split(),
> > -                             link_args:
> > config_host['ICONV_LIBS'].split())
> > -endif
> >  vnc = not_found
> >  png = not_found
> >  jpeg = not_found
> > @@ -622,6 +680,7 @@ config_host_data.set('CONFIG_COCOA',
> > cocoa.found())
> >  config_host_data.set('CONFIG_LIBUDEV', libudev.found())
> >  config_host_data.set('CONFIG_MPATH', mpathpersist.found())
> >  config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
> > +config_host_data.set('CONFIG_CURSES', curses.found())
> >  config_host_data.set('CONFIG_SDL', sdl.found())
> >  config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
> >  config_host_data.set('CONFIG_VNC', vnc.found())
> > @@ -1905,8 +1964,8 @@ if config_host.has_key('CONFIG_NETTLE')
> >  endif
> >  summary_info +=
> > {'libtasn1':          config_host.has_key('CONFIG_TASN1')}
> >  summary_info +=
> > {'PAM':               config_host.has_key('CONFIG_AUTH_PAM')}
> > -summary_info += {'iconv
> > support':     config_host.has_key('CONFIG_ICONV')}
> > -summary_info += {'curses
> > support':    config_host.has_key('CONFIG_CURSES')}
> > +summary_info += {'iconv support':     iconv.found()}
> > +summary_info += {'curses support':    curses.found()}
> >  # TODO: add back version
> >  summary_info += {'virgl
> > support':     config_host.has_key('CONFIG_VIRGL')}
> >  summary_info += {'curl
> > support':      config_host.has_key('CONFIG_CURL')}
> > diff --git a/ui/meson.build b/ui/meson.build
> > index 8a080c38e325..78ad792ffb8d 100644
> > --- a/ui/meson.build
> > +++ b/ui/meson.build
> > @@ -39,7 +39,7 @@ specific_ss.add(when: ['CONFIG_SOFTMMU'], if_true:
> > opengl)
> >
> >  ui_modules = {}
> >
> > -if config_host.has_key('CONFIG_CURSES')
> > +if curses.found()
> >    curses_ss = ss.source_set()
> >    curses_ss.add(when: [curses, iconv], if_true: [files('curses.c'),
> > pixman])
> >    ui_modules += {'curses' : curses_ss}
>
> I find that this change causes a configure failure when choosing either
> --enable-iconv or --enable-curses as follows:
>
> ../configure --enable-curses results in
> ../meson.build:491:4: ERROR: Problem encountered: Cannot detect iconv
> API
>
> ../configure --enable-iconv results in
> ../meson.build:446:2: ERROR: Problem encountered: Cannot detect iconv
> API
>
> I haven't yet learned meson well enough to identify further what is
> going wrong.
>
> Can someone take a look at what might be failing, or give me some clue
> what I can check on or report on from my end which would be helpful to
> resolve this?
> I am running openSUSE Tumbleweed, by the way.
>
> Thanks,
>
> Bruce
>


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

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

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

* Re: [PULL 5/9] configure: Fixes ncursesw detection under msys2/mingw by convert them to meson
  2020-10-14 19:17     ` 罗勇刚(Yonggang Luo)
@ 2020-10-14 20:10       ` Bruce Rogers
  0 siblings, 0 replies; 15+ messages in thread
From: Bruce Rogers @ 2020-10-14 20:10 UTC (permalink / raw)
  To: luoyonggang@gmail.com; +Cc: Stefan Weil, Gerd Hoffmann, qemu-level

I believe we shouldn't be conditionalizing running the iconv c program detection
on the iconv library having been found. At least that's my semi-uninformed
analysis so far.

- Bruce 

________________________________________
From: 罗勇刚(Yonggang Luo) <luoyonggang@gmail.com>
Sent: Wednesday, October 14, 2020 1:17 PM
To: Bruce Rogers
Cc: Gerd Hoffmann; qemu-level; Stefan Weil
Subject: Re: [PULL 5/9] configure: Fixes ncursesw detection under msys2/mingw by convert them to meson


If iconv installed then it's the meson's probme that didn't found the iconv properly
On Thu, Oct 15, 2020 at 2:22 AM Bruce Rogers <brogers@suse.com<mailto:brogers@suse.com>> wrote:
>
> On Wed, 2020-10-14 at 10:21 +0200, Gerd Hoffmann wrote:
> > From: Yonggang Luo <luoyonggang@gmail.com<mailto:luoyonggang@gmail.com>>
> >
> > The mingw pkg-config are showing following absolute path and contains
> > : as the separator,
> >
> > -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -IC:/CI-
> > Tools/msys64/mingw64/include/ncursesw:-I/usr/include/ncursesw:
> > -DNCURSES_WIDECHAR -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -IC
> > -pipe -lncursesw -lgnurx -ltre -lintl -liconv
> > -DNCURSES_WIDECHAR -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -IC
> > -lncursesw
> > -DNCURSES_WIDECHAR -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -IC
> > -lcursesw
> > -DNCURSES_WIDECHAR /CI-Tools/msys64/mingw64/include/ncursesw -pipe
> > -lncursesw -lgnurx -ltre -lintl -liconv
> > -DNCURSES_WIDECHAR /CI-Tools/msys64/mingw64/include/ncursesw
> > -lncursesw
> > -DNCURSES_WIDECHAR /CI-Tools/msys64/mingw64/include/ncursesw
> > -lcursesw
> > -DNCURSES_WIDECHAR -I/usr/include/ncursesw -pipe -lncursesw -lgnurx
> > -ltre -lintl -liconv
> > -DNCURSES_WIDECHAR -I/usr/include/ncursesw -lncursesw
> > -DNCURSES_WIDECHAR -I/usr/include/ncursesw -lcursesw
> >
> > Signed-off-by: Yonggang Luo <luoyonggang@gmail.com<mailto:luoyonggang@gmail.com>>
> > Reviewed-by: Gerd Hoffmann <kraxel@redhat.com<mailto:kraxel@redhat.com>>
> > Message-id: 20201012234348.1427-6-luoyonggang@gmail.com<mailto:20201012234348.1427-6-luoyonggang@gmail.com>
> > Signed-off-by: Gerd Hoffmann <kraxel@redhat.com<mailto:kraxel@redhat.com>>
> > ---
> >  configure         | 118 +++-----------------------------------------
> > --
> >  meson_options.txt |   4 ++
> >  meson.build       |  83 +++++++++++++++++++++++++++-----
> >  ui/meson.build    |   2 +-
> >  4 files changed, 83 insertions(+), 124 deletions(-)
> >
> > diff --git a/configure b/configure
> > index 9a87685517ee..f839c2a557c3 100755
> > --- a/configure
> > +++ b/configure
> > @@ -295,7 +295,8 @@ unset target_list_exclude
> >
> >  brlapi=""
> >  curl=""
> > -curses=""
> > +iconv="auto"
> > +curses="auto"
> >  docs=""
> >  fdt="auto"
> >  netmap="no"
> > @@ -1173,13 +1174,13 @@ for opt do
> >    ;;
> >    --disable-safe-stack) safe_stack="no"
> >    ;;
> > -  --disable-curses) curses="no"
> > +  --disable-curses) curses="disabled"
> >    ;;
> > -  --enable-curses) curses="yes"
> > +  --enable-curses) curses="enabled"
> >    ;;
> > -  --disable-iconv) iconv="no"
> > +  --disable-iconv) iconv="disabled"
> >    ;;
> > -  --enable-iconv) iconv="yes"
> > +  --enable-iconv) iconv="enabled"
> >    ;;
> >    --disable-curl) curl="no"
> >    ;;
> > @@ -3440,102 +3441,6 @@ EOF
> >    fi
> >  fi
> >
> > -##########################################
> > -# iconv probe
> > -if test "$iconv" != "no" ; then
> > -  cat > $TMPC << EOF
> > -#include <iconv.h>
> > -int main(void) {
> > -  iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
> > -  return conv != (iconv_t) -1;
> > -}
> > -EOF
> > -  iconv_prefix_list="/usr/local:/usr"
> > -  iconv_lib_list=":-liconv"
> > -  IFS=:
> > -  for iconv_prefix in $iconv_prefix_list; do
> > -    IFS=:
> > -    iconv_cflags="-I$iconv_prefix/include"
> > -    iconv_ldflags="-L$iconv_prefix/lib"
> > -    for iconv_link in $iconv_lib_list; do
> > -      unset IFS
> > -      iconv_lib="$iconv_ldflags $iconv_link"
> > -      echo "looking at iconv in '$iconv_cflags' '$iconv_lib'" >>
> > config.log
> > -      if compile_prog "$iconv_cflags" "$iconv_lib" ; then
> > -        iconv_found=yes
> > -        break
> > -      fi
> > -    done
> > -    if test "$iconv_found" = yes ; then
> > -      break
> > -    fi
> > -  done
> > -  if test "$iconv_found" = "yes" ; then
> > -    iconv=yes
> > -  else
> > -    if test "$iconv" = "yes" ; then
> > -      feature_not_found "iconv" "Install iconv devel"
> > -    fi
> > -    iconv=no
> > -  fi
> > -fi
> > -
> > -##########################################
> > -# curses probe
> > -if test "$iconv" = "no" ; then
> > -  # curses will need iconv
> > -  curses=no
> > -fi
> > -if test "$curses" != "no" ; then
> > -  if test "$mingw32" = "yes" ; then
> > -    curses_inc_list="$($pkg_config --cflags ncurses 2>/dev/null):"
> > -    curses_lib_list="$($pkg_config --libs ncurses 2>/dev/null):-
> > lpdcurses"
> > -  else
> > -    curses_inc_list="$($pkg_config --cflags ncursesw 2>/dev/null):-
> > I/usr/include/ncursesw:"
> > -    curses_lib_list="$($pkg_config --libs ncursesw 2>/dev/null):-
> > lncursesw:-lcursesw"
> > -  fi
> > -  curses_found=no
> > -  cat > $TMPC << EOF
> > -#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;
> > -}
> > -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
> > -      if compile_prog "$curses_inc" "$curses_lib" ; then
> > -        curses_found=yes
> > -        break
> > -      fi
> > -    done
> > -    if test "$curses_found" = yes ; then
> > -      break
> > -    fi
> > -  done
> > -  unset IFS
> > -  if test "$curses_found" = "yes" ; then
> > -    curses=yes
> > -  else
> > -    if test "$curses" = "yes" ; then
> > -      feature_not_found "curses" "Install ncurses devel"
> > -    fi
> > -    curses=no
> > -  fi
> > -fi
> > -
> >  ##########################################
> >  # curl probe
> >  if test "$curl" != "no" ; then
> > @@ -6200,16 +6105,6 @@ if test "$have_x11" = "yes" && test
> > "$need_x11" = "yes"; then
> >    echo "X11_CFLAGS=$x11_cflags" >> $config_host_mak
> >    echo "X11_LIBS=$x11_libs" >> $config_host_mak
> >  fi
> > -if test "$iconv" = "yes" ; then
> > -  echo "CONFIG_ICONV=y" >> $config_host_mak
> > -  echo "ICONV_CFLAGS=$iconv_cflags" >> $config_host_mak
> > -  echo "ICONV_LIBS=$iconv_lib" >> $config_host_mak
> > -fi
> > -if test "$curses" = "yes" ; then
> > -  echo "CONFIG_CURSES=y" >> $config_host_mak
> > -  echo "CURSES_CFLAGS=$curses_inc" >> $config_host_mak
> > -  echo "CURSES_LIBS=$curses_lib" >> $config_host_mak
> > -fi
> >  if test "$pipe2" = "yes" ; then
> >    echo "CONFIG_PIPE2=y" >> $config_host_mak
> >  fi
> > @@ -7181,6 +7076,7 @@ NINJA=${ninja:-$PWD/ninjatool} $meson setup \
> >          -Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg
> > -Dvnc_png=$vnc_png \
> >          -Dgettext=$gettext -Dxkbcommon=$xkbcommon -Du2f=$u2f \
> >          -Dcapstone=$capstone -Dslirp=$slirp -Dfdt=$fdt \
> > +        -Diconv=$iconv -Dcurses=$curses \
> >          $cross_arg \
> >          "$PWD" "$source_path"
> >
> > diff --git a/meson_options.txt b/meson_options.txt
> > index 1d3c94840a90..e6cb1e589b4e 100644
> > --- a/meson_options.txt
> > +++ b/meson_options.txt
> > @@ -32,6 +32,10 @@ option('cocoa', type : 'feature', value : 'auto',
> >         description: 'Cocoa user interface (macOS only)')
> >  option('mpath', type : 'feature', value : 'auto',
> >         description: 'Multipath persistent reservation passthrough')
> > +option('iconv', type : 'feature', value : 'auto',
> > +       description: 'Font glyph conversion support')
> > +option('curses', type : 'feature', value : 'auto',
> > +       description: 'curses UI')
> >  option('sdl', type : 'feature', value : 'auto',
> >         description: 'SDL user interface')
> >  option('sdl_image', type : 'feature', value : 'auto',
> > diff --git a/meson.build b/meson.build
> > index ad6c7c90c787..1a4a48249243 100644
> > --- a/meson.build
> > +++ b/meson.build
> > @@ -426,6 +426,74 @@ if targetos == 'linux' and have_tools and not
> > get_option('mpath').disabled()
> >    endif
> >  endif
> >
> > +iconv = not_found
> > +if not get_option('iconv').disabled()
> > +  libiconv = cc.find_library('iconv',
> > +                             required: false,
> > +                             static: enable_static)
> > +  if libiconv.found()
> > +    if cc.links('''
> > +      #include <iconv.h>
> > +      int main(void) {
> > +        iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
> > +        return conv != (iconv_t) -1;
> > +      }''', dependencies: [libiconv])
> > +      iconv = declare_dependency(dependencies: [libiconv])
> > +    endif
> > +  endif
> > +endif
> > +if get_option('iconv').enabled() and not iconv.found()
> > +  error('Cannot detect iconv API')
> > +endif
> > +
> > +curses = not_found
> > +if iconv.found() and not get_option('curses').disabled()
> > +  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 get_option('curses').enabled() and not curses.found()
> > +  if not iconv.found()
> > +    error('Cannot detect iconv API')
> > +  else
> > +    error('Cannot detect curses API')
> > +  endif
> > +endif
> > +
> >  brlapi = not_found
> >  if 'CONFIG_BRLAPI' in config_host
> >    brlapi = declare_dependency(link_args:
> > config_host['BRLAPI_LIBS'].split())
> > @@ -504,16 +572,6 @@ if 'CONFIG_X11' in config_host
> >    x11 = declare_dependency(compile_args:
> > config_host['X11_CFLAGS'].split(),
> >                             link_args:
> > config_host['X11_LIBS'].split())
> >  endif
> > -curses = not_found
> > -if 'CONFIG_CURSES' in config_host
> > -  curses = declare_dependency(compile_args:
> > config_host['CURSES_CFLAGS'].split(),
> > -                              link_args:
> > config_host['CURSES_LIBS'].split())
> > -endif
> > -iconv = not_found
> > -if 'CONFIG_ICONV' in config_host
> > -  iconv = declare_dependency(compile_args:
> > config_host['ICONV_CFLAGS'].split(),
> > -                             link_args:
> > config_host['ICONV_LIBS'].split())
> > -endif
> >  vnc = not_found
> >  png = not_found
> >  jpeg = not_found
> > @@ -622,6 +680,7 @@ config_host_data.set('CONFIG_COCOA',
> > cocoa.found())
> >  config_host_data.set('CONFIG_LIBUDEV', libudev.found())
> >  config_host_data.set('CONFIG_MPATH', mpathpersist.found())
> >  config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
> > +config_host_data.set('CONFIG_CURSES', curses.found())
> >  config_host_data.set('CONFIG_SDL', sdl.found())
> >  config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
> >  config_host_data.set('CONFIG_VNC', vnc.found())
> > @@ -1905,8 +1964,8 @@ if config_host.has_key('CONFIG_NETTLE')
> >  endif
> >  summary_info +=
> > {'libtasn1':          config_host.has_key('CONFIG_TASN1')}
> >  summary_info +=
> > {'PAM':               config_host.has_key('CONFIG_AUTH_PAM')}
> > -summary_info += {'iconv
> > support':     config_host.has_key('CONFIG_ICONV')}
> > -summary_info += {'curses
> > support':    config_host.has_key('CONFIG_CURSES')}
> > +summary_info += {'iconv support':     iconv.found()}
> > +summary_info += {'curses support':    curses.found()}
> >  # TODO: add back version
> >  summary_info += {'virgl
> > support':     config_host.has_key('CONFIG_VIRGL')}
> >  summary_info += {'curl
> > support':      config_host.has_key('CONFIG_CURL')}
> > diff --git a/ui/meson.build b/ui/meson.build
> > index 8a080c38e325..78ad792ffb8d 100644
> > --- a/ui/meson.build
> > +++ b/ui/meson.build
> > @@ -39,7 +39,7 @@ specific_ss.add(when: ['CONFIG_SOFTMMU'], if_true:
> > opengl)
> >
> >  ui_modules = {}
> >
> > -if config_host.has_key('CONFIG_CURSES')
> > +if curses.found()
> >    curses_ss = ss.source_set()
> >    curses_ss.add(when: [curses, iconv], if_true: [files('curses.c'),
> > pixman])
> >    ui_modules += {'curses' : curses_ss}
>
> I find that this change causes a configure failure when choosing either
> --enable-iconv or --enable-curses as follows:
>
> ../configure --enable-curses results in
> ../meson.build:491:4: ERROR: Problem encountered: Cannot detect iconv
> API
>
> ../configure --enable-iconv results in
> ../meson.build:446:2: ERROR: Problem encountered: Cannot detect iconv
> API
>
> I haven't yet learned meson well enough to identify further what is
> going wrong.
>
> Can someone take a look at what might be failing, or give me some clue
> what I can check on or report on from my end which would be helpful to
> resolve this?
> I am running openSUSE Tumbleweed, by the way.
>
> Thanks,
>
> Bruce
>


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

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

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

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-10-14  8:21 [PULL 0/9] Ui 20201014 patches Gerd Hoffmann
2020-10-14  8:21 ` [PULL 1/9] qemu-edid: drop cast Gerd Hoffmann
2020-10-14  8:21 ` [PULL 2/9] curses: Fixes compiler error that complain don't have langinfo.h on msys2/mingw Gerd Hoffmann
2020-10-14  8:21 ` [PULL 3/9] curses: Fixes curses compiling errors Gerd Hoffmann
2020-10-14  8:21 ` [PULL 4/9] win32: Simplify gmtime_r detection not depends on if _POSIX_C_SOURCE are defined on msys2/mingw Gerd Hoffmann
2020-10-14  8:21 ` [PULL 5/9] configure: Fixes ncursesw detection under msys2/mingw by convert them to meson Gerd Hoffmann
2020-10-14 18:22   ` Bruce Rogers
2020-10-14 19:16     ` 罗勇刚(Yonggang Luo)
2020-10-14 19:17     ` 罗勇刚(Yonggang Luo)
2020-10-14 20:10       ` Bruce Rogers
2020-10-14  8:21 ` [PULL 6/9] vnc-stubs: Allow -vnc none Gerd Hoffmann
2020-10-14  8:21 ` [PULL 7/9] SDL: enable OpenGL context creation Gerd Hoffmann
2020-10-14  8:21 ` [PULL 8/9] input-linux: Reset il->fd handler before closing it Gerd Hoffmann
2020-10-14  8:21 ` [PULL 9/9] ui: Fix default window_id value Gerd Hoffmann
2020-10-14 14:24 ` [PULL 0/9] Ui 20201014 patches Peter Maydell

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).