[RFC] meson needs a pkg-config wrapper script


Joel Winarske
 

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


Alexander Kanavin
 

On Tue, 30 Nov 2021 at 18:20, Joel Winarske <joel.winarske@...> wrote:
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
https://mesonbuild.com/Reference-manual_functions.html#dependency and meson will take care of any needed prefixes to the paths.

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


Joel Winarske
 

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.

My proposed work around (this email thread) would fix the behavior.  I believe the proper fix is for meson to address upstream.  Still waiting on a response from them: https://github.com/mesonbuild/meson/issues/9674


Joel


On Tue, Nov 30, 2021 at 9:49 AM Alexander Kanavin <alex.kanavin@...> wrote:
On Tue, 30 Nov 2021 at 18:20, Joel Winarske <joel.winarske@...> wrote:
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
https://mesonbuild.com/Reference-manual_functions.html#dependency and meson will take care of any needed prefixes to the paths.

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


Alexander Kanavin
 

I do not quite understand the use case. What is being done with the full path to the header?

Alex


On Tue, 30 Nov 2021 at 19:26, Joel Winarske <joel.winarske@...> wrote:
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.

My proposed work around (this email thread) would fix the behavior.  I believe the proper fix is for meson to address upstream.  Still waiting on a response from them: https://github.com/mesonbuild/meson/issues/9674


Joel

On Tue, Nov 30, 2021 at 9:49 AM Alexander Kanavin <alex.kanavin@...> wrote:
On Tue, 30 Nov 2021 at 18:20, Joel Winarske <joel.winarske@...> wrote:
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
https://mesonbuild.com/Reference-manual_functions.html#dependency and meson will take care of any needed prefixes to the paths.

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


Joel Winarske
 

On Tue, Nov 30, 2021 at 10:53 AM Alexander Kanavin <alex.kanavin@...> wrote:
I do not quite understand the use case. What is being done with the full path to the header?

Alex

On Tue, 30 Nov 2021 at 19:26, Joel Winarske <joel.winarske@...> wrote:
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.

My proposed work around (this email thread) would fix the behavior.  I believe the proper fix is for meson to address upstream.  Still waiting on a response from them: https://github.com/mesonbuild/meson/issues/9674


Joel

On Tue, Nov 30, 2021 at 9:49 AM Alexander Kanavin <alex.kanavin@...> wrote:
On Tue, 30 Nov 2021 at 18:20, Joel Winarske <joel.winarske@...> wrote:
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
https://mesonbuild.com/Reference-manual_functions.html#dependency and meson will take care of any needed prefixes to the paths.

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


Alexander Kanavin
 

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?

Alex

On Tue, 30 Nov 2021 at 20:15, Joel Winarske <joel.winarske@...> wrote:

On Tue, Nov 30, 2021 at 10:53 AM Alexander Kanavin <alex.kanavin@...> wrote:
I do not quite understand the use case. What is being done with the full path to the header?

Alex

On Tue, 30 Nov 2021 at 19:26, Joel Winarske <joel.winarske@...> wrote:
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.

My proposed work around (this email thread) would fix the behavior.  I believe the proper fix is for meson to address upstream.  Still waiting on a response from them: https://github.com/mesonbuild/meson/issues/9674


Joel

On Tue, Nov 30, 2021 at 9:49 AM Alexander Kanavin <alex.kanavin@...> wrote:
On Tue, 30 Nov 2021 at 18:20, Joel Winarske <joel.winarske@...> wrote:
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
https://mesonbuild.com/Reference-manual_functions.html#dependency and meson will take care of any needed prefixes to the paths.

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


Joel Winarske
 

Yes, if the sys_root key value in meson.cross is present PKG_CONFIG_SYSROOT_DIR gets set.  Honister patch I confirmed with:
https://github.com/jwinarske/manifests/blob/honister/rpi64/0001-Add-sys_root-to-properties-section.patch

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.


On Tue, Nov 30, 2021 at 11:40 AM Alexander Kanavin <alex.kanavin@...> wrote:
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?

Alex

On Tue, 30 Nov 2021 at 20:15, Joel Winarske <joel.winarske@...> wrote:

