Skip to contentSkip to conversation

package/sdl2: disable altivec built-in function for PowerPC

PATCH New Romain Naour 3 participants 8 messages Feb 28, 2017 – Mar 5, 2017

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/2 package/sdl2: disable altivec built-in function for PowerPC

As reported in this bug report [1], altivec support in SDL break arbitrary C++ code.

Issue reported by test-pkg script while testing supertux package:
error: could not convert 'true' from 'bool' to '__vector(4) __bool int'

[1] https://bugs.debian.org/cgi-bin/bugreport.cgi/?bug=770670

---
 package/sdl2/sdl2.mk | 10 ++++++++++
 1 file changed, 10 insertions(+)
package/sdl2/sdl2.mk +10 -0
index d2ee50d..628d906 100644
@@ -23,6 +23,16 @@ SDL2_CONF_OPTS += \
 # We must enable static build to get compilation successful.
 SDL2_CONF_OPTS += --enable-static
 
+# From https://bugs.debian.org/cgi-bin/bugreport.cgi/?bug=770670
+# "The problem lies within SDL_cpuinfo.h.  It includes altivec.h, which by
+# definition provides an unconditional vector, pixel and bool define in
+# standard-c++ mode.  In GNU-c++ mode this names are only defined
+# context-sensitive by cpp.  SDL_cpuinfo.h is included by SDL.h.
+# Including altivec.h makes arbitrary code break."
+ifeq ($(BR2_POWERPC_CPU_HAS_ALTIVEC),y)
+SDL2_CONF_OPTS += --disable-altivec
+endif
+
 ifeq ($(BR2_PACKAGE_HAS_UDEV),y)
 SDL2_DEPENDENCIES += udev
 SDL2_CONF_OPTS += --enable-libudev
Signature · 1 line
2.9.3
#1 lore raw

PATCH v2 2/2 package/supertux: new package

---
v2: update GCC minimal version to 4.8
Coding style checked with check-package script (v1) and build tested with test-pkg script.

---
 DEVELOPERS                     |  1 +
 package/Config.in              |  1 +
 package/supertux/Config.in     | 37 +++++++++++++++++++++++++++++++
 package/supertux/supertux.hash |  2 ++
 package/supertux/supertux.mk   | 49 ++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 90 insertions(+)
 create mode 100644 package/supertux/Config.in
 create mode 100644 package/supertux/supertux.hash
 create mode 100644 package/supertux/supertux.mk
DEVELOPERS +1 -0
index c80fdb4..8bde497 100644
@@ -1286,6 +1286,7 @@ F:	package/lugaru/
 F:	package/mcelog/
 F:	package/openpowerlink/
 F:	package/stress-ng/
+F:	package/supertux/
 F:	package/terminology/
 F:	package/upower/
 F:	package/xenomai/
package/Config.in +1 -0
index aad0842..f6bfa2e 100644
@@ -229,6 +229,7 @@ menu "Games"
 	source "package/rubix/Config.in"
 	source "package/sl/Config.in"
 	source "package/stella/Config.in"
+	source "package/supertux/Config.in"
 	source "package/supertuxkart/Config.in"
 endmenu
 
