diff mbox

[v2] gst1-av: fix cpu detection in libav configure

Message ID 1456701407-18377-1-git-send-email-arnout@mind.be
State Superseded
Headers show

Commit Message

Arnout Vandecappelle Feb. 28, 2016, 11:16 p.m. UTC
The configure script tries to guess a lot based on the cpu for which it
is configured. Without --cpu, it will use a 'generic' cpu and disable
any other options we pass to it.

In addition, we have to pass the --sysroot option like we do in the
ffmpeg package. This makes sure that regardless of the architecture
options that ffmpeg passes along, an external multilib toolchain
doesn't try to use a subdirectory of the sysroot. The libav build
system will pass a --isysroot argument which overrides the multilib
subdir.

Finally, we have to properly enable/disable the architecture-specific
optimisations. Autodetection of these things is completely borked in
the configure script.

Fixes:
http://autobuild.buildroot.net/results/ce83513135e7765c171353815947d715eb897d3d

Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
Cc: Vicente Olivert Riera <Vincent.Riera@imgtec.com>
---
v2: improve commit message

The --isysroot is something we should probably do in the toolchain
wrapper.
---
 package/gstreamer1/gst1-libav/gst1-libav.mk | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

Comments

Peter Korsgaard Feb. 29, 2016, 11:27 a.m. UTC | #1
>>>>> "Arnout" == Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be> writes:

 > The configure script tries to guess a lot based on the cpu for which it
 > is configured. Without --cpu, it will use a 'generic' cpu and disable
 > any other options we pass to it.

 > In addition, we have to pass the --sysroot option like we do in the
 > ffmpeg package. This makes sure that regardless of the architecture
 > options that ffmpeg passes along, an external multilib toolchain
 > doesn't try to use a subdirectory of the sysroot. The libav build
 > system will pass a --isysroot argument which overrides the multilib
 > subdir.

 > Finally, we have to properly enable/disable the architecture-specific
 > optimisations. Autodetection of these things is completely borked in
 > the configure script.

 > Fixes:
 > http://autobuild.buildroot.net/results/ce83513135e7765c171353815947d715eb897d3d

 > Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
 > Cc: Vicente Olivert Riera <Vincent.Riera@imgtec.com>
 > ---
 > v2: improve commit message

 > The --isysroot is something we should probably do in the toolchain
 > wrapper.

What is the advantage of --isysroot over --sysroot? I don't seem to find
a lot about in the gcc documentation, but it seems like:

- isysroot only applied to headers, not headers+libraries like --sysroot
- Some versions of MacOSX/llvm only support --isysroot, not --sysroot

Neither of these seems of much interest to us?
Peter Korsgaard Feb. 29, 2016, 9:49 p.m. UTC | #2
>>>>> "Arnout" == Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be> writes:

 > The configure script tries to guess a lot based on the cpu for which it
 > is configured. Without --cpu, it will use a 'generic' cpu and disable
 > any other options we pass to it.

 > In addition, we have to pass the --sysroot option like we do in the
 > ffmpeg package. This makes sure that regardless of the architecture
 > options that ffmpeg passes along, an external multilib toolchain
 > doesn't try to use a subdirectory of the sysroot. The libav build
 > system will pass a --isysroot argument which overrides the multilib
 > subdir.

 > Finally, we have to properly enable/disable the architecture-specific
 > optimisations. Autodetection of these things is completely borked in
 > the configure script.

 > Fixes:
 > http://autobuild.buildroot.net/results/ce83513135e7765c171353815947d715eb897d3d

 > Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
 > Cc: Vicente Olivert Riera <Vincent.Riera@imgtec.com>
 > ---
 > v2: improve commit message

 > The --isysroot is something we should probably do in the toolchain
 > wrapper.
 > ---
 >  package/gstreamer1/gst1-libav/gst1-libav.mk | 23 ++++++++++++++++++++++-
 >  1 file changed, 22 insertions(+), 1 deletion(-)

 > diff --git a/package/gstreamer1/gst1-libav/gst1-libav.mk b/package/gstreamer1/gst1-libav/gst1-libav.mk
 > index 3a987a7..97ff40f 100644
 > --- a/package/gstreamer1/gst1-libav/gst1-libav.mk
 > +++ b/package/gstreamer1/gst1-libav/gst1-libav.mk
 > @@ -10,7 +10,10 @@ GST1_LIBAV_SITE = http://gstreamer.freedesktop.org/src/gst-libav
 
 >  GST1_LIBAV_DEPENDENCIES = host-pkgconf gstreamer1 gst1-plugins-base
 
 > -GST1_LIBAV_CONF_EXTRA_OPTS = --cross-prefix=$(TARGET_CROSS) --target-os=linux
 > +GST1_LIBAV_CONF_EXTRA_OPTS = \
 > +	--cross-prefix=$(TARGET_CROSS) \
 > +	--target-os=linux \
 > +	--sysroot=$(STAGING_DIR)

