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