package/supertux/Config.in new file +37 -0
new file mode 100644
index 0000000..a7a6e1b
@@ -0,0 +1,37 @@
+config BR2_PACKAGE_SUPERTUX
+	bool "supertux"
+	depends on BR2_INSTALL_LIBSTDCPP
+	depends on BR2_PACKAGE_HAS_LIBGL # libglew
+	depends on BR2_PACKAGE_OPENAL_ARCH_SUPPORTS
+	depends on BR2_PACKAGE_XORG7 # libglew, SDL2 OpenGL (GLX)
+	depends on BR2_TOOLCHAIN_GCC_AT_LEAST_4_8 # C++11 gcc attributes noreturn
+	depends on BR2_TOOLCHAIN_HAS_THREADS_NPTL # openal
+	depends on BR2_USE_MMU # SDL2 OpenGL (GLX)
+	depends on !BR2_STATIC_LIBS # SDL2
+	depends on BR2_USE_WCHAR # Boost
+	select BR2_PACKAGE_BOOST
+	select BR2_PACKAGE_BOOST_DATE_TIME
+	select BR2_PACKAGE_BOOST_FILESYSTEM
+	select BR2_PACKAGE_BOOST_SYSTEM
+	select BR2_PACKAGE_LIBGLEW
+	select BR2_PACKAGE_LIBGLU # GL/glu.h
+	select BR2_PACKAGE_LIBOGG
+	select BR2_PACKAGE_LIBVORBIS
+	select BR2_PACKAGE_OPENAL
+	select BR2_PACKAGE_SDL2
+	select BR2_PACKAGE_SDL2_IMAGE
+	select BR2_PACKAGE_SDL2_OPENGL
+	help
+	  SuperTux is a free classic 2D jump'n run sidescroller game in
+	  a style similar to the original Super Mario games covered
+	  under the GNU GPL.
+
+	  http://supertux.github.io/
+
+comment "supertux needs X11 and a toolchain w/ C++, OpenGL backend, gcc >= 4.8, NPTL, dynamic library, wchar"
+	depends on BR2_PACKAGE_OPENAL_ARCH_SUPPORTS
+	depends on BR2_PACKAGE_XORG7
+	depends on BR2_USE_MMU
+	depends on !BR2_INSTALL_LIBSTDCPP || !BR2_PACKAGE_HAS_LIBGL || \
+		!BR2_TOOLCHAIN_GCC_AT_LEAST_4_8 || !BR2_TOOLCHAIN_HAS_THREADS_NPTL || \
+		BR2_STATIC_LIBS || !BR2_USE_WCHAR
package/supertux/supertux.hash new file +2 -0
new file mode 100644
index 0000000..c56f608
@@ -0,0 +1,2 @@
+# Locally calculated
+sha256 c9dc3b42991ce5c5d0d0cb94e44c4ec2373ad09029940f0e92331e7e9ada0ac5 SuperTux-v0.5.1-Source.tar.gz
package/supertux/supertux.mk new file +49 -0

49 lines not on this page · raw message

Signature · 1 line
2.9.3
#2 lore raw

PATCH v2 2/2 package/supertux: new package

Hi All,

Le 01/03/2017 ? 00:24, Romain Naour a ?crit :

Quoted 2 lines

---

snip

package/supertux/supertux.mk line 16

Quoted 6 lines
package/supertux/supertux.mk new file +6 -0
+# Most of the data subdirectory is licensed under CC-by-SA, see
+# data/AUTHORS for a full list.
+# Supertux itself is GPLv3+, but it bundles a few libraries with different
+# licenses. PhysFS, sexp-cpp, squirrel, tinygettext.
+SUPERTUX_LICENSE = GPLv3+, CC-BY-SA (images music sounds)
+SUPERTUX_LICENSE_FILES = LICENSE.txt data/AUTHORS

data/AUTHORS provide a license for almost each data file, each license may be CC-BY-SA and GPL version 2 or later or CC-BY-SA 4.0 or CC-BY 3.0/CC-BY-SA 3.0/GPL 3.0 etc...

So It's not an exhaustive list of licenses. Should I list all licenses present in this file ?

package/supertux/supertux.mk line 22

Quoted 6 lines
package/supertux/supertux.mk new file +6 -0
+
+# Use bundled squirrel, tinygettext sexp-cpp packages which are hardcoded in
+# the CMake build system. Also use bundled PhysFS since there is no Buildroot
+# package for it.
+SUPERTUX_DEPENDENCIES = host-pkgconf boost libcurl libgl libglew libglu \
+	libogg libvorbis openal sdl2 sdl2_image

I'm working on PhysFS package and see if it can be used by supertux. This is the only library that can be used as "system" library (i.e from staging).

Best regards,
Romain

#3 lore raw

PATCH v2 1/2 package/sdl2: disable altivec built-in function for PowerPC

In reply to Romain Naour
Quoted 10 lines · Romain Naour

As reported in this bug report [1], altivec support in SDL break arbitrary C++ code.

Issue reported by test-pkg script while testing supertux package:
error: could not convert 'true' from 'bool' to '__vector(4) __bool int'

[1] https://bugs.debian.org/cgi-bin/bugreport.cgi/?bug=770670

Hi Romain,

If you want to keep alitvec support on you can probably work around this problem by using -std=gnu99 (which I used for mpv, see package/mpv/0002-fix-powerpc64-altivec.patch).

Cheers,
Sam.

Quoted 27 lines
---
 package/sdl2/sdl2.mk | 10 ++++++++++
 1 file changed, 10 insertions(+)
package/sdl2/sdl2.mk +10 -0
index d2ee50d..628d906 100644
@@ -23,6 +23,16 @@ SDL2_CONF_OPTS += \
 # We must enable static build to get compilation successful.
 SDL2_CONF_OPTS += --enable-static
 
