cross compiling gstreamer: sysroot + prefix and introspection?
Milian Wolff
milian.wolff at kdab.com
Thu Nov 21 16:01:00 UTC 2019
Hey all,
I tried to cross compile gstreamer and have succeeded, but it doesn't feel
right. I have tried the following with the latest 1.16.1 tarballs:
issue #1: instrospection not possible when cross compiling
```
cd gstreamer-1.16.1
./configure --target=arm-poky-linux-gnueabi --host=arm-poky-linux-gnueabi --
build=x86_64-linux --with-sysroot=/path/to/sdk/sysroots/cortexa7t2hf-neon-
vfpv4-poky-linux-gnueabi --prefix=/usr
...
make
...
Traceback (most recent call last):
File "/usr/bin/g-ir-scanner", line 100, in <module>
sys.exit(scanner_main(sys.argv))
File "/usr/lib/gobject-introspection/giscanner/scannermain.py", line 579, in
scanner_main
shlibs = create_binary(transformer, options, args)
File "/usr/lib/gobject-introspection/giscanner/scannermain.py", line 419, in
create_binary
shlibs = resolve_shlibs(options, binary, options.libraries)
File "/usr/lib/gobject-introspection/giscanner/shlibs.py", line 168, in
resolve_shlibs
_resolve_non_libtool(options, binary, non_libtool))
File "/usr/lib/gobject-introspection/giscanner/shlibs.py", line 104, in
_resolve_non_libtool
output = subprocess.check_output(args)
File "/usr/lib/python3.8/subprocess.py", line 411, in check_output
return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
File "/usr/lib/python3.8/subprocess.py", line 512, in run
raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['/bin/sh', '../libtool', '--
mode=execute', 'ldd', '/path/to/gstreamer-1.16.1/gst/tmp-introspectj0a4bz61/
Gst-1.0']' returned non-zero exit status 1.
make[4]: *** [Makefile:2281: Gst-1.0.gir] Error 1
```
How is introspection supposed to work in a cross compiled environment? ldd
doesn't work then, as it relies on "executing" the .so with the
LD_TRACE_LOADED_OBJECTS=1 env var set.
I then figured out I can disable that via `--enable-introspection=yes` -
should this be made the default when `--with-sysroot` is passed?
issue #2: installation prefix path not taking sysroot into account?
When I then compile without introspection, it all works but then in the end if
I do `make install` I get e.g.:
```
/usr/bin/install: cannot remove '/usr/lib/pkgconfig/gstreamer-1.0.pc':
Permission denied
```
Shouldn't the prefix be prefixed with the sysroot? What's worse, I cannot even
run `make DESTDIR=path/to/sysroot install` as I then end up with:
```
libtool: warning: relinking 'libgstbase-1.0.la'
libtool: install: (cd /home/milian/projects/kdab/smi/gstreamer-1.16.1/libs/
gst/base; /bin/sh "/home/milian/projects/kdab/smi/gstreamer-1.16.1/libtool"
--silent --tag CC --mode=relink arm-poky-linux-gnueabi-gcc -march=armv7ve -
mthumb -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=/ssd/
milian/projects/kdab/smi/sdk/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-
gnueabi -I../../../libs -I../../.. -I../../../libs -I../../.. -pthread
...
/path/to/sdk/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/
gcc/arm-poky-linux-gnueabi/8.2.0/ld: warning: library search path "/usr/lib"
is unsafe for cross-compilation
/usr/lib/libgcc_s.so.1: file not recognized: file format not recognized
collect2: error: ld returned 1 exit status
libtool: error: error: relink 'libgstbase-1.0.la' with the above command
before installing it
```
The only way I could make it work was by passing the sysroot-prefixed path
directly to `--prefix`, but that's unexpected to me.
To make things worse, when I then build e.g. `gst-plugins-base` I end up with:
```
cc1: warning: /path/to/sdk/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-
gnueabi/path/to/sdk/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/usr/
include/gstreamer-1.0: No such file or directory [-Wmissing-include-dirs]
cc1: warning: /path/to/sdk/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-
gnueabi/path/to/sdk/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/usr/
include/gstreamer-1.0: No such file or directory [-Wmissing-include-dirs]
gstvorbistag.c:37:10: fatal error: gst/gsttagsetter.h: No such file or
directory
#include <gst/gsttagsetter.h>
^~~~~~~~~~~~~~~~~~~~
```
Note that it duplicates the path here! as if it then takes the prefix and the
sysroot into account? I could workaround this by adding a symlink but that
really just feels even worse.
I feel like I'm doing something fundamentally wrong - could someone explain
the "correct" way of handling cross compiling gstreamer for me?
Thanks!
--
Milian Wolff | milian.wolff at kdab.com | Senior Software Engineer
KDAB (Deutschland) GmbH, a KDAB Group company
Tel: +49-30-521325470
KDAB - The Qt, C++ and OpenGL Experts
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 3826 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20191121/6c175875/attachment.bin>
More information about the gstreamer-devel
mailing list