diff --git a/doc/stdenv/stdenv.xml b/doc/stdenv/stdenv.xml
index 65a343d7edd8..64fc91fabca2 100644
--- a/doc/stdenv/stdenv.xml
+++ b/doc/stdenv/stdenv.xml
@@ -2083,6 +2083,16 @@ postInstall = ''
+
+
+ validatePkgConfig
+
+
+
+ The validatePkgConfig hook validates all pkg-config (.pc) files in a package. This helps catching some common errors in pkg-config files, such as undefined variables.
+
+
+
cmake
diff --git a/pkgs/build-support/setup-hooks/validate-pkg-config.sh b/pkgs/build-support/setup-hooks/validate-pkg-config.sh
new file mode 100644
index 000000000000..54fc9cc122ca
--- /dev/null
+++ b/pkgs/build-support/setup-hooks/validate-pkg-config.sh
@@ -0,0 +1,19 @@
+# This setup hook validates each pkgconfig file in each output.
+
+fixupOutputHooks+=(_validatePkgConfig)
+
+_validatePkgConfig() {
+ for pc in $(find "$prefix" -name '*.pc'); do
+ local bail=0
+
+ # Do not fail immediately. It's nice to see all errors when
+ # there are multiple pkgconfig files.
+ if ! pkg-config --validate "$pc"; then
+ bail=1
+ fi
+ done
+
+ if [ $bail -eq 1 ]; then
+ exit 1
+ fi
+}
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 0db4b476682f..6fe9ebd39997 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -501,6 +501,10 @@ in
iconConvTools = callPackage ../build-support/icon-conv-tools {};
+ validatePkgConfig = makeSetupHook
+ { name = "validate-pkg-config"; deps = [ findutils pkgconfig ]; }
+ ../build-support/setup-hooks/validate-pkg-config.sh;
+
#package writers
writers = callPackage ../build-support/writers {};