On Tue, Nov 30, 2021 at 10:53 AM Alexander Kanavin <alex.kanavin@...> wrote:
I do not quite understand the use case. What is being done with the full path to the header?

Alex

On Tue, 30 Nov 2021 at 19:26, Joel Winarske <joel.winarske@...> wrote:
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.

My proposed work around (this email thread) would fix the behavior.  I believe the proper fix is for meson to address upstream.  Still waiting on a response from them: https://github.com/mesonbuild/meson/issues/9674


Joel

On Tue, Nov 30, 2021 at 9:49 AM Alexander Kanavin <alex.kanavin@...> wrote:
On Tue, 30 Nov 2021 at 18:20, Joel Winarske <joel.winarske@...> wrote:
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
https://mesonbuild.com/Reference-manual_functions.html#dependency and meson will take care of any needed prefixes to the paths.

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


Joel Winarske
 

Also all of the above requires this change: https://github.com/KhronosGroup/Vulkan-Loader/pull/756


On Tue, Nov 30, 2021 at 12:00 PM Joel Winarske <joel.winarske@...> wrote:
Yes, if the sys_root key value in meson.cross is present PKG_CONFIG_SYSROOT_DIR gets set.  Honister patch I confirmed with:
https://github.com/jwinarske/manifests/blob/honister/rpi64/0001-Add-sys_root-to-properties-section.patch

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.


On Tue, Nov 30, 2021 at 11:40 AM Alexander Kanavin <alex.kanavin@...> wrote:
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?

Alex

On Tue, 30 Nov 2021 at 20:15, Joel Winarske <joel.winarske@...> wrote:

On Tue, Nov 30, 2021 at 10:53 AM Alexander Kanavin <alex.kanavin@...> wrote:
I do not quite understand the use case. What is being done with the full path to the header?

Alex

On Tue, 30 Nov 2021 at 19:26, Joel Winarske <joel.winarske@...> wrote:
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.

My proposed work around (this email thread) would fix the behavior.  I believe the proper fix is for meson to address upstream.  Still waiting on a response from them: https://github.com/mesonbuild/meson/issues/9674


Joel

On Tue, Nov 30, 2021 at 9:49 AM Alexander Kanavin <alex.kanavin@...> wrote:
On Tue, 30 Nov 2021 at 18:20, Joel Winarske <joel.winarske@...> wrote:
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
https://mesonbuild.com/Reference-manual_functions.html#dependency and meson will take care of any needed prefixes to the paths.

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


Alexander Kanavin
 

On Tue, 30 Nov 2021 at 21:00, Joel Winarske <joel.winarske@...> wrote:
Yes, if the sys_root key value in meson.cross is present PKG_CONFIG_SYSROOT_DIR gets set.  Honister patch I confirmed with:
https://github.com/jwinarske/manifests/blob/honister/rpi64/0001-Add-sys_root-to-properties-section.patch

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


Ross Burton <ross@...>
 

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


Joel Winarske
 

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.


On Tue, Nov 30, 2021 at 12:13 PM Alexander Kanavin <alex.kanavin@...> wrote:
On Tue, 30 Nov 2021 at 21:00, Joel Winarske <joel.winarske@...> wrote:
Yes, if the sys_root key value in meson.cross is present PKG_CONFIG_SYSROOT_DIR gets set.  Honister patch I confirmed with:
https://github.com/jwinarske/manifests/blob/honister/rpi64/0001-Add-sys_root-to-properties-section.patch

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


Alexander Kanavin
 

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


On Tue, 30 Nov 2021 at 23:38, Joel Winarske <joel.winarske@...> wrote:
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.


On Tue, Nov 30, 2021 at 12:13 PM Alexander Kanavin <alex.kanavin@...> wrote:
On Tue, 30 Nov 2021 at 21:00, Joel Winarske <joel.winarske@...> wrote:
Yes, if the sys_root key value in meson.cross is present PKG_CONFIG_SYSROOT_DIR gets set.  Honister patch I confirmed with:
https://github.com/jwinarske/manifests/blob/honister/rpi64/0001-Add-sys_root-to-properties-section.patch

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

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

On Tue, 30 Nov 2021 at 23:38, Joel Winarske <joel.winarske@...> wrote:
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.


