Patchwork [RFC,3/8] package/ncurses: Allow building wide char support

login
register
mail settings
Submitter Jeremy Kerr
Date Jan. 16, 2014, 8:52 a.m.
Message ID <1389862338.918565.412332853863.3.gpush@pablo>
Download mbox | patch
Permalink /patch/311636/
State Superseded
Headers show

Comments

Jeremy Kerr - Jan. 16, 2014, 8:52 a.m.
Allow ncurses to be configured with wide char support; this causes the
libraries to be built with the 'w' suffix (eg libncursesw.so,
libmenuw.so, etc), so we need to create a few symlinks.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>

---
 package/ncurses/Config.in  |    5 +++
 package/ncurses/ncurses.mk |   50 +++++++++++++++++++++++++++++++++----
 2 files changed, 50 insertions(+), 5 deletions(-)
Thomas Petazzoni - Jan. 30, 2014, 7:44 p.m.
Dear Jeremy Kerr,

On Thu, 16 Jan 2014 16:52:18 +0800, Jeremy Kerr wrote:

>  if BR2_PACKAGE_NCURSES
> +config BR2_PACKAGE_NCURSES_WIDEC

One empty line between the if line and the config line.

> +	bool "enable wide char support"
> +	depends on BR2_PACKAGE_NCURSES

dependency not needed since you're inside a if BR2_PACKAGE_NCURSES.

I believe this option most likely depends on BR2_USE_WCHAR.

Also, maybe name the option BR2_PACKAGE_NCURSES_WCHAR, to match the
BR2_USE_WCHAR name we're already using in Buildroot to talk about wide
char support.

> +	help
> +	  Enable wide char & UTF-8 support in ncurses libraries
>  
>  config BR2_PACKAGE_NCURSES_TARGET_PANEL
>  	bool "ncurses libpanel in target"
> diff --git a/package/ncurses/ncurses.mk b/package/ncurses/ncurses.mk
> index f3319763..ba4cacd1 100644
> --- a/package/ncurses/ncurses.mk
> +++ b/package/ncurses/ncurses.mk
> @@ -12,7 +12,7 @@ HOST_NCURSES_DEPENDENCIES =
>  NCURSES_PROGS = clear infocmp tabs tic toe tput tset
>  NCURSES_LICENSE = MIT with advertising clause
>  NCURSES_LICENSE_FILES = README
> -NCURSES_CONFIG_SCRIPTS = ncurses5-config
> +NCURSES_CONFIG_SCRIPTS = ncurses$(W)5-config
>  
>  NCURSES_CONF_OPT = \
>  	$(if $(BR2_PREFER_STATIC_LIB),--without-shared,--with-shared) \
> @@ -36,6 +36,15 @@ ifeq ($(BR2_PACKAGE_BUSYBOX),y)
>  	NCURSES_DEPENDENCIES += busybox
>  endif
>  
> +ifeq ($(BR2_PACKAGE_NCURSES_WIDEC),y)
> +NCURSES_CONF_OPT += --enable-widec
> +W=w
> +W_LINK=ln -sf
> +else
> +W=
> +W_LINK=:
> +endif

We really don't want to have variables named W and W_LINK. The variable
namespace in Buildroot is global. So if one package defines W, and
another package uses it, we screwed. So all variables should be
prefixed by the name of the package.

