diff mbox series

[1/2] package/sdl2: Fix Raspberry Pi support for SDL2

Message ID 20180116033450.6926-1-g@maral.me
State Changes Requested
Headers show
Series [1/2] package/sdl2: Fix Raspberry Pi support for SDL2 | expand

Commit Message

Guillermo A . Amaral Jan. 16, 2018, 3:34 a.m. UTC
Tweak build system to play well with Buildroot.

Signed-off-by: Guillermo A. Amaral <g@maral.me>
---
 .../sdl2/0001-sdl2-rpi-video-buildroot-fix.patch   | 90 ++++++++++++++++++++++
 package/sdl2/sdl2.mk                               |  8 +-
 2 files changed, 97 insertions(+), 1 deletion(-)
 create mode 100644 package/sdl2/0001-sdl2-rpi-video-buildroot-fix.patch

Comments

Thomas Petazzoni Jan. 16, 2018, 8:23 a.m. UTC | #1
Hello,

On Mon, 15 Jan 2018 19:34:49 -0800, Guillermo A. Amaral wrote:

> diff --git a/package/sdl2/0001-sdl2-rpi-video-buildroot-fix.patch b/package/sdl2/0001-sdl2-rpi-video-buildroot-fix.patch
> new file mode 100644
> index 000000000..1866579f1
> --- /dev/null
> +++ b/package/sdl2/0001-sdl2-rpi-video-buildroot-fix.patch
> @@ -0,0 +1,90 @@
> +From 76cb63afbe53c984c9734dc4f034c670791ca4d2 Mon Sep 17 00:00:00 2001
> +From: "Guillermo A. Amaral" <g@maral.me>
> +Date: Sun, 14 Jan 2018 23:01:47 -0800
> +Subject: [PATCH] sdl2: Get Raspberry Pi video working on Buildroot

It's not nice to have this specific to Buildroot. It shouldn't be that
way, and having it specific to Buildroot means that the patch cannot be
accepted upstream. See below for a suggestion on how to improve.

> + configure           |  8 +++++++-

Do you really need to patch the configure script? What about fixing
just configure.in, and using AUTORECONF = YES ?