On Tue, Nov 30, 2021 at 12:13 PM Alexander Kanavin <alex.kanavin@...> wrote:
On Tue, 30 Nov 2021 at 21:00, Joel Winarske <joel.winarske@...> wrote:
Yes, if the sys_root key value in meson.cross is present PKG_CONFIG_SYSROOT_DIR gets set.  Honister patch I confirmed with:
https://github.com/jwinarske/manifests/blob/honister/rpi64/0001-Add-sys_root-to-properties-section.patch

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




Alexander Kanavin
 

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


On Wed, 1 Dec 2021 at 23:31, Joel Winarske <joel.winarske@...> wrote:
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

On Wed, Dec 1, 2021 at 12:36 AM Alexander Kanavin <alex.kanavin@...> 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

On Tue, 30 Nov 2021 at 23:38, Joel Winarske <joel.winarske@...> wrote:
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.


On Tue, Nov 30, 2021 at 12:13 PM Alexander Kanavin <alex.kanavin@...> wrote:
On Tue, 30 Nov 2021 at 21:00, Joel Winarske <joel.winarske@...> wrote:
Yes, if the sys_root key value in meson.cross is present PKG_CONFIG_SYSROOT_DIR gets set.  Honister patch I confirmed with:
https://github.com/jwinarske/manifests/blob/honister/rpi64/0001-Add-sys_root-to-properties-section.patch

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


Joel Winarske
 

Forgot the reply all, not intentional :)

Looks like the build is using the pkgconfig flavor: meta/recipes-devtools/pkgconfig/pkgconfig_git.bb

Perhaps I just need a PREFERRED_PROVIDER_pkgconfig ?= "pkg-config" and pkg-config recipe, then perhaps it will just work.

On Wed, Dec 1, 2021 at 2:39 PM Alexander Kanavin <alex.kanavin@...> wrote:
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

On Wed, 1 Dec 2021 at 23:31, Joel Winarske <joel.winarske@...> wrote:
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

On Wed, Dec 1, 2021 at 12:36 AM Alexander Kanavin <alex.kanavin@...> 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

On Tue, 30 Nov 2021 at 23:38, Joel Winarske <joel.winarske@...> wrote:
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.


On Tue, Nov 30, 2021 at 12:13 PM Alexander Kanavin <alex.kanavin@...> wrote:
On Tue, 30 Nov 2021 at 21:00, Joel Winarske <joel.winarske@...> wrote:
Yes, if the sys_root key value in meson.cross is present PKG_CONFIG_SYSROOT_DIR gets set.  Honister patch I confirmed with:
https://github.com/jwinarske/manifests/blob/honister/rpi64/0001-Add-sys_root-to-properties-section.patch

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


Joel Winarske
 

Actually the recipe pkgconfig_git.bb points to the freedesktop pkg-config repo, which is used by default.


On Wed, Dec 1, 2021 at 3:27 PM Joel Winarske via lists.openembedded.org <joel.winarske=gmail.com@...> wrote:
Forgot the reply all, not intentional :)

Looks like the build is using the pkgconfig flavor: meta/recipes-devtools/pkgconfig/pkgconfig_git.bb

Perhaps I just need a PREFERRED_PROVIDER_pkgconfig ?= "pkg-config" and pkg-config recipe, then perhaps it will just work.

On Wed, Dec 1, 2021 at 2:39 PM Alexander Kanavin <alex.kanavin@...> wrote:
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

On Wed, 1 Dec 2021 at 23:31, Joel Winarske <joel.winarske@...> wrote:
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

On Wed, Dec 1, 2021 at 12:36 AM Alexander Kanavin <alex.kanavin@...> 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

On Tue, 30 Nov 2021 at 23:38, Joel Winarske <joel.winarske@...> wrote:
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.


On Tue, Nov 30, 2021 at 12:13 PM Alexander Kanavin <alex.kanavin@...> wrote:
On Tue, 30 Nov 2021 at 21:00, Joel Winarske <joel.winarske@...> wrote:
Yes, if the sys_root key value in meson.cross is present PKG_CONFIG_SYSROOT_DIR gets set.  Honister patch I confirmed with:
https://github.com/jwinarske/manifests/blob/honister/rpi64/0001-Add-sys_root-to-properties-section.patch

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