> +
>  ifneq ($(BR2_ENABLE_DEBUG),y)
>  NCURSES_CONF_OPT += --without-debug
>  endif
> @@ -48,19 +57,22 @@ ifneq ($(BR2_PREFER_STATIC_LIB),y)
>  
>  ifeq ($(BR2_PACKAGE_NCURSES_TARGET_PANEL),y)
>  define NCURSES_INSTALL_TARGET_PANEL
> -	cp -dpf $(NCURSES_DIR)/lib/libpanel.so* $(TARGET_DIR)/usr/lib/
> +	cp -dpf $(NCURSES_DIR)/lib/libpanel$(W).so* $(TARGET_DIR)/usr/lib/
> +	$(W_LINK) libpanelw.so $(TARGET_DIR)/usr/lib/libpanel.so
>  endef
>  endif
>  
>  ifeq ($(BR2_PACKAGE_NCURSES_TARGET_FORM),y)
>  define NCURSES_INSTALL_TARGET_FORM
> -	cp -dpf $(NCURSES_DIR)/lib/libform.so* $(TARGET_DIR)/usr/lib/
> +	cp -dpf $(NCURSES_DIR)/lib/libform$(W).so* $(TARGET_DIR)/usr/lib/
> +	$(W_LINK) libformw.so $(TARGET_DIR)/usr/lib/libform.so
>  endef
>  endif
>  
>  ifeq ($(BR2_PACKAGE_NCURSES_TARGET_MENU),y)
>  define NCURSES_INSTALL_TARGET_MENU
> -	cp -dpf $(NCURSES_DIR)/lib/libmenu.so* $(TARGET_DIR)/usr/lib/
> +	cp -dpf $(NCURSES_DIR)/lib/libmenu$(W).so* $(TARGET_DIR)/usr/lib/
> +	$(W_LINK) libmenuw.so $(TARGET_DIR)/usr/lib/libmenu.so
>  endef
>  endif
>  
> @@ -78,7 +90,8 @@ endif
>  
>  define NCURSES_INSTALL_TARGET_CMDS
>  	mkdir -p $(TARGET_DIR)/usr/lib
> -	$(if $(BR2_PREFER_STATIC_LIB),,cp -dpf $(NCURSES_DIR)/lib/libncurses.so* $(TARGET_DIR)/usr/lib/)
> +	$(if $(BR2_PREFER_STATIC_LIB),,cp -dpf $(NCURSES_DIR)/lib/libncurses$(W).so* $(TARGET_DIR)/usr/lib/)
> +	$(W_LINK) libncursesw.so $(TARGET_DIR)/usr/lib/libncurses.so
>  	$(NCURSES_INSTALL_TARGET_PANEL)
>  	$(NCURSES_INSTALL_TARGET_FORM)
>  	$(NCURSES_INSTALL_TARGET_MENU)
> @@ -101,6 +114,33 @@ define NCURSES_INSTALL_TARGET_CMDS
>  	cp -dpf $(STAGING_DIR)/usr/share/terminfo/s/screen $(TARGET_DIR)/usr/share/terminfo/s
>  endef # NCURSES_INSTALL_TARGET_CMDS
>  
> +define NCURSES_POST_INSTALL_SYMLINK
> +	$(W_LINK) libncursesw.so $(STAGING_DIR)/usr/lib/libncurses.so
> +endef
> +NCURSES_POST_INSTALL_STAGING_HOOKS += NCURSES_POST_INSTALL_SYMLINK
> +
> +ifeq ($(BR2_PACKAGE_NCURSES_TARGET_PANEL),y)
> +define NCURSES_POST_INSTALL_SYMLINK_PANEL
> +	$(W_LINK) libpanelw.so $(STAGING_DIR)/usr/lib/libpanel.so
> +endef
> +NCURSES_POST_INSTALL_STAGING_HOOKS += NCURSES_POST_INSTALL_SYMLINK_PANEL
> +endif
> +
> +ifeq ($(BR2_PACKAGE_NCURSES_TARGET_FORM),y)
> +define NCURSES_POST_INSTALL_SYMLINK_FORM
> +	$(W_LINK) libformw.so $(STAGING_DIR)/usr/lib/libform.so
> +endef
> +NCURSES_POST_INSTALL_STAGING_HOOKS += NCURSES_POST_INSTALL_SYMLINK_FORM
> +endif
> +
> +ifeq ($(BR2_PACKAGE_NCURSES_TARGET_MENU),y)
> +define NCURSES_POST_INSTALL_SYMLINK_MENU
> +	$(W_LINK) libmenuw.so $(STAGING_DIR)/usr/lib/libmenu.so
> +endef
> +NCURSES_POST_INSTALL_STAGING_HOOKS += NCURSES_POST_INSTALL_SYMLINK_MENU
> +endif

Pffiou, that's a lot of things. Maybe we could refactor this a little
with the target installation to do something a bit smarter like:

NCURSES_LIBS-y += libncurses
NCURSES_LIBS-$(BR2_PACKAGE_NCURSES_TARGET_MENU) += libmenu
NCURSES_LIBS-$(BR2_PACKAGE_NCURSES_TARGET_PANEL) += libpanel
NCURSES_LIBS-$(BR2_PACKAGE_NCURSES_TARGET_FORM) += libform

