pkgconf 2.4.3.post1__tar.gz → 2.4.3.post3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/.github/workflows/build.yml +7 -5
  2. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/.github/workflows/test.yml +9 -5
  3. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/PKG-INFO +3 -4
  4. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/README.md +1 -1
  5. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/meson.build +3 -1
  6. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/pyproject.toml +2 -3
  7. pkgconf-2.4.3.post3/src/pkgconf/__init__.py +103 -0
  8. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/src/pkgconf/__main__.py +6 -6
  9. pkgconf-2.4.3.post3/src/pkgconf/_path_entrypoints.py +266 -0
  10. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/src/pkgconf/diagnose.py +2 -2
  11. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/tests/conftest.py +7 -1
  12. pkgconf-2.4.3.post3/tests/packages/inplace/example/include/example.h +3 -0
  13. pkgconf-2.4.3.post3/tests/packages/inplace/example/pkgconf/example.pc +8 -0
  14. pkgconf-2.4.3.post3/tests/packages/inplace/pyproject.toml +13 -0
  15. pkgconf-2.4.3.post3/tests/packages/register-pkg-config-path/register_pkg_config_path/lib/__init__.py +0 -0
  16. pkgconf-2.4.3.post3/tests/packages/register-pkg-config-path/register_pkg_config_path/pkgconf/__init__.py +0 -0
  17. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/tests/test_entrypoints.py +1 -4
  18. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/tests/test_python_module.py +17 -0
  19. pkgconf-2.4.3.post3/update-upstream.py +84 -0
  20. pkgconf-2.4.3.post1/src/pkgconf/__init__.py +0 -150
  21. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/.gitmodules +0 -0
  22. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/.pre-commit-config.yaml +0 -0
  23. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/.readthedocs.yaml +0 -0
  24. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/LICENSE +0 -0
  25. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/codecov.yml +0 -0
  26. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/docs/conf.py +0 -0
  27. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/docs/index.rst +0 -0
  28. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/environment.yml +0 -0
  29. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/examples/header-only-library/example/include/example.h +0 -0
  30. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/examples/header-only-library/example/pkgconf/example.pc +0 -0
  31. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/examples/header-only-library/pyproject.toml +0 -0
  32. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/src/buildhack.py +0 -0
  33. /pkgconf-2.4.3.post1/tests/packages/register-pkg-config-path/register_pkg_config_path/__init__.py → /pkgconf-2.4.3.post3/src/pkgconf/py.typed +0 -0
  34. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/.gitattributes +0 -0
  35. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/.github/FUNDING.yml +0 -0
  36. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/.github/workflows/test.yml +0 -0
  37. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/.gitignore +0 -0
  38. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/.mailmap +0 -0
  39. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/.woodpecker.yml +0 -0
  40. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/AUTHORS +0 -0
  41. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/CODE_OF_CONDUCT.md +0 -0
  42. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/COPYING +0 -0
  43. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/Kyuafile.in +0 -0
  44. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/Makefile.am +0 -0
  45. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/Makefile.lite +0 -0
  46. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/NEWS +0 -0
  47. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/README.md +0 -0
  48. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/autogen.sh +0 -0
  49. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/cli/bomtool/main.c +0 -0
  50. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/cli/getopt_long.c +0 -0
  51. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/cli/getopt_long.h +0 -0
  52. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/cli/main.c +0 -0
  53. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/cli/renderer-msvc.c +0 -0
  54. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/cli/renderer-msvc.h +0 -0
  55. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/configure.ac +0 -0
  56. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/doc/conf.py +0 -0
  57. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/doc/extract.py +0 -0
  58. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/doc/index.rst +0 -0
  59. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/doc/libpkgconf-argvsplit.rst +0 -0
  60. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/doc/libpkgconf-audit.rst +0 -0
  61. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/doc/libpkgconf-cache.rst +0 -0
  62. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/doc/libpkgconf-client.rst +0 -0
  63. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/doc/libpkgconf-dependency.rst +0 -0
  64. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/doc/libpkgconf-fragment.rst +0 -0
  65. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/doc/libpkgconf-path.rst +0 -0
  66. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/doc/libpkgconf-personality.rst +0 -0
  67. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/doc/libpkgconf-pkg.rst +0 -0
  68. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/doc/libpkgconf-queue.rst +0 -0
  69. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/doc/libpkgconf-tuple.rst +0 -0
  70. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/doc/libpkgconf.rst +0 -0
  71. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/argvsplit.c +0 -0
  72. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/audit.c +0 -0
  73. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/bsdstubs.c +0 -0
  74. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/bsdstubs.h +0 -0
  75. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/buffer.c +0 -0
  76. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/cache.c +0 -0
  77. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/client.c +0 -0
  78. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/config.h.meson +0 -0
  79. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/dependency.c +0 -0
  80. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/fileio.c +0 -0
  81. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/fragment.c +0 -0
  82. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/iter.h +0 -0
  83. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/libpkgconf-api.h +0 -0
  84. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/libpkgconf.h +0 -0
  85. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/meson.build +0 -0
  86. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/parser.c +0 -0
  87. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/path.c +0 -0
  88. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/personality.c +0 -0
  89. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/pkg.c +0 -0
  90. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/queue.c +0 -0
  91. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/stdinc.h +0 -0
  92. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/tuple.c +0 -0
  93. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf/win-dirent.h +0 -0
  94. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/libpkgconf.pc.in +0 -0
  95. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/m4/ax_check_compile_flag.m4 +0 -0
  96. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/man/pc.5 +0 -0
  97. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/man/pkg.m4.7 +0 -0
  98. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/man/pkgconf-personality.5 +0 -0
  99. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/man/pkgconf.1 +0 -0
  100. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/meson.build +0 -0
  101. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/meson_options.txt +0 -0
  102. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/pkg.m4 +0 -0
  103. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/Kyuafile.in +0 -0
  104. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/basic.sh +0 -0
  105. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/builtins.sh +0 -0
  106. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/conflicts.sh +0 -0
  107. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/framework.sh +0 -0
  108. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib-relocatable/lib/pkgconfig/foo.pc +0 -0
  109. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/argv-parse-2.pc +0 -0
  110. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/argv-parse-3.pc +0 -0
  111. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/argv-parse.pc +0 -0
  112. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/bar.pc +0 -0
  113. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/baz.pc +0 -0
  114. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/billion-laughs.pc +0 -0
  115. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/c-comment.pc +0 -0
  116. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/case-sensitivity.pc +0 -0
  117. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/cflags-internal.pc +0 -0
  118. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/cflags-libs-only.pc +0 -0
  119. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/cflags-libs-private-a.pc +0 -0
  120. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/cflags-libs-private-b.pc +0 -0
  121. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/cflags-libs-private-c.pc +0 -0
  122. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/cflags-whitespace-trailing.pc +0 -0
  123. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/cflags-whitespace.pc +0 -0
  124. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/child-prefix/pkgconfig/child-prefix-1.pc +0 -0
  125. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/circular-1.pc +0 -0
  126. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/circular-2.pc +0 -0
  127. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/circular-3.pc +0 -0
  128. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/comments-in-fields.pc +0 -0
  129. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/comments.pc +0 -0
  130. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/conflicts.pc +0 -0
  131. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/depgraph-break.pc +0 -0
  132. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/dos-lineendings.pc +0 -0
  133. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/empty-tuple.pc +0 -0
  134. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/escaped-backslash.pc +0 -0
  135. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/explicit-sysroot.pc +0 -0
  136. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/flag-order-1.pc +0 -0
  137. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/flag-order-3.pc +0 -0
  138. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/foo.pc +0 -0
  139. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/foobar.pc +0 -0
  140. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/fragment-collision-1.pc +0 -0
  141. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/fragment-collision-2.pc +0 -0
  142. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/fragment-collision-intermediary.pc +0 -0
  143. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/fragment-collision.pc +0 -0
  144. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/fragment-comment.pc +0 -0
  145. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/fragment-escaping-1.pc +0 -0
  146. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/fragment-escaping-2.pc +0 -0
  147. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/fragment-escaping-3.pc +0 -0
  148. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/fragment-group-a.pc +0 -0
  149. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/fragment-group-b.pc +0 -0
  150. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/fragment-group-c.pc +0 -0
  151. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/fragment-groups-2.pc +0 -0
  152. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/fragment-groups.pc +0 -0
  153. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/fragment-quoting-2.pc +0 -0
  154. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/fragment-quoting-3.pc +0 -0
  155. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/fragment-quoting-5.pc +0 -0
  156. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/fragment-quoting-7.pc +0 -0
  157. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/fragment-quoting.pc +0 -0
  158. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/framework-1.pc +0 -0
  159. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/framework-2.pc +0 -0
  160. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/idirafter-ordering.pc +0 -0
  161. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/idirafter.pc +0 -0
  162. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/incomplete.pc +0 -0
  163. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/intermediary-1.pc +0 -0
  164. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/intermediary-2.pc +0 -0
  165. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/isystem.pc +0 -0
  166. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/malformed-1.pc +0 -0
  167. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/malformed-quoting.pc +0 -0
  168. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/malformed-version.pc +0 -0
  169. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/metapackage-1.pc +0 -0
  170. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/metapackage-2.pc +0 -0
  171. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/metapackage-3.pc +0 -0
  172. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/metapackage.pc +0 -0
  173. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/missing-require.pc +0 -0
  174. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/multiline-bogus.pc +0 -0
  175. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/multiline.pc +0 -0
  176. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/no-trailing-newline.pc +0 -0
  177. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/nocflag.pc +0 -0
  178. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/nolib.pc +0 -0
  179. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/omg-sysroot-uninstalled.pc +0 -0
  180. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/omg-uninstalled.pc +0 -0
  181. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/orphaned-requires-private.pc +0 -0
  182. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/paren-quoting.pc +0 -0
  183. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/pcfiledir.pc +0 -0
  184. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/prefix-foo1.pc +0 -0
  185. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/prefix-foo2.pc +0 -0
  186. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/private-libs-duplication.pc +0 -0
  187. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/provides-request-simple.pc +0 -0
  188. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/provides.pc +0 -0
  189. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/quotes.pc +0 -0
  190. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/requires-internal-2.pc +0 -0
  191. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/requires-internal-collision.pc +0 -0
  192. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/requires-internal-missing.pc +0 -0
  193. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/requires-internal.pc +0 -0
  194. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/spaces-in-paths.pc +0 -0
  195. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/static-archive-libs.pc +0 -0
  196. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/static-libs.pc +0 -0
  197. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/sysroot-dir-2.pc +0 -0
  198. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/sysroot-dir-3.pc +0 -0
  199. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/sysroot-dir-4.pc +0 -0
  200. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/sysroot-dir-5.pc +0 -0
  201. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/sysroot-dir.pc +0 -0
  202. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/tilde-quoting.pc +0 -0
  203. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/tilde.pc +0 -0
  204. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/truncated.pc +0 -0
  205. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/tuple-quoting.pc +0 -0
  206. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/typelibdir.pc +0 -0
  207. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/unavailable-provider.pc +0 -0
  208. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/utf8.pc +0 -0
  209. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib1/variable-whitespace.pc +0 -0
  210. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib2/foo.pc +0 -0
  211. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/lib3/bar.pc +0 -0
  212. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/meson.build +0 -0
  213. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/parser.sh +0 -0
  214. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/provides.sh +0 -0
  215. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/regress.sh +0 -0
  216. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/requires.sh +0 -0
  217. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/symlink.sh +0 -0
  218. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/sysroot.sh +0 -0
  219. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/test_env.sh.in +0 -0
  220. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/subprojects/pkgconf/tests/version.sh +0 -0
  221. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/tests/data/needs-example-lib.c +0 -0
  222. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/tests/packages/error-on-import/foo/__init__.py +0 -0
  223. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/tests/packages/error-on-import/foo/bar/__init__.py +0 -0
  224. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/tests/packages/error-on-import/meson.build +0 -0
  225. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/tests/packages/error-on-import/pyproject.toml +0 -0
  226. {pkgconf-2.4.3.post1/tests/packages/register-pkg-config-path/register_pkg_config_path/include → pkgconf-2.4.3.post3/tests/packages/inplace/example}/__init__.py +0 -0
  227. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/tests/packages/namespace/namespace/namespace.pc +0 -0
  228. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/tests/packages/namespace/pyproject.toml +0 -0
  229. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/tests/packages/register-pkg-config-path/lib.c +0 -0
  230. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/tests/packages/register-pkg-config-path/meson.build +0 -0
  231. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/tests/packages/register-pkg-config-path/pyproject.toml +0 -0
  232. {pkgconf-2.4.3.post1/tests/packages/register-pkg-config-path/register_pkg_config_path/lib → pkgconf-2.4.3.post3/tests/packages/register-pkg-config-path/register_pkg_config_path}/__init__.py +0 -0
  233. {pkgconf-2.4.3.post1/tests/packages/register-pkg-config-path/register_pkg_config_path/pkgconf → pkgconf-2.4.3.post3/tests/packages/register-pkg-config-path/register_pkg_config_path/include}/__init__.py +0 -0
  234. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/tests/packages/register-pkg-config-path/register_pkg_config_path/include/lib.h +0 -0
  235. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/tests/packages/register-pkg-config-path/register_pkg_config_path/pkgconf/register_pkg_config_path.pc +0 -0
  236. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/tests/packages/use-pybind11/meson.build +0 -0
  237. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/tests/test_diagnose.py +0 -0
  238. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/tests/test_distribution.py +0 -0
  239. {pkgconf-2.4.3.post1 → pkgconf-2.4.3.post3}/tests/test_examples.py +0 -0
