Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[6.0] pkgconfig: Apply PKG_CONFIG_SYSROOTDIR when generating paths #7472

Merged
merged 1 commit into from
Apr 19, 2024

Conversation

euanh
Copy link
Contributor

@euanh euanh commented Apr 19, 2024

Cherry pick of #7461

SwiftPM's pkg-config implementation sets the pc_sysrootdir variable, but most .pc files do not use this variable directly. Instead, they rely on
the pkg-config tool rewriting the generated paths to include the sysroot prefix when necessary. SwiftPM does not do this, so it does not generate the correct compiler flags to use libraries from a sysroot.

This problem was reported in issue
#7409

There are two major pkg-config implementations which handle sysroot differently:

  • pkg-config (the original https://pkg-config.freedesktop.org implementation) prepends sysroot after variable expansion, when it creates the compiler flag lists

  • pkgconf (the newer http://pkgconf.org implementation) prepends sysroot to variables when they are defined, so sysroot is included when they are expanded

pkg-config's method skips single character compiler flags, such as -I
and -L, and has special cases for longer options. It does not handle spaces between the flags and their values properly, and prepends sysroot multiple times in some cases, such as when the .pc file uses the sysroot_dir variable directly or has been rewritten to hard-code the sysroot prefix.

pkgconf's method handles spaces correctly, although it also makes extra checks to ensure that sysroot is not applied more than once.

In 2024 pkg-config is the more popular option according to Homebrew installation statistics, but the major Linux distributions have generally
switched to pkgconf.

We will use pkgconf's method here as it seems more robust than pkg-config's, and pkgconf's greater popularity on Linux means libraries
developed there may depend on the specific way it handles .pc files.

SwiftPM will now apply the sysroot prefix to compiler flags, such as include (-I) and library (-L) search paths.

This is a partial fix for
#7409.

The sysroot prefix is only applied when the PKG_CONFIG_SYSROOT_DIR environment variable is set. A future commit could apply an appropriate sysroot automatically when the --experimental-swift-sdk flag is used.

Scope: Limited to packages relying on system libraries that utilize pkg-config.
Risk: Low, changes are isolated and the scope is limited to a small fraction of packages.
Testing: Automated with new test cases.
Issues: #7409
Reviewer: @MaxDesiatov.

SwiftPM's pkg-config implementation sets the `pc_sysrootdir` variable,
but most `.pc` files do not use this variable directly. Instead, they
rely on
the pkg-config tool rewriting the generated paths to include the sysroot
prefix when necessary. SwiftPM does not do this, so it does not generate
the correct compiler flags to use libraries from a sysroot.

This problem was reported in issue
apple#7409

There are two major pkg-config implementations which handle sysroot
differently:

  *  `pkg-config` (the original https://pkg-config.freedesktop.org
     implementation) prepends sysroot after variable expansion,
     when it creates the compiler flag lists

  *  `pkgconf` (the newer http://pkgconf.org implementation) prepends
     sysroot to variables when they are defined, so sysroot is included
     when they are expanded

`pkg-config`'s method skips single character compiler flags, such as
`-I`
and `-L`, and has special cases for longer options. It does not handle
spaces between the flags and their values properly, and prepends sysroot
multiple times in some cases, such as when the .pc file uses the
`sysroot_dir` variable directly or has been rewritten to hard-code the
sysroot prefix.

`pkgconf`'s method handles spaces correctly, although it also makes
extra checks to ensure that sysroot is not applied more than once.

In 2024 `pkg-config` is the more popular option according to Homebrew
installation statistics, but the major Linux distributions have
generally
switched to `pkgconf`.

We will use `pkgconf`'s method here as it seems more robust than
`pkg-config`'s, and `pkgconf`'s greater popularity on Linux means
libraries
developed there may depend on the specific way it handles `.pc` files.

SwiftPM will now apply the sysroot prefix to compiler flags, such as
include (`-I`) and library (`-L`) search paths.

This is a partial fix for
apple#7409.

The sysroot prefix is only applied when the `PKG_CONFIG_SYSROOT_DIR`
environment variable is set. A future commit could apply an appropriate
sysroot automatically when the `--experimental-swift-sdk` flag is used.
@euanh euanh changed the title [cherry pick] pkgconfig: Apply PKG_CONFIG_SYSROOTDIR when generating paths [6.0 cherry-pick] pkgconfig: Apply PKG_CONFIG_SYSROOTDIR when generating paths Apr 19, 2024
@euanh
Copy link
Contributor Author

euanh commented Apr 19, 2024

@swift-ci test

@euanh euanh enabled auto-merge (squash) April 19, 2024 11:01
@euanh euanh disabled auto-merge April 19, 2024 11:01
Copy link
Member

@MaxDesiatov MaxDesiatov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, but might need @bnbarham's review as a PR on the 6.0 branch.

@MaxDesiatov MaxDesiatov added bug swift 6.0 Related to Swift 6.0 release branch labels Apr 19, 2024
@MaxDesiatov MaxDesiatov changed the title [6.0 cherry-pick] pkgconfig: Apply PKG_CONFIG_SYSROOTDIR when generating paths [6.0] pkgconfig: Apply PKG_CONFIG_SYSROOTDIR when generating paths Apr 19, 2024
@MaxDesiatov MaxDesiatov merged commit 25ad105 into apple:release/6.0 Apr 19, 2024
5 checks passed
@euanh euanh deleted the 6.0-pkgconfig branch April 22, 2024 07:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug swift 6.0 Related to Swift 6.0 release branch
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants