'make foo-menuconfig' broken when host-ncurses was built
Hi all,
My colleague David observed that since a month or so, the dialogs of 'make
linux-menuconfig' looked pretty garbled. After a bit of debugging, it turns out that the problem is mixing host-ncurses with recent (6.0+) system ncurses. Based on the output, I suspect it's mixing an 8-bit ncurses library with widechar termcap files.
This issue is caused by dde090c299 linux: fix passing of host CFLAGS and LDFLAGS
What happens is that kconfig uses pkg-config to discover the ncurses
installation. Since our host-ncurses doesn't install a pc file (and in linux.mk we anyway don't pass the approprate PKG_CONFIG_* variables), this will pick up the system's pkg-config settings. However, we set HOSTCC="/usr/bin/gcc -O2 -I.../host/include -L.../host/lib -Wl,-rpath,.../host/lib" on the linux make command line, so it *will* actually pick up our host-ncurses library. On my system, 'pkg-config --libs ncurses' returns '-lncurses -ltinfo'. Our ncurses only has libncurses.so, so libtinfo.so will be picked up from the host.
The question is how to resolve this. The correct thing to do would be to
install the .pc file, and to do what Thomas proposed a while ago:
$(HOST_DIR)/bin/pkg-config returns the host config, $(CROSS_COMPILE)pkg-config returns the target config. But this will probably result in breakage of a lot of packages...
Any better ideas?
Regards,
Arnout
Signature · 6 lines
Arnout Vandecappelle arnout at mind be Senior Embedded Software Architect +32-16-286500 Essensium/Mind http://www.mind.be G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle GPG fingerprint: 7493 020B C7E3 8618 8DEC 222C 82EB F404 F9AC 0DDF
PATCH 1/1 package/ncurses: enable widechar for host build
Kconfig uses pkg-config to find the ncurses or ncursesw library. If the ncursesw package is found with pkg-config, it will #include <ncursesw.h>. Since Buildroot's host-ncurses doesn't install a .pc file, and linux.mk anyway doesn't pass the pkg-config options to find the host pkg-config files, Kconfig will always find the system's ncursesw.h.
However, since commit dde090c299 (linux: fix passing of host CFLAGS and LDFLAGS) HOST_LDFLAGS is passed to the linux build system. Thus, if host-ncurses was already built before 'make linux-menuconfig' is called, the build will pick up libncurses from the host directory, which is NOT widechar. Thus, two different ncurses configurations are mixed into the final mconf program. This will result in serious breakage in the rendering of the menus (lots of @ and question mark characters).
As a workaround, just build host-ncurses with widechar support. That makes it compatible with ncursesw.h picked up from the host. Clearly, this is not a robust solution. But it's simple, it works, and it shouldn't hurt to build host-ncurses with widechar support (we can safely assume that the system doesn't have a non-widechare uClibc library...).
--- package/ncurses/ncurses.mk | 1 + 1 file changed, 1 insertion(+)
package/ncurses/ncurses.mk +1 -0
@@ -153,6 +153,7 @@ HOST_NCURSES_CONF_OPTS = \ --without-cxx \ --without-cxx-binding \ --without-ada \ + --enable-widec \ --without-normal $(eval $(autotools-package))
Signature · 1 line
2.17.0
PATCH 1/1 package/ncurses: enable widechar for host build
Hi, Arnout:
I suggest you to adjust your patch from
HOST_NCURSES_CONF_OPTS = \
--with-shared \
--without-gpm \
--without-manpages \
--without-cxx \
--without-cxx-binding \
--without-ada \
--enable-widec \
--without-normal
to
HOST_NCURSES_CONF_OPTS = \
--enable-widec \
--with-shared \
--without-gpm \
--without-manpages \
--without-cxx \
--without-cxx-binding \
--without-ada \
--without-normal
just for more cleanly.
Thanks.
Scott Fan
Quoted 42 lines · Arnout Vandecappelle (Essensium/Mind)
Kconfiguses pkg-config to find the ncurses or ncursesw library. If the ncursesw package is found with pkg-config, it will #include <ncursesw.h>. Since Buildroot's host-ncurses doesn't install a .pc file, and linux.mk anyway doesn't pass the pkg-config options to find the host pkg-config files,Kconfigwill always find the system'sncursesw.h.However, since commit
dde090c299(linux: fix passing of host CFLAGS and LDFLAGS)HOST_LDFLAGSis passed to the linux build system. Thus, if host-ncurses was already built before 'make linux-menuconfig' is called, the build will pick up libncurses from the host directory, which is NOT widechar. Thus, two different ncurses configurations are mixed into the final mconf program. This will result in serious breakage in the rendering of the menus (lots of @ and question mark characters).As a workaround, just build host-ncurses with widechar support. That makes it compatible with
ncursesw.hpicked up from the host. Clearly, this is not a robust solution. But it's simple, it works, and it shouldn't hurt to build host-ncurses with widechar support (we can safely assume that the system doesn't have a non-widechare uClibc library...).Cc David De Grave <[email protected]>--- package/ncurses/ncurses.mk | 1 + 1 file changed, 1 insertion(+)package/ncurses/ncurses.mk +1
-1@@ -153,6 +153,7 @@ HOST_NCURSES_CONF_OPTS = \ --without-cxx \ --without-cxx-binding \ --without-ada \ + --enable-widec \ --without-normal $(eval $(autotools-package)) --2.17.0
Quoted 5 lines
_______________________________________________
buildroot mailing list
buildroot at busybox.net
http://lists.busybox.net/mailman/listinfo/buildroot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.busybox.net/pipermail/buildroot/attachments/20180427/bb98b8ee/attachment.html>
PATCH 1/1 package/ncurses: enable widechar for host build
In reply to Arnout Vandecappelle (Essensium/Mind)Kconfig uses either pkg-config or hard-coded /usr/include paths to find the ncurses or ncursesw library. If ncursesw is found, it will include <ncursesw.h>. Since Buildroot's host-ncurses doesn't install a .pc file, and linux.mk anyway doesn't pass the pkg-config options to find the host pkg-config files, Kconfig will always find the system's ncursesw.h.
However, since commit dde090c299 (linux: fix passing of host CFLAGS and LDFLAGS) HOST_LDFLAGS is passed to the linux build system. Thus, if host-ncurses was already built before 'make linux-menuconfig' is called, the build will pick up libncurses from the host directory, which is NOT widechar. Thus, two different ncurses configurations are mixed into the final mconf program. This will result in serious breakage in the rendering of the menus (lots of @ and question mark characters).
As a workaround, just build host-ncurses with widechar support. That makes it compatible with ncursesw.h picked up from the host. Clearly, this is not a robust solution. But it's simple, it works, and it shouldn't hurt to build host-ncurses with widechar support (we can safely assume that the system doesn't have a non-widechar uClibc library...).
---
v2:
- fix typo in commit message;
- extend commit message;
- keep alphabetic ordering of configure options (Scott)
Note: I haven't tested what happens on a system which doesn't have ncursesw.h. But I guess such a system is so exotic that it's not worthwhile to do something special for it.
--- package/ncurses/ncurses.mk | 1 + 1 file changed, 1 insertion(+)
package/ncurses/ncurses.mk +1 -0
@@ -147,6 +147,7 @@ define HOST_NCURSES_BUILD_CMDS endef HOST_NCURSES_CONF_OPTS = \ + --enable-widec \ --with-shared \ --without-gpm \ --without-manpages \
Signature · 1 line
2.17.0
PATCH 1/1 package/ncurses: enable widechar for host build
Arnout, All,
On 2018-05-03 09:58 +0200, Arnout Vandecappelle (Essensium/Mind) spake thusly:
Quoted 6 lines
Kconfiguses either pkg-config or hard-coded/usr/includepaths to find the ncurses or ncursesw library. If ncursesw is found, it will include <ncursesw.h>. Since Buildroot's host-ncurses doesn't install a .pc file, and linux.mk anyway doesn't pass the pkg-config options to find the host pkg-config files,Kconfigwill always find the system'sncursesw.h.
Quoted 7 lines
However, since commit
dde090c299(linux: fix passing of host CFLAGS and LDFLAGS)HOST_LDFLAGSis passed to the linux build system. Thus, if host-ncurses was already built before 'make linux-menuconfig' is called, the build will pick up libncurses from the host directory, which is NOT widechar. Thus, two different ncurses configurations are mixed into the final mconf program. This will result in serious breakage in the rendering of the menus (lots of @ and question mark characters).
What about overriding HOSTCC when calling linux-menuconfig:
diff --git a/linux/linux.mk b/linux/linux.mk
index 9e646baffc..75a256ff9e 100644
--- a/linux/linux.mk
+++ b/linux/linux.mk
@@ -235,7 +235,7 @@ LINUX_KCONFIG_FILE = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE))
endif
LINUX_KCONFIG_FRAGMENT_FILES = $(call qstrip,$(BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES))
LINUX_KCONFIG_EDITORS = menuconfig xconfig gconfig nconfig
-LINUX_KCONFIG_OPTS = $(LINUX_MAKE_FLAGS)
+LINUX_KCONFIG_OPTS = $(LINUX_MAKE_FLAGS) HOSTCC="$(HOSTCC)"
# If no package has yet set it, set it from the Kconfig option
LINUX_NEEDS_MODULES ?= $(BR2_LINUX_NEEDS_MODULES)We should not need any library from HOST_DIR when we run menuconfig.
Note: we may still want to enable widechar in host-ncurses for other reasons, though. But with the proposdal above, there is no lopnger any mix of system ncurses vs our own.
Regards,
Yann E. MORIN.
Quoted 42 lines
As a workaround, just build host-ncurses with widechar support. That makes it compatible with
ncursesw.hpicked up from the host. Clearly, this is not a robust solution. But it's simple, it works, and it shouldn't hurt to build host-ncurses with widechar support (we can safely assume that the system doesn't have a non-widechar uClibc library...).Cc David De Grave <[email protected]>Cc Scott Fan <[email protected]>---
v2:
- fix typo in commit message;
- extend commit message;
- keep alphabetic ordering of configure options (Scott)Note: I haven't tested what happens on a system which doesn't have
ncursesw.h. But I guess such a system is so exotic that it's not worthwhile to do something special for it.--- package/ncurses/ncurses.mk | 1 + 1 file changed, 1 insertion(+)package/ncurses/ncurses.mk +1
-0@@ -147,6 +147,7 @@ define HOST_NCURSES_BUILD_CMDS endef HOST_NCURSES_CONF_OPTS = \ + --enable-widec \ --with-shared \ --without-gpm \ --without-manpages \Signature · 6 lines
2.17.0 _______________________________________________ buildroot mailing list buildroot at busybox.net http://lists.busybox.net/mailman/listinfo/buildroot
Signature · 6 lines
.-----------------.--------------------.------------------.--------------------. | Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: | | +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___ | | +33 223 225 172 `------------.-------: X AGAINST | \e/ There is no | | http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v conspiracy. | '------------------------------^-------^------------------^--------------------'
PATCH 1/1 package/ncurses: enable widechar for host build
Hello,
Quoted 16 lines · Yann E. MORIN
What about overriding HOSTCC when calling linux-menuconfig:
diff --git a/linux/linux.mk b/linux/linux.mk index 9e646baffc..75a256ff9e 100644 --- a/linux/linux.mk +++ b/linux/linux.mk @@ -235,7 +235,7 @@ LINUX_KCONFIG_FILE = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE)) endif LINUX_KCONFIG_FRAGMENT_FILES = $(call qstrip,$(BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES)) LINUX_KCONFIG_EDITORS = menuconfig xconfig gconfig nconfig -LINUX_KCONFIG_OPTS = $(LINUX_MAKE_FLAGS) +LINUX_KCONFIG_OPTS = $(LINUX_MAKE_FLAGS) HOSTCC="$(HOSTCC)" # If no package has yet set it, set it from the Kconfig option LINUX_NEEDS_MODULES ?= $(BR2_LINUX_NEEDS_MODULES)
Quoted 5 lines
We should not need any library from
HOST_DIRwhen we run menuconfig.Note: we may still want to enable widechar in host-ncurses for other reasons, though. But with the proposdal above, there is no lopnger any mix of system ncurses vs our own.
Arnout, any comment on Yann's proposal? I have to say my preference goes to Yann's solution, as it's the one that ensures there is no mixing of ncurses between the one we build in HOST_DIR and the one provided by the system.
Best regards,
Thomas
Signature · 3 lines
Thomas Petazzoni, CTO, Bootlin (formerly Free Electrons) Embedded Linux and Kernel engineering https://bootlin.com
PATCH 1/1 package/ncurses: enable widechar for host build
Quoted 22 lines · Thomas Petazzoni
Hello,
Quoted 18 lines · Yann E. MORIN
What about overriding HOSTCC when calling linux-menuconfig:
diff --git a/linux/linux.mk b/linux/linux.mk index 9e646baffc..75a256ff9e 100644 --- a/linux/linux.mk +++ b/linux/linux.mk @@ -235,7 +235,7 @@ LINUX_KCONFIG_FILE = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE)) endif LINUX_KCONFIG_FRAGMENT_FILES = $(call qstrip,$(BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES)) LINUX_KCONFIG_EDITORS = menuconfig xconfig gconfig nconfig -LINUX_KCONFIG_OPTS = $(LINUX_MAKE_FLAGS) +LINUX_KCONFIG_OPTS = $(LINUX_MAKE_FLAGS) HOSTCC="$(HOSTCC)" # If no package has yet set it, set it from the Kconfig option LINUX_NEEDS_MODULES ?= $(BR2_LINUX_NEEDS_MODULES)We should not need any library from
HOST_DIRwhen we run menuconfig.
Quoted 8 lines
Quoted 3 lines
Note: we may still want to enable widechar in host-ncurses for other reasons, though. But with the proposdal above, there is no lopnger any mix of system ncurses vs our own.
Arnout, any comment on Yann's proposal? I have to say my preference goes to Yann's solution, as it's the one that ensures there is no mixing of ncurses between the one we build in
HOST_DIRand the one provided by the system.
As noted in another thread, the same problem might occur for another package.
Basically, kconfig will fail if we pass the normal HOST_CONFIGURE_OPTS. But I guess it's not likely that we ever have a package that does that, since kconfig packages are normally target packages, and kconfig doesn't listen to CFLAGS_FOR_BUILD/LDFLAGS_FOR_BUILD.
So OK, Yann, can you prepare a patch? I've marked this patch as Rejected.
Regards,
Arnout
Signature · 6 lines
Arnout Vandecappelle arnout at mind be Senior Embedded Software Architect +32-16-286500 Essensium/Mind http://www.mind.be G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle GPG fingerprint: 7493 020B C7E3 8618 8DEC 222C 82EB F404 F9AC 0DDF
Quoted 11 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Arnout" == Arnout Vandecappelle <[email protected]> writes:
Hi all,
My colleague David observed that since a month or so, the dialogs of 'make
linux-menuconfig' looked pretty garbled. After a bit of debugging, it turns out that the problem is mixing host-ncurses with recent (6.0+) system ncurses. Based on the output, I suspect it's mixing an 8-bit ncurses library with widechar termcap files.This issue is caused by
dde090c299linux: fix passing of host CFLAGS and LDFLAGS
Quoted 8 lines
What happens is that kconfig uses pkg-config to discover the ncurses
installation. Since our host-ncurses doesn't install a pc file (and in linux.mk we anyway don't pass the approprate PKG_CONFIG_* variables), this will pick up the system's pkg-config settings. However, we set HOSTCC="/usr/bin/gcc -O2 -I.../host/include -L.../host/lib -Wl,-rpath,.../host/lib" on the linux make command line, so it *will* actually pick up our host-ncurses library. On my system, 'pkg-config --libs ncurses' returns '-lncurses -ltinfo'. Our ncurses only has libncurses.so, so libtinfo.so will be picked up from the host.
Ahh :/
Quoted 7 lines
The question is how to resolve this. The correct thing to do would be to
install the .pc file, and to do what Thomas proposed a while ago:
$(HOST_DIR)/bin/pkg-config returns the host config, $(CROSS_COMPILE)pkg-config returns the target config. But this will probably result in breakage of a lot of packages...Any better ideas?
Is that really needed? Can't we just change linux.mk to use HOST_MAKE_ENV instead of TARGET_MAKE_ENV (it is a target package, but it only needs to link against host libraries). That wil ensure that the PKG_CONFIG_* environment variables are set, so if we were to install a ncurses(w) pc file for the host, kconfig should find and use it?
Signature · 1 line
Bye, Peter Korsgaard
Quoted 20 lines · Peter Korsgaard
Quoted 11 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Arnout" == Arnout Vandecappelle <[email protected]> writes:
Hi all,
My colleague David observed that since a month or so, the dialogs of 'make
linux-menuconfig' looked pretty garbled. After a bit of debugging, it turns out that the problem is mixing host-ncurses with recent (6.0+) system ncurses. Based on the output, I suspect it's mixing an 8-bit ncurses library with widechar termcap files.This issue is caused by
dde090c299linux: fix passing of host CFLAGS and LDFLAGSQuoted 8 lines
What happens is that kconfig uses pkg-config to discover the ncurses
installation. Since our host-ncurses doesn't install a pc file (and in linux.mk we anyway don't pass the approprate PKG_CONFIG_* variables), this will pick up the system's pkg-config settings. However, we set HOSTCC="/usr/bin/gcc -O2 -I.../host/include -L.../host/lib -Wl,-rpath,.../host/lib" on the linux make command line, so it *will* actually pick up our host-ncurses library. On my system, 'pkg-config --libs ncurses' returns '-lncurses -ltinfo'. Our ncurses only has libncurses.so, so libtinfo.so will be picked up from the host.
Quoted 1 line
Ahh :/
See the patch I sent: my analysis was not entirely correct. The issue is not in
libtinfo.so. The issue is that we include the system's ncursesw.h (which is actually called ncurses.h), but linking with buildroot's ncurses library that doesn't support widechar. Hence the ^@ everywhere.
By the way, the issue is not limited to pkg-config: older versions ofcheck-lxdialog.sh would just add -I/usr/include/ncurses if they find an ncurses.h there, and that ncurses.h might be a widechar version...
Quoted 7 lines
Quoted 6 lines
The question is how to resolve this. The correct thing to do would be to
install the .pc file, and to do what Thomas proposed a while ago:
$(HOST_DIR)/bin/pkg-config returns the host config, $(CROSS_COMPILE)pkg-config returns the target config. But this will probably result in breakage of a lot of packages...
Quoted 7 lines
Quoted 1 line
Any better ideas?
Is that really needed? Can't we just change linux.mk to use
HOST_MAKE_ENVinstead ofTARGET_MAKE_ENV(it is a target package, but it only needs to link against host libraries). That wil ensure that the PKG_CONFIG_* environment variables are set, so if we were to install a ncurses(w) pc file for the host, kconfig should find and use it?
Unfortunately, we have a fragment in pkg-kconfig.mk that *removes* the
PKG_CONFIG_* stuff from the environment...
Also, the same issue may happen for *any* package using (recent) kconfig. I
didn't find an example that does it, but it's possible that a kconfig-package adds TARGET_CONFIGURE_OPTS to FOO_MAKE_ENV, and this would cause the same issue (TARGET_CONFIGURE_OPTS includes LDFLAGS_FOR_BUILD="$(HOST_LDFLAGS)" and HOST_LDFLAGS adds -L$(HOST_DIR)/lib).
So my patch enabling widechar is the simplest solution :-). Not perfect of
course, because that patch will break again if the host has an ncurses.h which is NOT widechar...
Regards,
Arnout
Signature · 6 lines
Arnout Vandecappelle arnout at mind be Senior Embedded Software Architect +32-16-286500 Essensium/Mind http://www.mind.be G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle GPG fingerprint: 7493 020B C7E3 8618 8DEC 222C 82EB F404 F9AC 0DDF