Meson does not expose PKG_CONFIG_SYSROOT_DIR to the pkg-config process.
Currently meson.cross as generated in meson.bbclass points directly to the pkg-config executable (no wrapper script).
PKG_CONFIG_SYSROOT_DIR behaves like a simple string prepend to all package config variable queries. So if you want to determine the absolute path of a variable in .pc you set PKG_CONFIG_SYSROOT_DIR and make your query. Currently this is not possible with Yocto+Meson.
I think a simple wrapper script would resolve this. This is from https://autotools.io/pkgconfig/cross-compiling.html: #!/bin/sh
SYSROOT=/build/root
export PKG_CONFIG_PATH=
export PKG_CONFIG_LIBDIR=${SYSROOT}/usr/lib/pkgconfig:${SYSROOT}/usr/share/pkgconfig
export PKG_CONFIG_SYSROOT_DIR=${SYSROOT}
exec pkg-config "$@"
The wrapper script would be generated per recipe via meson.bbclass, meson.cross would then reference this wrapper instead of the pkg-config executable.
Thoughts?
Joel
|
|
Meson does not expose PKG_CONFIG_SYSROOT_DIR to the pkg-config process.
Currently meson.cross as generated in meson.bbclass points directly to the pkg-config executable (no wrapper script).
PKG_CONFIG_SYSROOT_DIR behaves like a simple string prepend to all package config variable queries. So if you want to determine the absolute path of a variable in .pc you set PKG_CONFIG_SYSROOT_DIR and make your query. Currently this is not possible with Yocto+Meson.
I think a simple wrapper script would resolve this. This is from https://autotools.io/pkgconfig/cross-compiling.html: #!/bin/sh
SYSROOT=/build/root
export PKG_CONFIG_PATH=
export PKG_CONFIG_LIBDIR=${SYSROOT}/usr/lib/pkgconfig:${SYSROOT}/usr/share/pkgconfig
export PKG_CONFIG_SYSROOT_DIR=${SYSROOT}
exec pkg-config "$@"
The wrapper script would be generated per recipe via meson.bbclass, meson.cross would then reference this wrapper instead of the pkg-config executable.
Thoughts?
I don't think this is correct. Meson's way of doing things is that you are not supposed to get the include/library paths directly from pkg-config, but rather use
For the custom variables defined in .pc that happen to contain paths, PKG_CONFIG_SYSROOT_DIR has no effect at all, so you need to manually prepend it anyway everywhere where they're used. pkg-config does not know what variable is a path and what isn't.
Alex
|
|
This pattern works to get the absolute path of the header:
Yocto EXTRA_OEMESON += "--prefix ${STAGING_DIR_TARGET}/usr" Meson vulkan_dep = dependency('vulkan') vulkan_hpp = join_paths([ vulkan_dep.get_pkgconfig_variable('includedir', define_variable: ['prefix', get_option('prefix')]), 'vulkan', 'vulkan.hpp' ]) Implementation in build/meson-log.txt Called `/b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/rpi4/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot-native/usr/bin/pkg-config --define-variable=prefix=/b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/rpi4/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot/usr --variable=includedir vulkan` -> 0
One would expect the following meson to work if STAGING_DIR_TARGET were set, as that's how pkg-config works:
vulkan_dep = dependency('vulkan') vulkan_hpp = join_paths([ vulkan_dep.get_pkgconfig_variable('includedir'), 'vulkan', 'vulkan.hpp' ])
This will always return /usr/include/vulkan/vulkan.hpp regardless of PKG_CONFIG_SYSROOT_DIR value. With PKG_CONFIG_SYSROOT_DIR set, it should be /usr/include/vulkan/vulkan.hpp with prepend of PKG_CONFIG_SYSROOT_DIR value.
Sandbox testing of pkg-config
$ export STAGING_DIR_TARGET=/b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/raspberrypi4-64/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot $ PKG_CONFIG_SYSROOT_DIR=$STAGING_DIR_TARGET pkg-config --define-variable=prefix=/opt --variable=includedir vulkan /b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/raspberrypi4-64/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot/opt/include
meson.cross
Setting sys_root in the properties section of meson.cross (patching meson.bbclass) indirectly sets PKG_CONFIG_SYSROOT_DIR. The setting of sys_root is present in nativesdk_meson*.bb, not meson*.bb.
The issue for meson is that they are not passing the PKG_CONFIG_SYSROOT_DIR variable to the shell that launches pkg-config.
Joel
toggle quoted message
Show quoted text
Meson does not expose PKG_CONFIG_SYSROOT_DIR to the pkg-config process.
Currently meson.cross as generated in meson.bbclass points directly to the pkg-config executable (no wrapper script).
PKG_CONFIG_SYSROOT_DIR behaves like a simple string prepend to all package config variable queries. So if you want to determine the absolute path of a variable in .pc you set PKG_CONFIG_SYSROOT_DIR and make your query. Currently this is not possible with Yocto+Meson.
I think a simple wrapper script would resolve this. This is from https://autotools.io/pkgconfig/cross-compiling.html: #!/bin/sh
SYSROOT=/build/root
export PKG_CONFIG_PATH=
export PKG_CONFIG_LIBDIR=${SYSROOT}/usr/lib/pkgconfig:${SYSROOT}/usr/share/pkgconfig
export PKG_CONFIG_SYSROOT_DIR=${SYSROOT}
exec pkg-config "$@"
The wrapper script would be generated per recipe via meson.bbclass, meson.cross would then reference this wrapper instead of the pkg-config executable.
Thoughts?
I don't think this is correct. Meson's way of doing things is that you are not supposed to get the include/library paths directly from pkg-config, but rather use
For the custom variables defined in .pc that happen to contain paths, PKG_CONFIG_SYSROOT_DIR has no effect at all, so you need to manually prepend it anyway everywhere where they're used. pkg-config does not know what variable is a path and what isn't.
Alex
|
|
I do not quite understand the use case. What is being done with the full path to the header?
Alex
toggle quoted message
Show quoted text
This pattern works to get the absolute path of the header:
Yocto EXTRA_OEMESON += "--prefix ${STAGING_DIR_TARGET}/usr" Meson vulkan_dep = dependency('vulkan') vulkan_hpp = join_paths([ vulkan_dep.get_pkgconfig_variable('includedir', define_variable: ['prefix', get_option('prefix')]), 'vulkan', 'vulkan.hpp' ]) Implementation in build/meson-log.txt Called `/b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/rpi4/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot-native/usr/bin/pkg-config --define-variable=prefix=/b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/rpi4/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot/usr --variable=includedir vulkan` -> 0
One would expect the following meson to work if STAGING_DIR_TARGET were set, as that's how pkg-config works:
vulkan_dep = dependency('vulkan') vulkan_hpp = join_paths([ vulkan_dep.get_pkgconfig_variable('includedir'), 'vulkan', 'vulkan.hpp' ])
This will always return /usr/include/vulkan/vulkan.hpp regardless of PKG_CONFIG_SYSROOT_DIR value. With PKG_CONFIG_SYSROOT_DIR set, it should be /usr/include/vulkan/vulkan.hpp with prepend of PKG_CONFIG_SYSROOT_DIR value.
Sandbox testing of pkg-config
$ export STAGING_DIR_TARGET=/b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/raspberrypi4-64/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot $ PKG_CONFIG_SYSROOT_DIR=$STAGING_DIR_TARGET pkg-config --define-variable=prefix=/opt --variable=includedir vulkan /b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/raspberrypi4-64/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot/opt/include
meson.cross
Setting sys_root in the properties section of meson.cross (patching meson.bbclass) indirectly sets PKG_CONFIG_SYSROOT_DIR. The setting of sys_root is present in nativesdk_meson*.bb, not meson*.bb.
The issue for meson is that they are not passing the PKG_CONFIG_SYSROOT_DIR variable to the shell that launches pkg-config.
Joel
Meson does not expose PKG_CONFIG_SYSROOT_DIR to the pkg-config process.
Currently meson.cross as generated in meson.bbclass points directly to the pkg-config executable (no wrapper script).
PKG_CONFIG_SYSROOT_DIR behaves like a simple string prepend to all package config variable queries. So if you want to determine the absolute path of a variable in .pc you set PKG_CONFIG_SYSROOT_DIR and make your query. Currently this is not possible with Yocto+Meson.
I think a simple wrapper script would resolve this. This is from https://autotools.io/pkgconfig/cross-compiling.html: #!/bin/sh
SYSROOT=/build/root
export PKG_CONFIG_PATH=
export PKG_CONFIG_LIBDIR=${SYSROOT}/usr/lib/pkgconfig:${SYSROOT}/usr/share/pkgconfig
export PKG_CONFIG_SYSROOT_DIR=${SYSROOT}
exec pkg-config "$@"
The wrapper script would be generated per recipe via meson.bbclass, meson.cross would then reference this wrapper instead of the pkg-config executable.
Thoughts?
I don't think this is correct. Meson's way of doing things is that you are not supposed to get the include/library paths directly from pkg-config, but rather use
For the custom variables defined in .pc that happen to contain paths, PKG_CONFIG_SYSROOT_DIR has no effect at all, so you need to manually prepend it anyway everywhere where they're used. pkg-config does not know what variable is a path and what isn't.
Alex
|
|
toggle quoted message
Show quoted text
I do not quite understand the use case. What is being done with the full path to the header?
Alex
This pattern works to get the absolute path of the header:
Yocto EXTRA_OEMESON += "--prefix ${STAGING_DIR_TARGET}/usr" Meson vulkan_dep = dependency('vulkan') vulkan_hpp = join_paths([ vulkan_dep.get_pkgconfig_variable('includedir', define_variable: ['prefix', get_option('prefix')]), 'vulkan', 'vulkan.hpp' ]) Implementation in build/meson-log.txt Called `/b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/rpi4/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot-native/usr/bin/pkg-config --define-variable=prefix=/b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/rpi4/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot/usr --variable=includedir vulkan` -> 0
One would expect the following meson to work if STAGING_DIR_TARGET were set, as that's how pkg-config works:
vulkan_dep = dependency('vulkan') vulkan_hpp = join_paths([ vulkan_dep.get_pkgconfig_variable('includedir'), 'vulkan', 'vulkan.hpp' ])
This will always return /usr/include/vulkan/vulkan.hpp regardless of PKG_CONFIG_SYSROOT_DIR value. With PKG_CONFIG_SYSROOT_DIR set, it should be /usr/include/vulkan/vulkan.hpp with prepend of PKG_CONFIG_SYSROOT_DIR value.
Sandbox testing of pkg-config
$ export STAGING_DIR_TARGET=/b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/raspberrypi4-64/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot $ PKG_CONFIG_SYSROOT_DIR=$STAGING_DIR_TARGET pkg-config --define-variable=prefix=/opt --variable=includedir vulkan /b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/raspberrypi4-64/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot/opt/include
meson.cross
Setting sys_root in the properties section of meson.cross (patching meson.bbclass) indirectly sets PKG_CONFIG_SYSROOT_DIR. The setting of sys_root is present in nativesdk_meson*.bb, not meson*.bb.
The issue for meson is that they are not passing the PKG_CONFIG_SYSROOT_DIR variable to the shell that launches pkg-config.
Joel
Meson does not expose PKG_CONFIG_SYSROOT_DIR to the pkg-config process.
Currently meson.cross as generated in meson.bbclass points directly to the pkg-config executable (no wrapper script).
PKG_CONFIG_SYSROOT_DIR behaves like a simple string prepend to all package config variable queries. So if you want to determine the absolute path of a variable in .pc you set PKG_CONFIG_SYSROOT_DIR and make your query. Currently this is not possible with Yocto+Meson.
I think a simple wrapper script would resolve this. This is from https://autotools.io/pkgconfig/cross-compiling.html: #!/bin/sh
SYSROOT=/build/root
export PKG_CONFIG_PATH=
export PKG_CONFIG_LIBDIR=${SYSROOT}/usr/lib/pkgconfig:${SYSROOT}/usr/share/pkgconfig
export PKG_CONFIG_SYSROOT_DIR=${SYSROOT}
exec pkg-config "$@"
The wrapper script would be generated per recipe via meson.bbclass, meson.cross would then reference this wrapper instead of the pkg-config executable.
Thoughts?
I don't think this is correct. Meson's way of doing things is that you are not supposed to get the include/library paths directly from pkg-config, but rather use
For the custom variables defined in .pc that happen to contain paths, PKG_CONFIG_SYSROOT_DIR has no effect at all, so you need to manually prepend it anyway everywhere where they're used. pkg-config does not know what variable is a path and what isn't.
Alex
|
|
I am seeing in mesonbuild/dependencies/pkgconfig.py
sysroot = environment.properties[for_machine].get_sys_root() if sysroot: env['PKG_CONFIG_SYSROOT_DIR'] = sysroo
So we probably need to ensure this 'sys_root' is correctly set, and then things will simply work?
toggle quoted message
Show quoted text
I do not quite understand the use case. What is being done with the full path to the header?
Alex
This pattern works to get the absolute path of the header:
Yocto EXTRA_OEMESON += "--prefix ${STAGING_DIR_TARGET}/usr" Meson vulkan_dep = dependency('vulkan') vulkan_hpp = join_paths([ vulkan_dep.get_pkgconfig_variable('includedir', define_variable: ['prefix', get_option('prefix')]), 'vulkan', 'vulkan.hpp' ]) Implementation in build/meson-log.txt Called `/b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/rpi4/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot-native/usr/bin/pkg-config --define-variable=prefix=/b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/rpi4/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot/usr --variable=includedir vulkan` -> 0
One would expect the following meson to work if STAGING_DIR_TARGET were set, as that's how pkg-config works:
vulkan_dep = dependency('vulkan') vulkan_hpp = join_paths([ vulkan_dep.get_pkgconfig_variable('includedir'), 'vulkan', 'vulkan.hpp' ])
This will always return /usr/include/vulkan/vulkan.hpp regardless of PKG_CONFIG_SYSROOT_DIR value. With PKG_CONFIG_SYSROOT_DIR set, it should be /usr/include/vulkan/vulkan.hpp with prepend of PKG_CONFIG_SYSROOT_DIR value.
Sandbox testing of pkg-config
$ export STAGING_DIR_TARGET=/b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/raspberrypi4-64/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot $ PKG_CONFIG_SYSROOT_DIR=$STAGING_DIR_TARGET pkg-config --define-variable=prefix=/opt --variable=includedir vulkan /b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/raspberrypi4-64/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot/opt/include
meson.cross
Setting sys_root in the properties section of meson.cross (patching meson.bbclass) indirectly sets PKG_CONFIG_SYSROOT_DIR. The setting of sys_root is present in nativesdk_meson*.bb, not meson*.bb.
The issue for meson is that they are not passing the PKG_CONFIG_SYSROOT_DIR variable to the shell that launches pkg-config.
Joel
Meson does not expose PKG_CONFIG_SYSROOT_DIR to the pkg-config process.
Currently meson.cross as generated in meson.bbclass points directly to the pkg-config executable (no wrapper script).
PKG_CONFIG_SYSROOT_DIR behaves like a simple string prepend to all package config variable queries. So if you want to determine the absolute path of a variable in .pc you set PKG_CONFIG_SYSROOT_DIR and make your query. Currently this is not possible with Yocto+Meson.
I think a simple wrapper script would resolve this. This is from https://autotools.io/pkgconfig/cross-compiling.html: #!/bin/sh
SYSROOT=/build/root
export PKG_CONFIG_PATH=
export PKG_CONFIG_LIBDIR=${SYSROOT}/usr/lib/pkgconfig:${SYSROOT}/usr/share/pkgconfig
export PKG_CONFIG_SYSROOT_DIR=${SYSROOT}
exec pkg-config "$@"
The wrapper script would be generated per recipe via meson.bbclass, meson.cross would then reference this wrapper instead of the pkg-config executable.
Thoughts?
I don't think this is correct. Meson's way of doing things is that you are not supposed to get the include/library paths directly from pkg-config, but rather use
For the custom variables defined in .pc that happen to contain paths, PKG_CONFIG_SYSROOT_DIR has no effect at all, so you need to manually prepend it anyway everywhere where they're used. pkg-config does not know what variable is a path and what isn't.
Alex
|
|
The issue is that meson doesn't pass PKG_CONFIG_SYSROOT_DIR to the shell environment that runs pkg-config, as with the pkg-config sandbox test it does work.
toggle quoted message
Show quoted text
I am seeing in mesonbuild/dependencies/pkgconfig.py
sysroot = environment.properties[for_machine].get_sys_root() if sysroot: env['PKG_CONFIG_SYSROOT_DIR'] = sysroo
So we probably need to ensure this 'sys_root' is correctly set, and then things will simply work?
I do not quite understand the use case. What is being done with the full path to the header?
Alex
This pattern works to get the absolute path of the header:
Yocto EXTRA_OEMESON += "--prefix ${STAGING_DIR_TARGET}/usr" Meson vulkan_dep = dependency('vulkan') vulkan_hpp = join_paths([ vulkan_dep.get_pkgconfig_variable('includedir', define_variable: ['prefix', get_option('prefix')]), 'vulkan', 'vulkan.hpp' ]) Implementation in build/meson-log.txt Called `/b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/rpi4/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot-native/usr/bin/pkg-config --define-variable=prefix=/b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/rpi4/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot/usr --variable=includedir vulkan` -> 0
One would expect the following meson to work if STAGING_DIR_TARGET were set, as that's how pkg-config works:
vulkan_dep = dependency('vulkan') vulkan_hpp = join_paths([ vulkan_dep.get_pkgconfig_variable('includedir'), 'vulkan', 'vulkan.hpp' ])
This will always return /usr/include/vulkan/vulkan.hpp regardless of PKG_CONFIG_SYSROOT_DIR value. With PKG_CONFIG_SYSROOT_DIR set, it should be /usr/include/vulkan/vulkan.hpp with prepend of PKG_CONFIG_SYSROOT_DIR value.
Sandbox testing of pkg-config
$ export STAGING_DIR_TARGET=/b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/raspberrypi4-64/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot $ PKG_CONFIG_SYSROOT_DIR=$STAGING_DIR_TARGET pkg-config --define-variable=prefix=/opt --variable=includedir vulkan /b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/raspberrypi4-64/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot/opt/include
meson.cross
Setting sys_root in the properties section of meson.cross (patching meson.bbclass) indirectly sets PKG_CONFIG_SYSROOT_DIR. The setting of sys_root is present in nativesdk_meson*.bb, not meson*.bb.
The issue for meson is that they are not passing the PKG_CONFIG_SYSROOT_DIR variable to the shell that launches pkg-config.
Joel
Meson does not expose PKG_CONFIG_SYSROOT_DIR to the pkg-config process.
Currently meson.cross as generated in meson.bbclass points directly to the pkg-config executable (no wrapper script).
PKG_CONFIG_SYSROOT_DIR behaves like a simple string prepend to all package config variable queries. So if you want to determine the absolute path of a variable in .pc you set PKG_CONFIG_SYSROOT_DIR and make your query. Currently this is not possible with Yocto+Meson.
I think a simple wrapper script would resolve this. This is from https://autotools.io/pkgconfig/cross-compiling.html: #!/bin/sh
SYSROOT=/build/root
export PKG_CONFIG_PATH=
export PKG_CONFIG_LIBDIR=${SYSROOT}/usr/lib/pkgconfig:${SYSROOT}/usr/share/pkgconfig
export PKG_CONFIG_SYSROOT_DIR=${SYSROOT}
exec pkg-config "$@"
The wrapper script would be generated per recipe via meson.bbclass, meson.cross would then reference this wrapper instead of the pkg-config executable.
Thoughts?
I don't think this is correct. Meson's way of doing things is that you are not supposed to get the include/library paths directly from pkg-config, but rather use
For the custom variables defined in .pc that happen to contain paths, PKG_CONFIG_SYSROOT_DIR has no effect at all, so you need to manually prepend it anyway everywhere where they're used. pkg-config does not know what variable is a path and what isn't.
Alex
|
|
toggle quoted message
Show quoted text
The issue is that meson doesn't pass PKG_CONFIG_SYSROOT_DIR to the shell environment that runs pkg-config, as with the pkg-config sandbox test it does work.
I am seeing in mesonbuild/dependencies/pkgconfig.py
sysroot = environment.properties[for_machine].get_sys_root() if sysroot: env['PKG_CONFIG_SYSROOT_DIR'] = sysroo
So we probably need to ensure this 'sys_root' is correctly set, and then things will simply work?
I do not quite understand the use case. What is being done with the full path to the header?
Alex
This pattern works to get the absolute path of the header:
Yocto EXTRA_OEMESON += "--prefix ${STAGING_DIR_TARGET}/usr" Meson vulkan_dep = dependency('vulkan') vulkan_hpp = join_paths([ vulkan_dep.get_pkgconfig_variable('includedir', define_variable: ['prefix', get_option('prefix')]), 'vulkan', 'vulkan.hpp' ]) Implementation in build/meson-log.txt Called `/b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/rpi4/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot-native/usr/bin/pkg-config --define-variable=prefix=/b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/rpi4/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot/usr --variable=includedir vulkan` -> 0
One would expect the following meson to work if STAGING_DIR_TARGET were set, as that's how pkg-config works:
vulkan_dep = dependency('vulkan') vulkan_hpp = join_paths([ vulkan_dep.get_pkgconfig_variable('includedir'), 'vulkan', 'vulkan.hpp' ])
This will always return /usr/include/vulkan/vulkan.hpp regardless of PKG_CONFIG_SYSROOT_DIR value. With PKG_CONFIG_SYSROOT_DIR set, it should be /usr/include/vulkan/vulkan.hpp with prepend of PKG_CONFIG_SYSROOT_DIR value.
Sandbox testing of pkg-config
$ export STAGING_DIR_TARGET=/b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/raspberrypi4-64/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot $ PKG_CONFIG_SYSROOT_DIR=$STAGING_DIR_TARGET pkg-config --define-variable=prefix=/opt --variable=includedir vulkan /b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/raspberrypi4-64/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot/opt/include
meson.cross
Setting sys_root in the properties section of meson.cross (patching meson.bbclass) indirectly sets PKG_CONFIG_SYSROOT_DIR. The setting of sys_root is present in nativesdk_meson*.bb, not meson*.bb.
The issue for meson is that they are not passing the PKG_CONFIG_SYSROOT_DIR variable to the shell that launches pkg-config.
Joel
Meson does not expose PKG_CONFIG_SYSROOT_DIR to the pkg-config process.
Currently meson.cross as generated in meson.bbclass points directly to the pkg-config executable (no wrapper script).
PKG_CONFIG_SYSROOT_DIR behaves like a simple string prepend to all package config variable queries. So if you want to determine the absolute path of a variable in .pc you set PKG_CONFIG_SYSROOT_DIR and make your query. Currently this is not possible with Yocto+Meson.
I think a simple wrapper script would resolve this. This is from https://autotools.io/pkgconfig/cross-compiling.html: #!/bin/sh
SYSROOT=/build/root
export PKG_CONFIG_PATH=
export PKG_CONFIG_LIBDIR=${SYSROOT}/usr/lib/pkgconfig:${SYSROOT}/usr/share/pkgconfig
export PKG_CONFIG_SYSROOT_DIR=${SYSROOT}
exec pkg-config "$@"
The wrapper script would be generated per recipe via meson.bbclass, meson.cross would then reference this wrapper instead of the pkg-config executable.
Thoughts?
I don't think this is correct. Meson's way of doing things is that you are not supposed to get the include/library paths directly from pkg-config, but rather use
For the custom variables defined in .pc that happen to contain paths, PKG_CONFIG_SYSROOT_DIR has no effect at all, so you need to manually prepend it anyway everywhere where they're used. pkg-config does not know what variable is a path and what isn't.
Alex
|
|
The issue is that meson doesn't pass PKG_CONFIG_SYSROOT_DIR to the shell environment that runs pkg-config, as with the pkg-config sandbox test it does work.
Both meson source code and its documentation indicate otherwise - if you set sys_root property, it will get passed to pkg-config via environment as PKG_CONFIG_SYSROOT_DIR:
Alex
|
|
On Tue, 30 Nov 2021 at 17:20, Joel Winarske <joel.winarske@...> wrote: PKG_CONFIG_SYSROOT_DIR behaves like a simple string prepend to all package config variable queries. So if you want to determine the absolute path of a variable in .pc you set PKG_CONFIG_SYSROOT_DIR and make your query. Currently this is not possible with Yocto+Meson. I should just point out that this is barely possible in a portable manner: pkgconfig and pkgconf have differing behaviour here, and they both consider their behaviour correct. So, good luck with getting absolute paths of variables when sysroots are involved. Ross
|
|
Based on my testing, if PKG_CONFIG_SYSROOT_DIR is set or not makes zero difference on the outcome. I suspect this is related to how pkg-config is launched by meson.
Looking at the meson source tree, in all ci/test cross compile
scenarios they reference a pkg-config wrapper. No cross compile
scenario I see referencing the 'pkgconfig' key uses a bare pkg-config.
cross/armclang-linux.txt:#pkgconfig = '/usr/bin/arm-linux-gnueabihf-pkg-config' cross/linux-mingw-w64-32bit.txt:pkgconfig = '/usr/bin/i686-w64-mingw32-pkg-config' cross/linux-mingw-w64-64bit.txt:pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config' cross/ubuntu-armhf.txt:pkgconfig = '/usr/bin/arm-linux-gnueabihf-pkg-config'
test cases/unit/33 cross file overrides always
args/ubuntu-armhf-overrides.txt:pkgconfig =
'/usr/bin/arm-linux-gnueabihf-pkg-config' test cases/unit/36 exe_wrapper behaviour/broken-cross.txt:pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config'
I think adding a wrapper makes sense.
toggle quoted message
Show quoted text
The issue is that meson doesn't pass PKG_CONFIG_SYSROOT_DIR to the shell environment that runs pkg-config, as with the pkg-config sandbox test it does work.
Both meson source code and its documentation indicate otherwise - if you set sys_root property, it will get passed to pkg-config via environment as PKG_CONFIG_SYSROOT_DIR:
Alex
|
|
No, it's not that. Even if you pass PKG_CONFIG_SYSROOT_DIR to pkg-config directly, it will apply that only to --cflags and similar, but not to generic --variable. Try this:
alex@alex-lx-laptop:~$ PKG_CONFIG_SYSROOT_DIR=/aaaa pkg-config libdrm --cflags -I/aaaa/usr/include/libdrm alex@alex-lx-laptop:~$ PKG_CONFIG_SYSROOT_DIR=/aaaa pkg-config libdrm --variable=includedir /usr/include
So a wrapper will not solve the 'includedir prefix' problem, and neither the wrapper, nor pkg-config or meson can possibly know which variable is a path, and which isn't - the only place where that is known is the component that obtains the variable. And so that's where it has to be prefixed.
Alex
toggle quoted message
Show quoted text
Based on my testing, if PKG_CONFIG_SYSROOT_DIR is set or not makes zero difference on the outcome. I suspect this is related to how pkg-config is launched by meson.
Looking at the meson source tree, in all ci/test cross compile
scenarios they reference a pkg-config wrapper. No cross compile
scenario I see referencing the 'pkgconfig' key uses a bare pkg-config.
cross/armclang-linux.txt:#pkgconfig = '/usr/bin/arm-linux-gnueabihf-pkg-config' cross/linux-mingw-w64-32bit.txt:pkgconfig = '/usr/bin/i686-w64-mingw32-pkg-config' cross/linux-mingw-w64-64bit.txt:pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config' cross/ubuntu-armhf.txt:pkgconfig = '/usr/bin/arm-linux-gnueabihf-pkg-config'
test cases/unit/33 cross file overrides always
args/ubuntu-armhf-overrides.txt:pkgconfig =
'/usr/bin/arm-linux-gnueabihf-pkg-config' test cases/unit/36 exe_wrapper behaviour/broken-cross.txt:pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config'
I think adding a wrapper makes sense.
The issue is that meson doesn't pass PKG_CONFIG_SYSROOT_DIR to the shell environment that runs pkg-config, as with the pkg-config sandbox test it does work.
Both meson source code and its documentation indicate otherwise - if you set sys_root property, it will get passed to pkg-config via environment as PKG_CONFIG_SYSROOT_DIR:
Alex
|
|