> + configure.in        |  8 +++++++-
> + src/video/SDL_egl.c | 12 ++++++------
> + 3 files changed, 20 insertions(+), 8 deletions(-)
> +
> +diff --git a/configure.in b/configure.in
> +index 5ac2130..daee88b 100644
> +--- a/configure.in
> ++++ b/configure.in
> +@@ -1566,6 +1566,9 @@ AC_HELP_STRING([--enable-video-rpi], [use Raspberry Pi video driver [[default=ye
> +         if test x$ARCH = xnetbsd; then
> +             RPI_CFLAGS="-I/usr/pkg/include -I/usr/pkg/include/interface/vcos/pthreads -I/usr/pkg/include/interface/vmcs_host/linux"
> +             RPI_LDFLAGS="-Wl,-R/usr/pkg/lib -L/usr/pkg/lib -lbcm_host"
> ++        elif test x$VENDOR = xbuildroot; then
> ++            RPI_CFLAGS="-I${STAGING_DIR}/usr/include/interface/vcos/pthreads -I${STAGING_DIR}/usr/include/interface/vmcs_host/linux"
> ++            RPI_LDFLAGS="-L${STAGING_DIR}/usr/lib -lbcm_host -lvchostif"
> +         else
> +             RPI_CFLAGS="-I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux"
> +             RPI_LDFLAGS="-L/opt/vc/lib -lbcm_host"

Here is a different suggestion. In the "else", do the following:

	AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
	if test x$PKG_CONFIG != xno && $PKG_CONFIG --exists bcm_host; then
		RPI_CFLAGS=`$PKG_CONFIG --cflags bcm_host`
		RPI_LDFLAGS=`$PKG_CONFIG --libs bcm_host`
	else
		RPI_CFLAGS="-I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux"
		RPI_LDFLAGS="-L/opt/vc/lib -lbcm_host"
	fi

This should use pkg-config if available, and bcm_host is available as
pkg-config module, and if not default to the hardcoded path in /opt/vc.

> +@@ -3260,7 +3263,10 @@ case "$host" in
> +                     SUMMARY_video="${SUMMARY_video} android"
> +                 fi
> +                 ;;
> +-            *-*-linux*)         ARCH=linux ;;
> ++            *-*-linux*)
> ++                ARCH=linux
> ++                VENDOR=buildroot
> ++                ;;

It would make this change unneeded.

> + #if SDL_VIDEO_DRIVER_RPI
> + /* Raspbian places the OpenGL ES/EGL binaries in a non standard path */
> +-#define DEFAULT_EGL "/opt/vc/lib/libbrcmEGL.so"
> +-#define DEFAULT_OGL_ES2 "/opt/vc/lib/libbrcmGLESv2.so"
> +-#define ALT_EGL "/opt/vc/lib/libEGL.so"
> +-#define ALT_OGL_ES2 "/opt/vc/lib/libGLESv2.so"
> +-#define DEFAULT_OGL_ES_PVR "/opt/vc/lib/libGLES_CM.so"
> +-#define DEFAULT_OGL_ES "/opt/vc/lib/libGLESv1_CM.so"
> ++#define DEFAULT_EGL "libbrcmEGL.so"
> ++#define DEFAULT_OGL_ES2 "libbrcmGLESv2.so"
> ++#define ALT_EGL "libEGL.so"
> ++#define ALT_OGL_ES2 "libGLESv2.so"
> ++#define DEFAULT_OGL_ES_PVR "libGLES_CM.so"
> ++#define DEFAULT_OGL_ES "libGLESv1_CM.so"

I am not totally sure how to solve this though. I think the easiest
solution is for the configure script to fill in another variable, like
RPI_LIB_DIR. It would be set to empty in the pkg-config case, assuming
the libraries are in the right location, and set to /opt/vc/lib in the
hardcoded case. Or for the pkg-config case you do:

	RPI_LIB_DIR=`PKG_CONFIG_SYSROOT_DIR=/ $PKG_CONFIG --libs-only-L bcm_host | sed 's/^-L//'`

But I believe leaving it to empty is fine as well. Indeed dlopen()
automatically searches in the default library paths, and if the library
is not installed in the default location, it's up to the user to pass
LD_LIBRARY_PATH.

Best regards,

Thomas Petazzoni
Guillermo A . Amaral Jan. 16, 2018, 5:50 p.m. UTC | #2
Hi Thomas,

On Tue, Jan 16, 2018 at 09:23:41AM +0100, Thomas Petazzoni wrote:
> Hello,
> 
> On Mon, 15 Jan 2018 19:34:49 -0800, Guillermo A. Amaral wrote:
> 
> > diff --git a/package/sdl2/0001-sdl2-rpi-video-buildroot-fix.patch b/package/sdl2/0001-sdl2-rpi-video-buildroot-fix.patch
> > new file mode 100644
> > index 000000000..1866579f1
> > --- /dev/null
> > +++ b/package/sdl2/0001-sdl2-rpi-video-buildroot-fix.patch
> > @@ -0,0 +1,90 @@
> > +From 76cb63afbe53c984c9734dc4f034c670791ca4d2 Mon Sep 17 00:00:00 2001
> > +From: "Guillermo A. Amaral" <g@maral.me>
> > +Date: Sun, 14 Jan 2018 23:01:47 -0800
> > +Subject: [PATCH] sdl2: Get Raspberry Pi video working on Buildroot
> 
> It's not nice to have this specific to Buildroot. It shouldn't be that
> way, and having it specific to Buildroot means that the patch cannot be
> accepted upstream. See below for a suggestion on how to improve.

Agreed, I'll first try to upstream the changes to the project.

> > + configure           |  8 +++++++-
> 
> Do you really need to patch the configure script? What about fixing
> just configure.in, and using AUTORECONF = YES ?

I was not sure if that was the right way to go, so I left that off and
updated the configure script too just in case. I'll take that into
account for any future submissions.

> > + configure.in        |  8 +++++++-
> > + src/video/SDL_egl.c | 12 ++++++------
> > + 3 files changed, 20 insertions(+), 8 deletions(-)
> > +
> > +diff --git a/configure.in b/configure.in
> > +index 5ac2130..daee88b 100644
> > +--- a/configure.in
> > ++++ b/configure.in
> > +@@ -1566,6 +1566,9 @@ AC_HELP_STRING([--enable-video-rpi], [use Raspberry Pi video driver [[default=ye
> > +         if test x$ARCH = xnetbsd; then
> > +             RPI_CFLAGS="-I/usr/pkg/include -I/usr/pkg/include/interface/vcos/pthreads -I/usr/pkg/include/interface/vmcs_host/linux"
> > +             RPI_LDFLAGS="-Wl,-R/usr/pkg/lib -L/usr/pkg/lib -lbcm_host"
> > ++        elif test x$VENDOR = xbuildroot; then
> > ++            RPI_CFLAGS="-I${STAGING_DIR}/usr/include/interface/vcos/pthreads -I${STAGING_DIR}/usr/include/interface/vmcs_host/linux"
> > ++            RPI_LDFLAGS="-L${STAGING_DIR}/usr/lib -lbcm_host -lvchostif"
> > +         else
> > +             RPI_CFLAGS="-I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux"
> > +             RPI_LDFLAGS="-L/opt/vc/lib -lbcm_host"
> 
> Here is a different suggestion. In the "else", do the following:
> 
> 	AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
> 	if test x$PKG_CONFIG != xno && $PKG_CONFIG --exists bcm_host; then
> 		RPI_CFLAGS=`$PKG_CONFIG --cflags bcm_host`
> 		RPI_LDFLAGS=`$PKG_CONFIG --libs bcm_host`
> 	else
> 		RPI_CFLAGS="-I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux"
> 		RPI_LDFLAGS="-L/opt/vc/lib -lbcm_host"
> 	fi
> 
> This should use pkg-config if available, and bcm_host is available as
> pkg-config module, and if not default to the hardcoded path in /opt/vc.

Oh that's pretty good, I totally forgot about BRs pkg-config. I'll try
it out.

> > +@@ -3260,7 +3263,10 @@ case "$host" in
> > +                     SUMMARY_video="${SUMMARY_video} android"
> > +                 fi
> > +                 ;;
> > +-            *-*-linux*)         ARCH=linux ;;
> > ++            *-*-linux*)
> > ++                ARCH=linux
> > ++                VENDOR=buildroot
> > ++                ;;
> 
> It would make this change unneeded.
> 
> > + #if SDL_VIDEO_DRIVER_RPI
> > + /* Raspbian places the OpenGL ES/EGL binaries in a non standard path */
> > +-#define DEFAULT_EGL "/opt/vc/lib/libbrcmEGL.so"
> > +-#define DEFAULT_OGL_ES2 "/opt/vc/lib/libbrcmGLESv2.so"
> > +-#define ALT_EGL "/opt/vc/lib/libEGL.so"
> > +-#define ALT_OGL_ES2 "/opt/vc/lib/libGLESv2.so"
> > +-#define DEFAULT_OGL_ES_PVR "/opt/vc/lib/libGLES_CM.so"
> > +-#define DEFAULT_OGL_ES "/opt/vc/lib/libGLESv1_CM.so"
> > ++#define DEFAULT_EGL "libbrcmEGL.so"
> > ++#define DEFAULT_OGL_ES2 "libbrcmGLESv2.so"
> > ++#define ALT_EGL "libEGL.so"
> > ++#define ALT_OGL_ES2 "libGLESv2.so"
> > ++#define DEFAULT_OGL_ES_PVR "libGLES_CM.so"
> > ++#define DEFAULT_OGL_ES "libGLESv1_CM.so"
> 
> I am not totally sure how to solve this though. I think the easiest
> solution is for the configure script to fill in another variable, like
> RPI_LIB_DIR. It would be set to empty in the pkg-config case, assuming
> the libraries are in the right location, and set to /opt/vc/lib in the
> hardcoded case. Or for the pkg-config case you do:
> 
> 	RPI_LIB_DIR=`PKG_CONFIG_SYSROOT_DIR=/ $PKG_CONFIG --libs-only-L bcm_host | sed 's/^-L//'`
> 
> But I believe leaving it to empty is fine as well. Indeed dlopen()
> automatically searches in the default library paths, and if the library
> is not installed in the default location, it's up to the user to pass
> LD_LIBRARY_PATH.
> 

Right, sounds like a plan.

Thanks for reviewing the patch, I'll update it. I'll try to get upstream
as well.
diff mbox series

Patch

diff --git a/package/sdl2/0001-sdl2-rpi-video-buildroot-fix.patch b/package/sdl2/0001-sdl2-rpi-video-buildroot-fix.patch
new file mode 100644
index 000000000..1866579f1
--- /dev/null
+++ b/package/sdl2/0001-sdl2-rpi-video-buildroot-fix.patch
@@ -0,0 +1,90 @@ 
+From 76cb63afbe53c984c9734dc4f034c670791ca4d2 Mon Sep 17 00:00:00 2001
+From: "Guillermo A. Amaral" <g@maral.me>
+Date: Sun, 14 Jan 2018 23:01:47 -0800
+Subject: [PATCH] sdl2: Get Raspberry Pi video working on Buildroot
+
+Signed-off-by: Guillermo A. Amaral <g@maral.me>
+---
+ configure           |  8 +++++++-
+ configure.in        |  8 +++++++-
+ src/video/SDL_egl.c | 12 ++++++------
+ 3 files changed, 20 insertions(+), 8 deletions(-)
+
+diff --git a/configure b/configure
+index b622085..36e6623 100755
+--- a/configure
++++ b/configure
+@@ -19488,6 +19488,9 @@ fi
+         if test x$ARCH = xnetbsd; then
+             RPI_CFLAGS="-I/usr/pkg/include -I/usr/pkg/include/interface/vcos/pthreads -I/usr/pkg/include/interface/vmcs_host/linux"
+             RPI_LDFLAGS="-Wl,-R/usr/pkg/lib -L/usr/pkg/lib -lbcm_host"
++        elif test x$VENDOR = xbuildroot; then
++            RPI_CFLAGS="-I${STAGING_DIR}/usr/include/interface/vcos/pthreads -I${STAGING_DIR}/usr/include/interface/vmcs_host/linux"
++            RPI_LDFLAGS="-L${STAGING_DIR}/usr/lib -lbcm_host -lvchostif"
+         else
+             RPI_CFLAGS="-I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux"
+             RPI_LDFLAGS="-L/opt/vc/lib -lbcm_host"
+@@ -23739,7 +23742,10 @@ case "$host" in
+                     SUMMARY_video="${SUMMARY_video} android"
+                 fi
+                 ;;
+-            *-*-linux*)         ARCH=linux ;;
++            *-*-linux*)
++                ARCH=linux
++                VENDOR=buildroot
++                ;;
+             *-*-uclinux*)       ARCH=linux ;;
+             *-*-kfreebsd*-gnu)  ARCH=kfreebsd-gnu ;;
+             *-*-knetbsd*-gnu)   ARCH=knetbsd-gnu ;;
+diff --git a/configure.in b/configure.in
+index 5ac2130..daee88b 100644
+--- a/configure.in
++++ b/configure.in
+@@ -1566,6 +1566,9 @@ AC_HELP_STRING([--enable-video-rpi], [use Raspberry Pi video driver [[default=ye
+         if test x$ARCH = xnetbsd; then
+             RPI_CFLAGS="-I/usr/pkg/include -I/usr/pkg/include/interface/vcos/pthreads -I/usr/pkg/include/interface/vmcs_host/linux"
+             RPI_LDFLAGS="-Wl,-R/usr/pkg/lib -L/usr/pkg/lib -lbcm_host"
++        elif test x$VENDOR = xbuildroot; then
++            RPI_CFLAGS="-I${STAGING_DIR}/usr/include/interface/vcos/pthreads -I${STAGING_DIR}/usr/include/interface/vmcs_host/linux"
++            RPI_LDFLAGS="-L${STAGING_DIR}/usr/lib -lbcm_host -lvchostif"
+         else
+             RPI_CFLAGS="-I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux"
+             RPI_LDFLAGS="-L/opt/vc/lib -lbcm_host"
+@@ -3260,7 +3263,10 @@ case "$host" in
+                     SUMMARY_video="${SUMMARY_video} android"
+                 fi
+                 ;;
+-            *-*-linux*)         ARCH=linux ;;
++            *-*-linux*)
++                ARCH=linux
++                VENDOR=buildroot
++                ;;
+             *-*-uclinux*)       ARCH=linux ;;
+             *-*-kfreebsd*-gnu)  ARCH=kfreebsd-gnu ;;
+             *-*-knetbsd*-gnu)   ARCH=knetbsd-gnu ;;
+diff --git a/src/video/SDL_egl.c b/src/video/SDL_egl.c
+index 9ccc2c3..23a7f2d 100644
+--- a/src/video/SDL_egl.c
++++ b/src/video/SDL_egl.c
+@@ -44,12 +44,12 @@
+ 
+ #if SDL_VIDEO_DRIVER_RPI
+ /* Raspbian places the OpenGL ES/EGL binaries in a non standard path */
+-#define DEFAULT_EGL "/opt/vc/lib/libbrcmEGL.so"
+-#define DEFAULT_OGL_ES2 "/opt/vc/lib/libbrcmGLESv2.so"
+-#define ALT_EGL "/opt/vc/lib/libEGL.so"
+-#define ALT_OGL_ES2 "/opt/vc/lib/libGLESv2.so"
+-#define DEFAULT_OGL_ES_PVR "/opt/vc/lib/libGLES_CM.so"
+-#define DEFAULT_OGL_ES "/opt/vc/lib/libGLESv1_CM.so"
++#define DEFAULT_EGL "libbrcmEGL.so"
++#define DEFAULT_OGL_ES2 "libbrcmGLESv2.so"
++#define ALT_EGL "libEGL.so"
++#define ALT_OGL_ES2 "libGLESv2.so"
++#define DEFAULT_OGL_ES_PVR "libGLES_CM.so"
++#define DEFAULT_OGL_ES "libGLESv1_CM.so"
+ 
+ #elif SDL_VIDEO_DRIVER_ANDROID || SDL_VIDEO_DRIVER_VIVANTE
+ /* Android */
+-- 
+2.13.6
+
diff --git a/package/sdl2/sdl2.mk b/package/sdl2/sdl2.mk
index 3e3ba54aa..113e1063d 100644
--- a/package/sdl2/sdl2.mk
+++ b/package/sdl2/sdl2.mk
@@ -19,7 +19,6 @@  SDL2_CONF_OPTS += \
 	--disable-dbus \
 	--disable-pulseaudio \
 	--disable-video-wayland \
-	--disable-video-rpi
 
 # We must enable static build to get compilation successful.
 SDL2_CONF_OPTS += --enable-static
@@ -39,6 +38,13 @@  else
 SDL2_CONF_OPTS += --disable-video-directfb
 endif
 
+ifeq ($(BR2_PACKAGE_RPI_USERLAND),y)
+SDL2_DEPENDENCIES += rpi-userland
+SDL2_CONF_OPTS += --enable-video-rpi
+else
+SDL2_CONF_OPTS += --disable-video-rpi
+endif
+
 # x-includes and x-libraries must be set for cross-compiling
 # By default x_includes and x_libraries contains unsafe paths.
 # (/usr/X11R6/include and /usr/X11R6/lib)