What does this do exactly? As far as I can see this only sets the
sysinclude_default variable (which apparently isn't used anywhere?) and
passes --sysroot / --isysroot to the compiler, which should be a noop
for us as we already do that in the wrapper.
Arnout Vandecappelle March 1, 2016, 10:42 p.m. UTC | #3
On 02/29/16 12:27, Peter Korsgaard wrote:
>>>>>> "Arnout" == Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be> writes:
> 
>  > The configure script tries to guess a lot based on the cpu for which it
>  > is configured. Without --cpu, it will use a 'generic' cpu and disable
>  > any other options we pass to it.
> 
>  > In addition, we have to pass the --sysroot option like we do in the
>  > ffmpeg package. This makes sure that regardless of the architecture
>  > options that ffmpeg passes along, an external multilib toolchain
>  > doesn't try to use a subdirectory of the sysroot. The libav build
>  > system will pass a --isysroot argument which overrides the multilib
>  > subdir.
> 
>  > Finally, we have to properly enable/disable the architecture-specific
>  > optimisations. Autodetection of these things is completely borked in
>  > the configure script.
> 
>  > Fixes:
>  > http://autobuild.buildroot.net/results/ce83513135e7765c171353815947d715eb897d3d
> 
>  > Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
>  > Cc: Vicente Olivert Riera <Vincent.Riera@imgtec.com>
>  > ---
>  > v2: improve commit message
> 
>  > The --isysroot is something we should probably do in the toolchain
>  > wrapper.
> 
> What is the advantage of --isysroot over --sysroot? I don't seem to find
> a lot about in the gcc documentation, but it seems like:
> 
> - isysroot only applied to headers, not headers+libraries like --sysroot
> - Some versions of MacOSX/llvm only support --isysroot, not --sysroot
> 
> Neither of these seems of much interest to us?

 I actually didn't do proper research, i.e. I didn't consult the man page. I
just tried:

$ .../ext-toolchain/bin/mips-img-linux-gnu-gcc --sysroot
.../usr/mips64el-buildroot-linux-gnu/sysroot -mabi=64 -EL -std=gnu99 -I./ -D...
-Os -march=mips64r6 -std=c99 -fomit-frame-pointer -fPIC -mips64 -mips64r6
-msched-weight -mload-store-pairs -funroll-loops -mhard-float ... -c
libavformat/4xm.c
In file included from ./libavutil/intreadwrite.h:22:0,
                 from libavformat/4xm.c:30:
/gentoo/home2/arnout/br-out/libav/host/opt/ext-toolchain/lib/gcc/mips-img-linux-gnu/4.9.2/include/stdint.h:9:26:
fatal error: stdint.h: No such file or directory
 # include_next <stdint.h>
                          ^
compilation terminated.
$ .../ext-toolchain/bin/mips-img-linux-gnu-gcc --sysroot
.../usr/mips64el-buildroot-linux-gnu/sysroot --isysroot
.../usr/mips64el-buildroot-linux-gnu/sysroot -mabi=64 -EL -std=gnu99 -I./ -D...
-Os -march=mips64r6 -std=c99 -fomit-frame-pointer -fPIC -mips64 -mips64r6
-msched-weight -mload-store-pairs -funroll-loops -mhard-float ... -c
libavformat/4xm.c
$


 I was also surprised that this made a difference. Previously I had done a
-print-sysroot with all of these options and it added mipsel-r1-hard to the
sysroot, so somehow I assumed that isysroot would override that.

 So I ran with -v. With just --sysroot:

#include "..." search starts here:
#include <...> search starts here:
 .
 .../opt/ext-toolchain/bin/../lib/gcc/mips-img-linux-gnu/4.9.2/include
 .../opt/ext-toolchain/bin/../lib/gcc/mips-img-linux-gnu/4.9.2/include-fixed/mipsel-r6-hard/lib64
 .../opt/ext-toolchain/bin/../lib/gcc/mips-img-linux-gnu/4.9.2/../../../../mips-img-linux-gnu/include
End of search list.

 And with the --sysroot -isysroot:

#include "..." search starts here:
#include <...> search starts here:
.
 .../opt/ext-toolchain/bin/../lib/gcc/mips-img-linux-gnu/4.9.2/include
 .../opt/ext-toolchain/bin/../lib/gcc/mips-img-linux-gnu/4.9.2/include-fixed/mipsel-r6-hard/lib64
 .../opt/ext-toolchain/bin/../lib/gcc/mips-img-linux-gnu/4.9.2/../../../../mips-img-linux-gnu/include
 .../usr/mips64el-buildroot-linux-gnu/sysroot/usr/include
End of search list.


 So clearly it does make a difference...

 So I tried with my host-gcc as well, and both gcc-4.9 and gcc-5 work as
expected, i.e. they have the --sysroot in the search path.

 So it looks like this is actually a "feature" of the Codescape IMG toolchain.



 Coming back to the patch: the idea of passing --sysroot to configure comes from
the ffmpeg package itself. It has been like that in the ffmpeg package from the
first commit.

 Regards,
 Arnout
diff mbox

Patch

diff --git a/package/gstreamer1/gst1-libav/gst1-libav.mk b/package/gstreamer1/gst1-libav/gst1-libav.mk
index 3a987a7..97ff40f 100644
--- a/package/gstreamer1/gst1-libav/gst1-libav.mk
+++ b/package/gstreamer1/gst1-libav/gst1-libav.mk
@@ -10,7 +10,10 @@  GST1_LIBAV_SITE = http://gstreamer.freedesktop.org/src/gst-libav
 
 GST1_LIBAV_DEPENDENCIES = host-pkgconf gstreamer1 gst1-plugins-base
 
-GST1_LIBAV_CONF_EXTRA_OPTS = --cross-prefix=$(TARGET_CROSS) --target-os=linux
+GST1_LIBAV_CONF_EXTRA_OPTS = \
+	--cross-prefix=$(TARGET_CROSS) \
+	--target-os=linux \
+	--sysroot=$(STAGING_DIR)
 
 ifeq ($(BR2_PACKAGE_ZLIB),y)
 GST1_LIBAV_CONF_EXTRA_OPTS += --enable-zlib
@@ -26,6 +29,12 @@  else
 GST1_LIBAV_CONF_EXTRA_OPTS += --disable-bzlib
 endif
 
+ifneq ($(call qstrip,$(BR2_GCC_TARGET_CPU)),)
+GST1_LIBAV_CONF_EXTRA_OPTS += --cpu=$(BR2_GCC_TARGET_CPU)
+else ifneq ($(call qstrip,$(BR2_GCC_TARGET_ARCH)),)
+GST1_LIBAV_CONF_EXTRA_OPTS += --cpu=$(BR2_GCC_TARGET_ARCH)
+endif
+
 ifeq ($(BR2_X86_CPU_HAS_MMX),y)
 GST1_LIBAV_CONF_EXTRA_OPTS += --enable-yasm
 GST1_LIBAV_DEPENDENCIES += host-yasm
@@ -74,6 +83,18 @@  else
 GST1_LIBAV_CONF_EXTRA_OPTS += --disable-altivec
 endif
 
+# Since we don't have architecture options for the DSP ASE, always disable
+GST1_LIBAV_CONF_EXTRA_OPTS += --disable-mipsdspr1 --disable-mipsdspr2
+
+# We don't have mips32r5
+GST1_LIBAV_CONF_EXTRA_OPTS += --disable-mips32r5
+
+ifeq ($(BR2_mips_64r6),y)
+GST1_LIBAV_CONF_EXTRA_OPTS += --enable-mips64r6
+else
+GST1_LIBAV_CONF_EXTRA_OPTS += --disable-mips64r6
+endif
+
 GST1_LIBAV_CONF_OPTS = \
 	--with-libav-extra-configure="$(GST1_LIBAV_CONF_EXTRA_OPTS)"