@@ -33,15 +33,17 @@ jobs:
33
33
  matrix:
34
34
  os:
35
35
  - ubuntu-latest
36
+ - ubuntu-24.04-arm
36
37
  - windows-latest
37
- - macos-13
38
- - macos-14
38
+ - windows-11-arm
39
+ - macos-13 # x86-64
40
+ - macos-latest # arm64
39
41
  fail-fast: false
40
42
  steps:
41
43
  - uses: actions/checkout@v4
42
44
  with:
43
45
  submodules: true
44
- - uses: pypa/cibuildwheel@v2.18.1
46
+ - uses: pypa/cibuildwheel@2edf5784998b7b1ab70445baced23069e839541e # 3.0.0rc2
45
47
  - uses: actions/upload-artifact@v4
46
48
  if: always()
47
49
  with:
@@ -56,9 +58,9 @@ jobs:
56
58
  - uses: docker/setup-qemu-action@v3
57
59
  with:
58
60
  platforms: all
59
- - uses: pypa/cibuildwheel@v2.18.1
61
+ - uses: pypa/cibuildwheel@2edf5784998b7b1ab70445baced23069e839541e # 3.0.0rc2
60
62
  env:
61
- CIBW_ARCHS_LINUX: aarch64 ppc64le s390x
63
+ CIBW_ARCHS_LINUX: ppc64le s390x
62
64
  - uses: actions/upload-artifact@v4
