Suppose that you have to hack a GStreamer element which requires a library that is not (yet) packaged by your distribution, nor wrapped as a Meson’s subproject. How do you do?
In our case, we needed the latest version of
Which are interrelated CMake projects.
For these cases, GStreamer’s uninstalled development scripts can use a special directory: gstreamer/prefix
. As the README.md says:
NOTE: In the development environment, a fully usable prefix is also configured in
gstreamer/prefix
where you can install any extra dependency/project.
This means that gstenv.py
script (the responsible of setting up the uninstalled development environment) will add
gstreamer/prefix/bin
inPATH
for executable files.gstreamer/prefix/lib
andgstreamer/prefix/share/gstreamer-1.0
inGST_PLUGIN_PATH
, for out-of-tree elements.gstreamer/prefix/lib
inGI_TYPELIB_PATH
for GObject Introspection metadata.gstreamer/prefix/lib/pkgconfig
inPKG_CONFIG_PATH
for third party dependencies (our case!)gstreamer/prefix/etc/xdg
forXDG_CONFIG_DIRS
for XDG compliant configuration files.gstreamer/prefix/lib
andgstreamer/prefix/lib64
inLD_LIBRARY_PATH
for third party libraries.
Therefore, the general idea, is to compile those third party libraries with their installation prefix as gstreamer/prefix
.
In our case, Vulkan repositories are interrelated so they need to be compiled in certain order. Also, we decided, for self-containment, to clone them in gstreamer/subprojects
.
Vulkan-Headers
$ cd ~/gst/gstreamer/subprojects
$ git clone git@github.com:KhronosGroup/Vulkan-Headers.git
$ cd Vulkan-Headers
$ mkdir build
$ cd build
$ cmake -GNinja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/home/vjaquez/gst/gstreamer/prefix ..
$ cmake --build . --install
Vulkan-Loader
$ cd ~/gst/gstreamer/subprojects
$ git clone git@github.com:KhronosGroup/Vulkan-Loader.git
$ cd Vulkan-Loader
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Debug -DVULKAN_HEADERS_INSTALL_DIR=/home/vjaquez/gst/gstreamer/prefix DCMAKE_INSTALL_PREFIX=/home/vjaquez/gst/gstreamer/prefix ..
$ cmake --build . --install
Vulkan-Tools
$ cd ~/gst/gstreamer/subprojects
$ git clone git@github.com:KhronosGroup/Vulkan-Tools.git
$ cd Vulkan-Tools
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Debug -DVULKAN_HEADERS_INSTALL_DIR=/home/vjaquez/gst/gstreamer/prefix DCMAKE_INSTALL_PREFIX=/home/vjaquez/gst/gstreamer/prefix ..
$ cmake --build . --install
Right now we have the Vulkan headers and the Vulkan loader pkg-config file in place. And we should be able to compile GStreamer. Right?
Not exactly, because gstenv.py
only sets the environment variables for the development environment, not for GStreamer compilation. But the solution is simple, because we have all set in the proper order: just to set PKG_CONFIG_PATH
when executing meson setup
:
$ PKG_CONFIG_PATH=/home/vjaquez/gst/gstreamer/prefix/lib/pkgconfig meson setup --buildtype=debug build