+# From https://bugs.debian.org/cgi-bin/bugreport.cgi/?bug=770670
+# "The problem lies within SDL_cpuinfo.h.  It includes altivec.h, which by
+# definition provides an unconditional vector, pixel and bool define in
+# standard-c++ mode.  In GNU-c++ mode this names are only defined
+# context-sensitive by cpp.  SDL_cpuinfo.h is included by SDL.h.
+# Including altivec.h makes arbitrary code break."
+ifeq ($(BR2_POWERPC_CPU_HAS_ALTIVEC),y)
+SDL2_CONF_OPTS += --disable-altivec
+endif
+
 ifeq ($(BR2_PACKAGE_HAS_UDEV),y)
 SDL2_DEPENDENCIES += udev
 SDL2_CONF_OPTS += --enable-libudev
Signature · 1 line
2.9.3
#4 lore raw

PATCH v2 1/2 package/sdl2: disable altivec built-in function for PowerPC

Hi Sam,

Le 01/03/2017 ? 03:13, Sam Bobroff a ?crit :

Quoted 9 lines · Romain Naour
Quoted 8 lines

As reported in this bug report [1], altivec support in SDL break arbitrary C++ code.

Issue reported by test-pkg script while testing supertux package:
error: could not convert 'true' from 'bool' to '__vector(4) __bool int'

[1] https://bugs.debian.org/cgi-bin/bugreport.cgi/?bug=770670

Quoted 8 lines
Quoted 2 lines

Hi Romain,

If you want to keep alitvec support on you can probably work around this problem by using -std=gnu99 (which I used for mpv, see package/mpv/0002-fix-powerpc64-altivec.patch).

Thanks for the help!

But the error come from a C++ build :
In file included from output/build/supertux-0.5.1/external/tinygettext/src/dictionary_manager.cpp:30:0:
output/build/supertux-0.5.1/external/tinygettext/include/tinygettext/po_parser.hpp:50:96:
error: could not convert ?true? from ?bool? to ?__vector(4) __bool int?
POParser(const std::string& filename, std::istream& in_, Dictionary& dict_,
bool use_fuzzy = true);

What do you think about removing altivec.h from SDL_cpuinfo.h as suggested in the bug report ?

Otherwise, I'm not using a powerpc so we can keep altivec support disabled for now...

Best regards,
Romain

Quoted 32 lines

Cheers,
Sam.

Quoted 27 lines
---
 package/sdl2/sdl2.mk | 10 ++++++++++
 1 file changed, 10 insertions(+)
package/sdl2/sdl2.mk +10 -0
index d2ee50d..628d906 100644
@@ -23,6 +23,16 @@ SDL2_CONF_OPTS += \
 # We must enable static build to get compilation successful.
 SDL2_CONF_OPTS += --enable-static
 
+# From https://bugs.debian.org/cgi-bin/bugreport.cgi/?bug=770670
+# "The problem lies within SDL_cpuinfo.h.  It includes altivec.h, which by
+# definition provides an unconditional vector, pixel and bool define in
+# standard-c++ mode.  In GNU-c++ mode this names are only defined
+# context-sensitive by cpp.  SDL_cpuinfo.h is included by SDL.h.
+# Including altivec.h makes arbitrary code break."
+ifeq ($(BR2_POWERPC_CPU_HAS_ALTIVEC),y)
+SDL2_CONF_OPTS += --disable-altivec
+endif
+
 ifeq ($(BR2_PACKAGE_HAS_UDEV),y)
 SDL2_DEPENDENCIES += udev
 SDL2_CONF_OPTS += --enable-libudev
Signature · 1 line
2.9.3
#5 lore raw

PATCH v2 1/2 package/sdl2: disable altivec built-in function for PowerPC

Quoted 31 lines · Romain Naour

Hi Sam,

Le 01/03/2017 ? 03:13, Sam Bobroff a ?crit :

Quoted 9 lines · Romain Naour
Quoted 8 lines

As reported in this bug report [1], altivec support in SDL break arbitrary C++ code.

Issue reported by test-pkg script while testing supertux package:
error: could not convert 'true' from 'bool' to '__vector(4) __bool int'

[1] https://bugs.debian.org/cgi-bin/bugreport.cgi/?bug=770670

Quoted 8 lines
Quoted 2 lines

Hi Romain,

If you want to keep alitvec support on you can probably work around this problem by using -std=gnu99 (which I used for mpv, see package/mpv/0002-fix-powerpc64-altivec.patch).

Thanks for the help!