Eero Aaltonen
You can use `${pcfiledir}/../..` within a pkg-config file to reference the install path. Unfortunately the last time I tried it when cross-compiling, the PKG_CONFIG_SYSROOT_DIR was ended up in the path as a duplicate.
-Eero
toggle quoted message
Show quoted text
On Wed, 2021-12-01 at 09:36 +0100, Alexander Kanavin via lists.openembedded.org wrote: No, it's not that. Even if you pass PKG_CONFIG_SYSROOT_DIR to pkg-config directly, it will apply that only to --cflags and similar, but not to generic --variable. Try this:
alex@alex-lx-laptop:~$ PKG_CONFIG_SYSROOT_DIR=/aaaa pkg-config libdrm --cflags -I/aaaa/usr/include/libdrm alex@alex-lx-laptop:~$ PKG_CONFIG_SYSROOT_DIR=/aaaa pkg-config libdrm --variable=includedir /usr/include
So a wrapper will not solve the 'includedir prefix' problem, and neither the wrapper, nor pkg-config or meson can possibly know which variable is a path, and which isn't - the only place where that is known is the component that obtains the variable. And so that's where it has to be prefixed.
Alex
Based on my testing, if PKG_CONFIG_SYSROOT_DIR is set or not makes zero difference on the outcome. I suspect this is related to how pkg-config is launched by meson.
Looking at the meson source tree, in all ci/test cross compile
scenarios they reference a pkg-config wrapper. No cross compile
scenario I see referencing the 'pkgconfig' key uses a bare pkg-config.
cross/armclang-linux.txt:#pkgconfig = '/usr/bin/arm-linux-gnueabihf-pkg-config' cross/linux-mingw-w64-32bit.txt:pkgconfig = '/usr/bin/i686-w64-mingw32-pkg-config' cross/linux-mingw-w64-64bit.txt:pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config' cross/ubuntu-armhf.txt:pkgconfig = '/usr/bin/arm-linux-gnueabihf-pkg-config'
test cases/unit/33 cross file overrides always
args/ubuntu-armhf-overrides.txt:pkgconfig =
'/usr/bin/arm-linux-gnueabihf-pkg-config' test cases/unit/36 exe_wrapper behaviour/broken-cross.txt:pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config'
I think adding a wrapper makes sense.
The issue is that meson doesn't pass PKG_CONFIG_SYSROOT_DIR to the shell environment that runs pkg-config, as with the pkg-config sandbox test it does work.
Both meson source code and its documentation indicate otherwise - if you set sys_root property, it will get passed to pkg-config via environment as PKG_CONFIG_SYSROOT_DIR:
Alex
|
|
Please keep the conversation on the list.
Those are two different, independently developed projects: and they are not fully compatible as you have just shown.
I'm not sure how pkgconf is able to decide that includedir is a path (short of hardcoding that inside the source somewhere), but such logic needs to be carefully investigated before we make use of it, e.g. by switching to pkgconf in oe-core.
Alex
toggle quoted message
Show quoted text
pkg-config --version ?
Using 0.29.2 I get the same output as you: $ PKG_CONFIG_SYSROOT_DIR=$STAGING_DIR_TARGET /home/linuxbrew/.linuxbrew/bin/pkg-config --define-variable=prefix=/opt --variable=includedir glesv2 /usr/include
Using 1.7.3 it works: STAGING_DIR_TARGET=/b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/raspberrypi4-64/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot PKG_CONFIG_SYSROOT_DIR=$STAGING_DIR_TARGET /usr/bin/pkg-config --variable=includedir glesv2 /b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/raspberrypi4-64/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot/usr/include
$ /usr/bin/pkg-config --version 1.7.3
$ /home/linuxbrew/.linuxbrew/bin/pkg-config --version 0.29.2
No, it's not that. Even if you pass PKG_CONFIG_SYSROOT_DIR to pkg-config directly, it will apply that only to --cflags and similar, but not to generic --variable. Try this:
alex@alex-lx-laptop:~$ PKG_CONFIG_SYSROOT_DIR=/aaaa pkg-config libdrm --cflags -I/aaaa/usr/include/libdrm alex@alex-lx-laptop:~$ PKG_CONFIG_SYSROOT_DIR=/aaaa pkg-config libdrm --variable=includedir /usr/include
So a wrapper will not solve the 'includedir prefix' problem, and neither the wrapper, nor pkg-config or meson can possibly know which variable is a path, and which isn't - the only place where that is known is the component that obtains the variable. And so that's where it has to be prefixed.
Alex
Based on my testing, if PKG_CONFIG_SYSROOT_DIR is set or not makes zero difference on the outcome. I suspect this is related to how pkg-config is launched by meson.
Looking at the meson source tree, in all ci/test cross compile
scenarios they reference a pkg-config wrapper. No cross compile
scenario I see referencing the 'pkgconfig' key uses a bare pkg-config.
cross/armclang-linux.txt:#pkgconfig = '/usr/bin/arm-linux-gnueabihf-pkg-config' cross/linux-mingw-w64-32bit.txt:pkgconfig = '/usr/bin/i686-w64-mingw32-pkg-config' cross/linux-mingw-w64-64bit.txt:pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config' cross/ubuntu-armhf.txt:pkgconfig = '/usr/bin/arm-linux-gnueabihf-pkg-config'
test cases/unit/33 cross file overrides always
args/ubuntu-armhf-overrides.txt:pkgconfig =
'/usr/bin/arm-linux-gnueabihf-pkg-config' test cases/unit/36 exe_wrapper behaviour/broken-cross.txt:pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config'
I think adding a wrapper makes sense.
The issue is that meson doesn't pass PKG_CONFIG_SYSROOT_DIR to the shell environment that runs pkg-config, as with the pkg-config sandbox test it does work.
Both meson source code and its documentation indicate otherwise - if you set sys_root property, it will get passed to pkg-config via environment as PKG_CONFIG_SYSROOT_DIR:
Alex
|
|
Forgot the reply all, not intentional :)
Looks like the build is using the pkgconfig flavor: meta/recipes-devtools/pkgconfig/ pkgconfig_git.bbPerhaps I just need a PREFERRED_PROVIDER_pkgconfig ?= "pkg-config" and pkg-config recipe, then perhaps it will just work.
toggle quoted message
Show quoted text
Please keep the conversation on the list.
Those are two different, independently developed projects: and they are not fully compatible as you have just shown.
I'm not sure how pkgconf is able to decide that includedir is a path (short of hardcoding that inside the source somewhere), but such logic needs to be carefully investigated before we make use of it, e.g. by switching to pkgconf in oe-core.
Alex
pkg-config --version ?
Using 0.29.2 I get the same output as you: $ PKG_CONFIG_SYSROOT_DIR=$STAGING_DIR_TARGET /home/linuxbrew/.linuxbrew/bin/pkg-config --define-variable=prefix=/opt --variable=includedir glesv2 /usr/include
Using 1.7.3 it works: STAGING_DIR_TARGET=/b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/raspberrypi4-64/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot PKG_CONFIG_SYSROOT_DIR=$STAGING_DIR_TARGET /usr/bin/pkg-config --variable=includedir glesv2 /b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/raspberrypi4-64/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot/usr/include
$ /usr/bin/pkg-config --version 1.7.3
$ /home/linuxbrew/.linuxbrew/bin/pkg-config --version 0.29.2
No, it's not that. Even if you pass PKG_CONFIG_SYSROOT_DIR to pkg-config directly, it will apply that only to --cflags and similar, but not to generic --variable. Try this:
alex@alex-lx-laptop:~$ PKG_CONFIG_SYSROOT_DIR=/aaaa pkg-config libdrm --cflags -I/aaaa/usr/include/libdrm alex@alex-lx-laptop:~$ PKG_CONFIG_SYSROOT_DIR=/aaaa pkg-config libdrm --variable=includedir /usr/include
So a wrapper will not solve the 'includedir prefix' problem, and neither the wrapper, nor pkg-config or meson can possibly know which variable is a path, and which isn't - the only place where that is known is the component that obtains the variable. And so that's where it has to be prefixed.
Alex
Based on my testing, if PKG_CONFIG_SYSROOT_DIR is set or not makes zero difference on the outcome. I suspect this is related to how pkg-config is launched by meson.
Looking at the meson source tree, in all ci/test cross compile
scenarios they reference a pkg-config wrapper. No cross compile
scenario I see referencing the 'pkgconfig' key uses a bare pkg-config.
cross/armclang-linux.txt:#pkgconfig = '/usr/bin/arm-linux-gnueabihf-pkg-config' cross/linux-mingw-w64-32bit.txt:pkgconfig = '/usr/bin/i686-w64-mingw32-pkg-config' cross/linux-mingw-w64-64bit.txt:pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config' cross/ubuntu-armhf.txt:pkgconfig = '/usr/bin/arm-linux-gnueabihf-pkg-config'
test cases/unit/33 cross file overrides always
args/ubuntu-armhf-overrides.txt:pkgconfig =
'/usr/bin/arm-linux-gnueabihf-pkg-config' test cases/unit/36 exe_wrapper behaviour/broken-cross.txt:pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config'
I think adding a wrapper makes sense.
The issue is that meson doesn't pass PKG_CONFIG_SYSROOT_DIR to the shell environment that runs pkg-config, as with the pkg-config sandbox test it does work.
Both meson source code and its documentation indicate otherwise - if you set sys_root property, it will get passed to pkg-config via environment as PKG_CONFIG_SYSROOT_DIR:
Alex
|
|
Actually the recipe pkgconfig_git.bb points to the freedesktop pkg-config repo, which is used by default.
toggle quoted message
Show quoted text
Forgot the reply all, not intentional :)
Looks like the build is using the pkgconfig flavor: meta/recipes-devtools/pkgconfig/ pkgconfig_git.bbPerhaps I just need a PREFERRED_PROVIDER_pkgconfig ?= "pkg-config" and pkg-config recipe, then perhaps it will just work.
Please keep the conversation on the list.
Those are two different, independently developed projects: and they are not fully compatible as you have just shown.
I'm not sure how pkgconf is able to decide that includedir is a path (short of hardcoding that inside the source somewhere), but such logic needs to be carefully investigated before we make use of it, e.g. by switching to pkgconf in oe-core.
Alex
pkg-config --version ?
Using 0.29.2 I get the same output as you: $ PKG_CONFIG_SYSROOT_DIR=$STAGING_DIR_TARGET /home/linuxbrew/.linuxbrew/bin/pkg-config --define-variable=prefix=/opt --variable=includedir glesv2 /usr/include
Using 1.7.3 it works: STAGING_DIR_TARGET=/b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/raspberrypi4-64/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot PKG_CONFIG_SYSROOT_DIR=$STAGING_DIR_TARGET /usr/bin/pkg-config --variable=includedir glesv2 /b/github-ci/_work/meta-flutter/rpi4-drm-honister-latest/raspberrypi4-64/tmp/work/cortexa72-poky-linux/vkmark/git-r0/recipe-sysroot/usr/include
$ /usr/bin/pkg-config --version 1.7.3
$ /home/linuxbrew/.linuxbrew/bin/pkg-config --version 0.29.2
No, it's not that. Even if you pass PKG_CONFIG_SYSROOT_DIR to pkg-config directly, it will apply that only to --cflags and similar, but not to generic --variable. Try this:
alex@alex-lx-laptop:~$ PKG_CONFIG_SYSROOT_DIR=/aaaa pkg-config libdrm --cflags -I/aaaa/usr/include/libdrm alex@alex-lx-laptop:~$ PKG_CONFIG_SYSROOT_DIR=/aaaa pkg-config libdrm --variable=includedir /usr/include
So a wrapper will not solve the 'includedir prefix' problem, and neither the wrapper, nor pkg-config or meson can possibly know which variable is a path, and which isn't - the only place where that is known is the component that obtains the variable. And so that's where it has to be prefixed.
Alex
Based on my testing, if PKG_CONFIG_SYSROOT_DIR is set or not makes zero difference on the outcome. I suspect this is related to how pkg-config is launched by meson.
Looking at the meson source tree, in all ci/test cross compile
scenarios they reference a pkg-config wrapper. No cross compile
scenario I see referencing the 'pkgconfig' key uses a bare pkg-config.
cross/armclang-linux.txt:#pkgconfig = '/usr/bin/arm-linux-gnueabihf-pkg-config' cross/linux-mingw-w64-32bit.txt:pkgconfig = '/usr/bin/i686-w64-mingw32-pkg-config' cross/linux-mingw-w64-64bit.txt:pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config' cross/ubuntu-armhf.txt:pkgconfig = '/usr/bin/arm-linux-gnueabihf-pkg-config'
test cases/unit/33 cross file overrides always
args/ubuntu-armhf-overrides.txt:pkgconfig =
'/usr/bin/arm-linux-gnueabihf-pkg-config' test cases/unit/36 exe_wrapper behaviour/broken-cross.txt:pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config'
I think adding a wrapper makes sense.
The issue is that meson doesn't pass PKG_CONFIG_SYSROOT_DIR to the shell environment that runs pkg-config, as with the pkg-config sandbox test it does work.
Both meson source code and its documentation indicate otherwise - if you set sys_root property, it will get passed to pkg-config via environment as PKG_CONFIG_SYSROOT_DIR:
Alex
|
|