63
65
  if: always()
64
66
  with:
@@ -15,19 +15,23 @@ concurrency:
15
15
 
16
16
  jobs:
17
17
  pytest:
18
- runs-on: ${{ matrix.os }}-latest
18
+ runs-on: ${{ matrix.os }}
19
19
  strategy:
20
20
  matrix:
21
21
  os:
22
- - ubuntu
23
- - windows
24
- - macos
22
+ - ubuntu-latest
23
+ - windows-latest
24
+ - windows-11-arm
25
+ - macos-latest
25
26
  python:
26
- - '3.9'
27
27
  - '3.10'
28
28
  - '3.11'
29
29
  - '3.12'
30
30
  - '3.13'
31
+ - '3.14-dev'
32
+ exclude:
33
+ - os: windows-11-arm
34
+ python: '3.10'
31
35
  fail-fast: false
32
36
  steps:
33
37
  - uses: actions/checkout@v4
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pkgconf
3
- Version: 2.4.3.post1
3
+ Version: 2.4.3.post3
4
4
  Summary: `pkgconf` is a program which helps with discovering library dependencies and configuring compiler and linker flags.
5
5
  Author-Email: Ralf Gommers <ralf.gommers@gmail.com>, =?utf-8?q?Filipe_La=C3=ADns?= <lains@riseup.net>