But the error come from a C++ build :
In file included from output/build/supertux-0.5.1/external/tinygettext/src/dictionary_manager.cpp:30:0:
output/build/supertux-0.5.1/external/tinygettext/include/tinygettext/po_parser.hpp:50:96:
error: could not convert ?true? from ?bool? to ?__vector(4) __bool int?
POParser(const std::string& filename, std::istream& in_, Dictionary& dict_,
bool use_fuzzy = true);

Quoted 8 lines

What do you think about removing altivec.h from SDL_cpuinfo.h as suggested in the bug report ?

Otherwise, I'm not using a powerpc so we can keep altivec support disabled for now...

Best regards,
Romain

Oh, I hadn't seen this with c++ before but I reproduced it easily when using -std=c++0x (as discussed in the bug report you linked).

Were you using that flag during your compile?

If you don't need c++0x, removing it might work around the problem but if you can't do that (or it doesn't work), and your problem is showing up in a non-altivec context (e.g. the code is expecting bool to be a normal bool) then I think you can #undef the re-defined keywords (the altivec header suggests that this is OK for C++). e.g.:

#include <altivec.h>
#undef bool
#undef vector
#undef pixel

Might work!

Cheers,
Sam.

#6 lore raw

PATCH v2 1/2 package/sdl2: disable altivec built-in function for PowerPC

Hi Sam,

Le 03/03/2017 ? 03:16, Sam Bobroff a ?crit :

Quoted 52 lines · Romain Naour
Quoted 31 lines

Hi Sam,

Le 01/03/2017 ? 03:13, Sam Bobroff a ?crit :

Quoted 9 lines · Romain Naour
Quoted 8 lines

As reported in this bug report [1], altivec support in SDL break arbitrary C++ code.

Issue reported by test-pkg script while testing supertux package:
error: could not convert 'true' from 'bool' to '__vector(4) __bool int'

[1] https://bugs.debian.org/cgi-bin/bugreport.cgi/?bug=770670

Quoted 8 lines
Quoted 2 lines

Hi Romain,

If you want to keep alitvec support on you can probably work around this problem by using -std=gnu99 (which I used for mpv, see package/mpv/0002-fix-powerpc64-altivec.patch).

Thanks for the help!

But the error come from a C++ build :
In file included from output/build/supertux-0.5.1/external/tinygettext/src/dictionary_manager.cpp:30:0:
output/build/supertux-0.5.1/external/tinygettext/include/tinygettext/po_parser.hpp:50:96:
error: could not convert ?true? from ?bool? to ?__vector(4) __bool int?
POParser(const std::string& filename, std::istream& in_, Dictionary& dict_,
bool use_fuzzy = true);

Quoted 8 lines

What do you think about removing altivec.h from SDL_cpuinfo.h as suggested in the bug report ?

Otherwise, I'm not using a powerpc so we can keep altivec support disabled for now...

Best regards,
Romain

Oh, I hadn't seen this with c++ before but I reproduced it easily when using -std=c++0x (as discussed in the bug report you linked).

Were you using that flag during your compile?

If you don't need c++0x, removing it might work around the problem but if you can't do that (or it doesn't work), and your problem is showing up in a non-altivec context (e.g. the code is expecting bool to be a normal bool) then I think you can #undef the re-defined keywords (the altivec header suggests that this is OK for C++). e.g.:

Quoted 6 lines

#include <altivec.h>
#undef bool
#undef vector
#undef pixel

Might work!

I believe it's a C++11 issue (-std=gnu++11 vs -std=c++11).

See the same issue has been fixed in stella package:
https://git.busybox.net/buildroot/commit/?id=0024465d8a7b51f7fc7c9e8581072695d869adca

I'll check if it work...

Best regards,
Romain

Quoted 4 lines

Cheers,
Sam.

#7 lore raw

PATCH v2 1/2 package/sdl2: disable altivec built-in function for PowerPC

In reply to Romain Naour

Hello,

Quoted 6 lines · Romain Naour

As reported in this bug report [1], altivec support in SDL break arbitrary C++ code.

Issue reported by test-pkg script while testing supertux package:
error: could not convert 'true' from 'bool' to '__vector(4) __bool int'

Quoted 7 lines

[1] https://bugs.debian.org/cgi-bin/bugreport.cgi/?bug=770670

---
 package/sdl2/sdl2.mk | 10 ++++++++++
 1 file changed, 10 insertions(+)

Applied to master, thanks.

Thomas

Signature · 3 lines
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com