and then use $(NCURSES_LIBS-y) and some loops in target installation
and in a staging post installation hook to create the appropriate
symbolic links.

Thanks!

Thomas
Jeremy Kerr - Feb. 28, 2014, 2:53 a.m.
Hi Thomas,

>> +	bool "enable wide char support"
>> +	depends on BR2_PACKAGE_NCURSES
> 
> dependency not needed since you're inside a if BR2_PACKAGE_NCURSES.
> 
> I believe this option most likely depends on BR2_USE_WCHAR.
> 
> Also, maybe name the option BR2_PACKAGE_NCURSES_WCHAR, to match the
> BR2_USE_WCHAR name we're already using in Buildroot to talk about wide
> char support.

OK, makes sense, fixed.

> Pffiou, that's a lot of things. Maybe we could refactor this a little
> with the target installation to do something a bit smarter like:
> 
> NCURSES_LIBS-y += libncurses
> NCURSES_LIBS-$(BR2_PACKAGE_NCURSES_TARGET_MENU) += libmenu
> NCURSES_LIBS-$(BR2_PACKAGE_NCURSES_TARGET_PANEL) += libpanel
> NCURSES_LIBS-$(BR2_PACKAGE_NCURSES_TARGET_FORM) += libform
> 
> and then use $(NCURSES_LIBS-y) and some loops in target installation
> and in a staging post installation hook to create the appropriate
> symbolic links.

That looks much better. I'll split this change into two stages: one to
implement NCURSES_LIBS-y, and one to add BR2_PACKAGE_NCURSES_WCHAR.

Cheers,


jeremy

Patch

diff --git a/package/ncurses/Config.in b/package/ncurses/Config.in
index e8ab7102..337b0160 100644
--- a/package/ncurses/Config.in
+++ b/package/ncurses/Config.in
@@ -9,6 +9,11 @@  config BR2_PACKAGE_NCURSES
 	  http://www.gnu.org/software/ncurses/
 
 if BR2_PACKAGE_NCURSES
+config BR2_PACKAGE_NCURSES_WIDEC
+	bool "enable wide char support"
+	depends on BR2_PACKAGE_NCURSES
+	help
+	  Enable wide char & UTF-8 support in ncurses libraries
 
 config BR2_PACKAGE_NCURSES_TARGET_PANEL
 	bool "ncurses libpanel in target"
diff --git a/package/ncurses/ncurses.mk b/package/ncurses/ncurses.mk
index f3319763..ba4cacd1 100644
--- a/package/ncurses/ncurses.mk
+++ b/package/ncurses/ncurses.mk
@@ -12,7 +12,7 @@  HOST_NCURSES_DEPENDENCIES =
 NCURSES_PROGS = clear infocmp tabs tic toe tput tset
 NCURSES_LICENSE = MIT with advertising clause
 NCURSES_LICENSE_FILES = README
-NCURSES_CONFIG_SCRIPTS = ncurses5-config
+NCURSES_CONFIG_SCRIPTS = ncurses$(W)5-config
 
 NCURSES_CONF_OPT = \
 	$(if $(BR2_PREFER_STATIC_LIB),--without-shared,--with-shared) \
@@ -36,6 +36,15 @@  ifeq ($(BR2_PACKAGE_BUSYBOX),y)
 	NCURSES_DEPENDENCIES += busybox
 endif
 
+ifeq ($(BR2_PACKAGE_NCURSES_WIDEC),y)
+NCURSES_CONF_OPT += --enable-widec
+W=w
+W_LINK=ln -sf
+else
+W=
+W_LINK=:
+endif
+
 ifneq ($(BR2_ENABLE_DEBUG),y)
 NCURSES_CONF_OPT += --without-debug
 endif
@@ -48,19 +57,22 @@  ifneq ($(BR2_PREFER_STATIC_LIB),y)
 
 ifeq ($(BR2_PACKAGE_NCURSES_TARGET_PANEL),y)
 define NCURSES_INSTALL_TARGET_PANEL