6
6
  License: Copyright (c) 2024 pypackaging-native contributors
@@ -36,9 +36,8 @@ Classifier: Operating System :: MacOS
36
36
  Project-URL: homepage, https://pkgconf-pypi.readthedocs.io/en/latest/
37
37
  Project-URL: issues, https://github.com/pypackaging-native/pkgconf-pypi/issues
38
38
  Project-URL: source, https://github.com/pypackaging-native/pkgconf-pypi
39
- Requires-Python: >=3.9
39
+ Requires-Python: >=3.10
40
40
  Requires-Dist: colorama; os_name == "nt"
41
- Requires-Dist: importlib_metadata; python_version < "3.10"
42
41
  Provides-Extra: test
43
42
  Requires-Dist: pytest; extra == "test"
44
43
  Requires-Dist: pytest-cov>=5; extra == "test"
@@ -64,7 +63,7 @@ Description-Content-Type: text/markdown
64
63
  [![PyPI version](https://badge.fury.io/py/pkgconf.svg)](https://pypi.org/project/pkgconf/)
65
64
  [![Discord](https://img.shields.io/discord/803025117553754132?label=Discord%20chat%20pkgconf-pypi)](https://discord.gg/pypa)
66
65
 
67
- This goal of this repo is to facility building and publishing of
66
+ This goal of this repo is to facilitate building and publishing of
68
67
  [pkgconf](https://github.com/pkgconf/pkgconf) binaries on PyPI, primarily for
69
68
  ease of installing in a cross-platform manner. This is useful when `pkgconf` is
70
69
  for example needed in workflows of other Python packages.
@@ -9,7 +9,7 @@
9
9
  [![PyPI version](https://badge.fury.io/py/pkgconf.svg)](https://pypi.org/project/pkgconf/)
10
10
  [![Discord](https://img.shields.io/discord/803025117553754132?label=Discord%20chat%20pkgconf-pypi)](https://discord.gg/pypa)
11
11
 
12
- This goal of this repo is to facility building and publishing of
12
+ This goal of this repo is to facilitate building and publishing of
13
13
  [pkgconf](https://github.com/pkgconf/pkgconf) binaries on PyPI, primarily for
14
14
  ease of installing in a cross-platform manner. This is useful when `pkgconf` is
15
15
  for example needed in workflows of other Python packages.
@@ -3,7 +3,7 @@
3
3
  # SPDX-License-Identifier: MIT
4
4
 
5
5
  project('pkgconf-pypi',
6
- version : '2.4.3-1',
6
+ version : '2.4.3-3',
7
7
  license : 'MIT AND ISC',
8
8
  license_files : ['LICENSE'],
9
9
  meson_version : '>=1.3.2',
@@ -16,7 +16,9 @@ py.install_sources(
16
16
  [
17
17
  'src/pkgconf/__init__.py',
18
18
  'src/pkgconf/__main__.py',
19
+ 'src/pkgconf/_path_entrypoints.py',
19
20
  'src/pkgconf/diagnose.py',
21
+ 'src/pkgconf/py.typed',
20
22
  ],
21
23
  subdir: 'pkgconf',
22
24
  )
@@ -11,7 +11,7 @@ requires = ['meson-python', 'wheel']
11
11
 
12
12
  [project]
13
13
  name = 'pkgconf'
14
- version = '2.4.3-1'
14
+ version = '2.4.3-3'
15
15
  description = '`pkgconf` is a program which helps with discovering library dependencies and configuring compiler and linker flags.'
16
16
  readme = 'README.md'
17
17
  license = {file = 'LICENSE'}
@@ -31,10 +31,9 @@ classifiers = [
31
31
  'Operating System :: Unix',
32
32
  'Operating System :: MacOS'
33
33
  ]
34
- requires-python = '>= 3.9'
34
+ requires-python = '>= 3.10'
35
35
  dependencies = [
36
36
  'colorama; os_name == "nt"',
37
- 'importlib_metadata; python_version < "3.10"',
38
37
  ]
39
38
 
40
39
  [project.optional-dependencies]
@@ -0,0 +1,103 @@
1
+ import logging
2
+ import os
3
+ import pathlib
4
+ import shlex
5
+ import shutil
6
+ import subprocess
7
+ import sysconfig
8
+ import warnings
9
+
10
+ from typing import Any
11
+
12
+ import pkgconf._path_entrypoints
13
+
14
+ from pkgconf._path_entrypoints import PathWarning
15
+
16
+
17
+ __version__ = '2.4.3-3'
18
+
19
+
20
+ _LOGGER = logging.getLogger(__name__)
21
+ _CLI_LOGGER = _LOGGER.getChild('cli')
22
+
23
+
24
+ def _get_system_executable() -> pathlib.Path | None:
25
+ if os.environ.get('PKGCONF_PYPI_EMBEDDED_ONLY'):
26
+ return None
27
+
28
+ scripts = sysconfig.get_path('scripts')
29
+ path_list = os.environ.get('PATH', os.defpath).split(os.pathsep)
30
+ if scripts in path_list:
31
+ path_list.remove(scripts)
32
+ path = os.pathsep.join(path_list)
33
+
34
+ executable = shutil.which('pkgconf', path=path) or shutil.which('pkg-config', path=path)
35
+ if executable:
36
+ return pathlib.Path(executable)
37
+ return None
38
+
39
+
40
+ def get_executable() -> pathlib.Path:
41
+ """Get the pkgconf executable."""
42
+ executable: pathlib.Path | None
43
+
44
+ if os.name == 'posix':
45
+ executable_name = 'pkgconf'
46
+ elif os.name == 'nt':
47
+ executable_name = 'pkgconf.EXE'
48
+ else:
49
+ raise NotImplementedError
50
+
51
+ for path in __path__:
52
+ executable = pathlib.Path(path) / '.bin' / executable_name
53
+ if executable.exists():
54
+ return executable
55
+
56
+ warnings.warn('Bundled pkgconf not found, using the system executable', stacklevel=2)
57
+ executable = _get_system_executable()
58
+ if executable:
59
+ return executable
60
+
61
+ msg = 'No pkgconf/pkg-config executable available'
62
+ raise RuntimeError(msg)
63
+
64
+
65
+ def _entry_points() -> list[pkgconf._path_entrypoints.EntryPoint]:
66
+ return pkgconf._path_entrypoints.entry_points(group='pkg_config')
67
+
68
+
69
+ def get_pkg_config_path() -> list[str]:
70
+ """Calculate PKG_CONFIG_PATH for Python packages in the current environment.
71
+
72
+ Python packages may register a directory for their pkg-config files by
73
+ specifying a "pkg-config" entrypoint.
74
+
75
+ TODO: Document the entrypoint creation and point to that here.
76
+ [project.entry-points.pkg-config]
77
+ entrypoint-name = 'project.package'
78
+ """
79
+ return [ep.path for ep in _entry_points()]
80
+
81
+
82
+ def run_pkgconf(*args: str, **subprocess_kwargs: Any) -> subprocess.CompletedProcess[bytes | str]:
83
+ """Run the pkgconf executable.
84
+
85
+ :param args: Arguments to pass to the pkgconf call.
86
+ :param subprocess_kwargs: Keyword arguments to pass to the subprocess.run call.
87
+ """
88
+ env = os.environ.copy()
89
+ PKG_CONFIG_PATH = env.get('PKG_CONFIG_PATH', '').split(os.pathsep) + get_pkg_config_path()
90
+ PKG_CONFIG_PATH = list(dict.fromkeys(PKG_CONFIG_PATH)) # Remove duplicated entried
91
+ env['PKG_CONFIG_PATH'] = os.pathsep.join(PKG_CONFIG_PATH)
92
+ cmd = [os.fspath(get_executable()), *args]
93
+ _CLI_LOGGER.info('Running the Python pkgconf')
94
+ _CLI_LOGGER.info('$ ' + shlex.join(('PKG_CONFIG_PATH=' + shlex.quote(env['PKG_CONFIG_PATH']), *cmd)))
95
+ return subprocess.run(cmd, env=env, **subprocess_kwargs)
96
+
97
+
98
+ __all__ = [
99
+ 'PathWarning',
100
+ 'get_executable',
101
+ 'get_pkg_config_path',
102
+ 'run_pkgconf',
103
+ ]
@@ -6,7 +6,7 @@ import sys
6
6
  import sysconfig
7
7
  import warnings
8
8
 
9
- from typing import Optional, TextIO, Union
9
+ from typing import TextIO
10
10
 
11
11
  import pkgconf
12
12
 
@@ -99,17 +99,17 @@ def _setup_cli():
99
99
 
100
100
  logging.basicConfig(
101
101
  stream=sys.stderr,
102
- format=f'{dim}> %(message)s{reset}',
103
- level=logging.INFO,
102
+ format=f'{dim}> %(message)s{reset} [%(levelname)s:%(name)s]',
104
103
  )
104
+ pkgconf._CLI_LOGGER.setLevel(logging.INFO)
105
105
 
106
106
  def _showwarning(
107
- message: Union[Warning, str],
107
+ message: Warning | str,
108
108
  category: type[Warning],
109
109
  filename: str,
110
110
  lineno: int,
111
- file: Optional[TextIO] = None,
112
- line: Optional[str] = None,
111
+ file: TextIO | None = None,
112
+ line: str | None = None,
113
113
  ) -> None: # pragma: no cover
114
114
  print(f'{yellow}WARNING{reset} {message}', file=sys.stderr)
115
115
 
@@ -0,0 +1,266 @@
1
+ import contextlib
2
+ import importlib.machinery
3
+ import importlib.metadata
4
+ import importlib.resources
5
+ import importlib.util
6
+ import operator
7
+ import os
8
+ import pathlib
9
+ import pickle
10
+ import sys
11
+ import types
12
+ import warnings
13
+
14
+ from collections.abc import Callable, Iterable
15
+ from typing import Any, ParamSpec, TypeVar
16
+
17
+ import pkgconf
18
+
19
+
20
+ P = ParamSpec('P')
21
+ T = TypeVar('T')
22
+
23
+
24
+ # Import system helpers
25
+
26
+
27
+ def import_module_no_exec(name: str) -> types.ModuleType:
28
+ """Return a module object with all the module attributes set, but without executing it.
29
+
30
+ WARNING: This places uninitialized modules in sys.modules.
31
+ """
32
+ if name in sys.modules:
33
+ return sys.modules[name]
34
+ # Import parent without execution
35
+ if parent := name.rpartition('.')[0]:
36
+ import_module_no_exec(parent)
37
+ # Find module spec
38
+ spec = importlib.util.find_spec(name)
39
+ if not spec:
40
+ msg = f'No module named {name!r}'
41
+ raise ModuleNotFoundError(msg)
42
+ # Create module object without executing, and save it sys.modules
43
+ module = sys.modules[name] = importlib.util.module_from_spec(spec)
44
+ return module
45
+
46
+
47
+ def module_path(name: str) -> str:
48
+ """Resolve module name to file-system path.
49
+
50
+ WARNING: This places uninitialized modules in sys.modules.
51
+ """
52
+ module = import_module_no_exec(name)
53
+ # Check if submodule_search_locations is set on the spec.
54
+ if module.__spec__.submodule_search_locations:
55
+ # If it contains a single path, use it.
56
+ if len(module.__spec__.submodule_search_locations) == 1:
57
+ return module.__spec__.submodule_search_locations[0]
58
+ # Traversables often implement __fspath__, attempt to use it.
59
+ traversable = importlib.resources.files(module)
60
+ if isinstance(traversable, os.PathLike):
61
+ return os.fsdecode(os.fspath(traversable))
62
+ # Give up :/
63
+ msg = f'Unable to resolve the path for {name}'
64
+ raise ValueError(msg)
65
+
66
+
67
+ # Helpers to run the import helpers isolated from the import state of the main process/interpreter
68
+
69
+ _subinterpreter = None
70
+
71
+
72
+ def run_in_subinterpreter(fn: Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> T:
73
+ """Run callable in a subinterpreter — using concurrent.interpreters."""
74
+ assert sys.version_info >= (3, 14)
75
+
76
+ import concurrent.interpreters
77
+
78
+ global _subinterpreter
79
+
80
+ if _subinterpreter is None:
81
+ _subinterpreter = concurrent.interpreters.create()
82
+
83
+ return _subinterpreter.call(fn, *args, **kwargs)
84
+
85
+
86
+ _worker = None
87
+ _WORKER_CODE = r"""
88
+ import sys, pickle
89
+
90
+ stdin, stdout = sys.stdin.buffer, sys.stdout.buffer
91
+
92
+ while True:
93
+ try:
94
+ length_data = stdin.read(4)
95
+ if not length_data:
96
+ break
97
+ length = int.from_bytes(length_data, "big")
98
+ payload = stdin.read(length)
99
+ fn, args, kwargs = pickle.loads(payload)
100
+ try:
101
+ result = fn(*args, **kwargs)
102
+ data = pickle.dumps((True, result))
103
+ except Exception as e:
104
+ data = pickle.dumps((False, e))
105
+ stdout.write(len(data).to_bytes(4, "big"))
106
+ stdout.write(data)
107
+ stdout.flush()
108
+ except Exception:
109
+ break
110
+ """
111
+
112
+
113
+ def _make_worker():
114
+ """Start worker subprocess and assign callable to _worker."""
115
+ global _worker
116
+ import subprocess
117
+
118
+ proc = subprocess.Popen(
119
+ [sys.executable, '-u', '-c', _WORKER_CODE],
120
+ stdin=subprocess.PIPE,
121
+ stdout=subprocess.PIPE,
122
+ )
123
+
124
+ def _worker_fn(fn: Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> T:
125
+ payload = pickle.dumps((fn, args, kwargs))
126
+ length = len(payload).to_bytes(4, 'big')
127
+
128
+ proc.stdin.write(length)
129
+ proc.stdin.write(payload)
130
+ proc.stdin.flush()
131
+
132
+ length_data = proc.stdout.read(4)
133
+ if not length_data:
134
+ msg = 'Subprocess died'
135
+ raise RuntimeError(msg)
136
+ resp_length = int.from_bytes(length_data, 'big')
137
+ data = proc.stdout.read(resp_length)
138
+ ok, value = pickle.loads(data)
139
+
140
+ if ok:
141
+ return value
142
+ else:
143
+ raise value
144
+
145
+ _worker = _worker_fn
146
+
147
+
148
+ def run_in_subprocess(fn: Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> T:
149
+ """Run callable in a subprocess."""
150
+ if _worker is None:
151
+ _make_worker()
152
+
153
+ return _worker(fn, *args, **kwargs)
154
+
155
+
156
+ def run_in_isolated_context(fn: Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> T:
157
+ try:
158
+ if sys.version_info >= (3, 14):
159
+ return run_in_subinterpreter(fn, *args, **kwargs)
160
+ except Exception:
161
+ pkgconf._LOGGER.exception(f'Failed to run {fn} in subinterpreter, falling back to subprocess')
162
+ return run_in_subprocess(fn, *args, **kwargs)
163
+
164
+
165
+ @contextlib.contextmanager
166
+ def replace_sys_modules() -> Iterable[None]:
167
+ original = sys.modules
168
+ sys.modules = original.copy()
169
+ try:
170
+ yield
171
+ finally:
172
+ sys.modules = original
173
+
174
+
175
+ # Entrypoint helpers
176
+
177
+
178
+ class EntryPoint:
179
+ def __init__(self, entrypoint: importlib.metadata.EntryPoint) -> None:
180
+ self._ep = entrypoint
181
+
182
+ @property
183
+ def name(self) -> str:
184
+ return self._ep.name
185
+
186
+ @property
187
+ def value(self) -> str:
188
+ return self._ep.value
189
+
190
+ @property
191
+ def group(self) -> str:
192
+ return self._ep.group
193
+
194
+ @property
195
+ def dist(self) -> importlib.metadata.Distribution | None:
196
+ return self._ep.dist
197
+
198
+ @property
199
+ def path(self) -> str:
200
+ try:
201
+ return self._resolve_via_import_system()
202
+ except Exception:
203
+ msg = 'Failed to resolve the entrypoint path via the import system (see log for details)'
204
+ pkgconf._LOGGER.exception(msg)
205
+ warnings.warn(PathWarning(msg, self), stacklevel=2)
206
+ # Fallback method
207
+ return self._resolve_via_translation()
208
+
209
+ def _resolve_via_import_system(self) -> str:
210
+ # module_path is not safe to run directly in the execution context, as
211
+ # it alters the import state, so try to run it in an isolated context.
212
+ try:
213
+ return run_in_isolated_context(module_path, self.value)
214
+ except Exception:
215
+ pkgconf._LOGGER.exception('Failed to run module_path in isolated context')
216
+ # Fallback to running in the current context, but try to save and
217
+ # restore the original import state.
218
+ with replace_sys_modules():
219
+ return module_path(self.value)
220
+
221
+ def _resolve_via_translation(self) -> str:
222
+ assert self.dist
223
+ subpath = pathlib.PurePath(*self.value.split('.'))
224
+ dist_path = self.dist.locate_file(subpath)
225
+ assert isinstance(dist_path, os.PathLike)
226
+ return os.fsdecode(os.fspath(dist_path))
227
+
228
+
229
+ def entry_points(**select_params: Any) -> list[EntryPoint]:
230
+ original_eps = importlib.metadata.entry_points(**select_params)
231
+ our_eps = map(EntryPoint, original_eps)
232
+ valid_eps = filter(operator.attrgetter('path'), our_eps)
233
+ return sorted(valid_eps, key=operator.attrgetter('name'))
234
+
235
+
236
+ class PathWarning(Warning):
237
+ def __init__(self, message: str, entrypoint: EntryPoint) -> None:
238
+ super().__init__(message)
239
+ self._entrypoint = entrypoint
240
+ self._logger = pkgconf._LOGGER.getChild(self.__class__.__name__)
241
+ self._logger.warning(
242
+ message,
243
+ extra={
244
+ 'entrypoint': self._entrypoint,
245
+ 'distribution': self._distribution_info(),
246
+ },
247
+ )
248
+
249
+ def _distribution_info(self) -> str:
250
+ assert self._entrypoint.dist
251
+ info = f'{self._entrypoint.dist.name}-{self._entrypoint.dist.version}'
252
+ if metadata_path := self._find_metadata_path():
253
+ info += f' at {metadata_path!r}'
254
+ return info
255
+
256
+ def _find_metadata_path(self) -> str | None:
257
+ assert self._entrypoint.dist
258
+ try:
259
+ dist_root = self._entrypoint.dist.locate_file('')
260
+ except NotImplementedError:
261
+ return None
262
+
263
+ for file in self._entrypoint.dist.files or []:
264
+ if file.parts[0].endswith('.dist-info'):
265
+ return str(dist_root / file.parts[0])
266
+ return None
@@ -7,10 +7,10 @@ def report() -> None:
7
7
  print(f'pkgconf executable: {pkgconf.get_executable()}')
8
8
 
9
9
  print('entrypoints:')
10
- for entrypoint in pkgconf._find_entrypoints():
10
+ for entrypoint in pkgconf._entry_points():
11
11
  print(f' {entrypoint.name}:')
12
12
  print(f' value: {entrypoint.value}')
13
- print(f' path: {pkgconf._resolve_entrypoint_path(entrypoint)}')
13
+ print(f' path: {entrypoint.path}')
14
14
 
15
15
  print(f'PKG_CONFIG_PATH: {os.pathsep.join(pkgconf.get_pkg_config_path())}')
16
16
 
@@ -41,7 +41,13 @@ def self_wheel(tmp_path_factory):
41
41
  @pytest.fixture
42
42
  def env(tmpdir, self_wheel):
43
43
  """Make a virtual environment with our project installed."""
44
- env = environment_helpers.create_venv(tmpdir, system_site_packages=True)
44
+ env = environment_helpers.create_venv(tmpdir)
45
+
46
+ # Write .pth file pointing to the current environment
47
+ current_env = environment_helpers.CurrentEnvironment()
48
+ purelib, platlib = current_env.scheme['purelib'], current_env.scheme['platlib']
49
+ env.scheme['purelib'].joinpath('base-env.pth').write_text(f'{purelib!s}\n{platlib!s}\n')
50
+
45
51
  env.install_wheel(self_wheel)
46
52
  return env
47
53
 
@@ -0,0 +1,3 @@
1
+ /* Some header-only library... */
2
+
3
+ #define FOO "bar"
@@ -0,0 +1,8 @@
1
+ prefix=${pcfiledir}/..
2
+ includedir=${prefix}/include
3
+
4
+ Name: example
5
+ Description: Example header library
6
+ Version: 1.0.0
7
+ Cflags: -I${includedir}
8
+ Libs:
@@ -0,0 +1,13 @@
1
+ [build-system]
2
+ build-backend = 'hatchling.build'
3
+ requires = ['hatchling']
4
+
5
+ [project]
6
+ name = 'example'
7
+ version = '1.0.0'
8
+
9
+ [project.entry-points.pkg_config]
10
+ example = 'example.pkgconf'
11
+
12
+ [tool.hatch.build.targets.wheel]
13
+ packages = ['example']
@@ -1,6 +1,4 @@
1
- import os
2
1
  import re
3
- import shutil
4
2
  import subprocess
5
3
  import sys
6
4
 
@@ -13,8 +11,7 @@ import pkgconf.__main__
13
11
  @pytest.mark.parametrize('name', ['pkgconf', 'pkg-config'])
14
12
  def test_entries(env, name):
15
13
  # TODO: Check PKG_CONFIG_PATH is correctly set
16
- path = shutil.which(name, path=env.scripts)
17
- help_text = subprocess.check_output([os.fspath(path), '--help'])
14
+ help_text = env.run_script('pkgconf', '--help')
18
15
  assert help_text.decode().startswith('usage: pkgconf')
19
16
 
20
17
 
@@ -1,5 +1,6 @@
1
1
  import os
2
2
  import pathlib
3
+ import shutil
3
4
  import subprocess
4
5
 
5
6
  import pytest
@@ -69,3 +70,19 @@ def test_get_executable_fallback_to_system(mocker):
69
70
  executable = pkgconf.get_executable()
70
71
 
71
72
  assert executable == pkgconf._get_system_executable()
73
+
74
+
75
+ def test_inplace_editable(env, tmp_path, packages, data):
76
+ dst = tmp_path / 'inplace'
77
+ shutil.copytree(packages / 'inplace', dst)
78
+
79
+ env.install(['-e', dst])
80
+
81
+ src = os.fspath(data / 'needs-example-lib.c')
82
+ bin = os.fspath(tmp_path / 'needs-example-lib')
83
+
84
+ cflags = env.run_interpreter('-m', 'pkgconf', '--cflags', 'example').decode().split()
85
+ subprocess.check_call(['gcc', '-o', bin, src, *cflags])
86
+ out = subprocess.check_output([bin])
87
+
88
+ assert out == b'bar'