-	cp -dpf $(NCURSES_DIR)/lib/libpanel.so* $(TARGET_DIR)/usr/lib/
+	cp -dpf $(NCURSES_DIR)/lib/libpanel$(W).so* $(TARGET_DIR)/usr/lib/
+	$(W_LINK) libpanelw.so $(TARGET_DIR)/usr/lib/libpanel.so
 endef
 endif
 
 ifeq ($(BR2_PACKAGE_NCURSES_TARGET_FORM),y)
 define NCURSES_INSTALL_TARGET_FORM
-	cp -dpf $(NCURSES_DIR)/lib/libform.so* $(TARGET_DIR)/usr/lib/
+	cp -dpf $(NCURSES_DIR)/lib/libform$(W).so* $(TARGET_DIR)/usr/lib/
+	$(W_LINK) libformw.so $(TARGET_DIR)/usr/lib/libform.so
 endef
 endif
 
 ifeq ($(BR2_PACKAGE_NCURSES_TARGET_MENU),y)
 define NCURSES_INSTALL_TARGET_MENU
-	cp -dpf $(NCURSES_DIR)/lib/libmenu.so* $(TARGET_DIR)/usr/lib/
+	cp -dpf $(NCURSES_DIR)/lib/libmenu$(W).so* $(TARGET_DIR)/usr/lib/
+	$(W_LINK) libmenuw.so $(TARGET_DIR)/usr/lib/libmenu.so
 endef
 endif
 
@@ -78,7 +90,8 @@  endif
 
 define NCURSES_INSTALL_TARGET_CMDS
 	mkdir -p $(TARGET_DIR)/usr/lib
-	$(if $(BR2_PREFER_STATIC_LIB),,cp -dpf $(NCURSES_DIR)/lib/libncurses.so* $(TARGET_DIR)/usr/lib/)
+	$(if $(BR2_PREFER_STATIC_LIB),,cp -dpf $(NCURSES_DIR)/lib/libncurses$(W).so* $(TARGET_DIR)/usr/lib/)
+	$(W_LINK) libncursesw.so $(TARGET_DIR)/usr/lib/libncurses.so
 	$(NCURSES_INSTALL_TARGET_PANEL)
 	$(NCURSES_INSTALL_TARGET_FORM)
 	$(NCURSES_INSTALL_TARGET_MENU)
@@ -101,6 +114,33 @@  define NCURSES_INSTALL_TARGET_CMDS
 	cp -dpf $(STAGING_DIR)/usr/share/terminfo/s/screen $(TARGET_DIR)/usr/share/terminfo/s
 endef # NCURSES_INSTALL_TARGET_CMDS
 
+define NCURSES_POST_INSTALL_SYMLINK
+	$(W_LINK) libncursesw.so $(STAGING_DIR)/usr/lib/libncurses.so
+endef
+NCURSES_POST_INSTALL_STAGING_HOOKS += NCURSES_POST_INSTALL_SYMLINK
+
+ifeq ($(BR2_PACKAGE_NCURSES_TARGET_PANEL),y)
+define NCURSES_POST_INSTALL_SYMLINK_PANEL
+	$(W_LINK) libpanelw.so $(STAGING_DIR)/usr/lib/libpanel.so
+endef
+NCURSES_POST_INSTALL_STAGING_HOOKS += NCURSES_POST_INSTALL_SYMLINK_PANEL
+endif
+
+ifeq ($(BR2_PACKAGE_NCURSES_TARGET_FORM),y)
+define NCURSES_POST_INSTALL_SYMLINK_FORM
+	$(W_LINK) libformw.so $(STAGING_DIR)/usr/lib/libform.so
+endef
+NCURSES_POST_INSTALL_STAGING_HOOKS += NCURSES_POST_INSTALL_SYMLINK_FORM
+endif
+
+ifeq ($(BR2_PACKAGE_NCURSES_TARGET_MENU),y)
+define NCURSES_POST_INSTALL_SYMLINK_MENU
+	$(W_LINK) libmenuw.so $(STAGING_DIR)/usr/lib/libmenu.so
+endef
+NCURSES_POST_INSTALL_STAGING_HOOKS += NCURSES_POST_INSTALL_SYMLINK_MENU
+endif
+
+
 #
 # On systems with an older version of tic, the installation of ncurses hangs
 # forever. To resolve the problem, build a static version of tic on host