--- /dev/null
+From 267a57022699453e8d8f517519df25ac6bf6ac4e Mon Sep 17 00:00:00 2001
+From: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
+Date: Sun, 16 Dec 2018 11:52:18 +0100
+Subject: [PATCH] Only prefix with the sysroot a subset of variables
+
+The standard logic of pkg-config is to prefix all absolute paths by
+the sysroot defined in PKG_CONFIG_SYSROOT_DIR. However, while some
+paths (like includedir, libdir, and paths used in -L and -I options)
+indeed need to be prefixed by the sysroot, it is not necessarily the
+case for paths that are used on the target. If they get prefixed by
+the sysroot, the runtime path on the target is incorrect.
+
+Unfortunately, pkg-config doesn't have a sense of which path needs to
+be prefixed by the sysroot, and which path should not be prefixed by
+the sysroot.
+
+So, let's simply have a whitelist of paths that should be prefixed:
+includedir, libdir, mapdir, pkgdatadir and sdkdir. This list of
+variables was collected over years of Buildroot development. All other
+paths are not prefixed by the sysroot.
+
+Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
+---
+ libpkgconf/tuple.c | 60 ++++++++++++++++++++++++++++++++--------------
+ 1 file changed, 42 insertions(+), 18 deletions(-)
+
+diff --git a/libpkgconf/tuple.c b/libpkgconf/tuple.c
+index 8523709..7cd2fff 100644
+--- a/libpkgconf/tuple.c
++++ b/libpkgconf/tuple.c
+@@ -160,6 +160,18 @@ dequote(const char *value)
+ return buf;
+ }
+
++static char *
++pkgconf_tuple_parse_sysroot(const pkgconf_client_t *client, pkgconf_list_t *vars, const char *value, bool add_sysroot);
++
++const char *sysrooted_keys[] = {
++ "includedir",
++ "libdir",
++ "mapdir",
++ "pkgdatadir",
++ "sdkdir",
++ NULL,
++};
++
+ /*
+ * !doc
+ *
+@@ -180,6 +192,8 @@ pkgconf_tuple_add(const pkgconf_client_t *client, pkgconf_list_t *list, const ch
+ {
+ char *dequote_value;
+ pkgconf_tuple_t *tuple = calloc(sizeof(pkgconf_tuple_t), 1);
++ bool add_sysroot = false;
++ int i;
+
+ pkgconf_tuple_find_delete(list, key);
+
+@@ -187,9 +201,13 @@ pkgconf_tuple_add(const pkgconf_client_t *client, pkgconf_list_t *list, const ch
+
+ PKGCONF_TRACE(client, "adding tuple to @%p: %s => %s (parsed? %d)", list, key, dequote_value, parse);
+
++ for (i = 0; sysrooted_keys[i] != NULL; i++)
++ if (!strcmp(key, sysrooted_keys[i]))
++ add_sysroot = true;
++
+ tuple->key = strdup(key);
+ if (parse)
+- tuple->value = pkgconf_tuple_parse(client, list, dequote_value);
++ tuple->value = pkgconf_tuple_parse_sysroot(client, list, dequote_value, add_sysroot);
+ else
+ tuple->value = strdup(dequote_value);
+
+@@ -233,27 +251,14 @@ pkgconf_tuple_find(const pkgconf_client_t *client, pkgconf_list_t *list, const c
+ return NULL;
+ }
+
+-/*
+- * !doc
+- *
+- * .. c:function:: char *pkgconf_tuple_parse(const pkgconf_client_t *client, pkgconf_list_t *vars, const char *value)
+- *
+- * Parse an expression for variable substitution.
+- *
+- * :param pkgconf_client_t* client: The pkgconf client object to access.
+- * :param pkgconf_list_t* list: The variable list to search for variables (along side the global variable list).
+- * :param char* value: The ``key=value`` string to parse.
+- * :return: the variable data with any variables substituted
+- * :rtype: char *
+- */
+-char *
+-pkgconf_tuple_parse(const pkgconf_client_t *client, pkgconf_list_t *vars, const char *value)
++static char *
++pkgconf_tuple_parse_sysroot(const pkgconf_client_t *client, pkgconf_list_t *vars, const char *value, bool add_sysroot)
+ {
+ char buf[PKGCONF_BUFSIZE];
+ const char *ptr;
+ char *bptr = buf;
+
+- if (*value == '/' && client->sysroot_dir != NULL && strncmp(value, client->sysroot_dir, strlen(client->sysroot_dir)))
++ if (add_sysroot && *value == '/' && client->sysroot_dir != NULL && strncmp(value, client->sysroot_dir, strlen(client->sysroot_dir)))
+ bptr += pkgconf_strlcpy(buf, client->sysroot_dir, sizeof buf);
+
+ for (ptr = value; *ptr != '\0' && bptr - buf < PKGCONF_BUFSIZE; ptr++)
+@@ -293,7 +298,7 @@ pkgconf_tuple_parse(const pkgconf_client_t *client, pkgconf_list_t *vars, const
+
+ if (kv != NULL)
+ {
+- parsekv = pkgconf_tuple_parse(client, vars, kv);
++ parsekv = pkgconf_tuple_parse_sysroot(client, vars, kv, add_sysroot);
+
+ strncpy(bptr, parsekv, PKGCONF_BUFSIZE - (bptr - buf));
+ bptr += strlen(parsekv);
+@@ -338,6 +343,25 @@ pkgconf_tuple_parse(const pkgconf_client_t *client, pkgconf_list_t *vars, const
+ return strdup(buf);
+ }
+
++/*
++ * !doc
++ *
++ * .. c:function:: char *pkgconf_tuple_parse(const pkgconf_client_t *client, pkgconf_list_t *vars, const char *value)
++ *
++ * Parse an expression for variable substitution.
++ *
++ * :param pkgconf_client_t* client: The pkgconf client object to access.
++ * :param pkgconf_list_t* list: The variable list to search for variables (along side the global variable list).
++ * :param char* value: The ``key=value`` string to parse.
++ * :return: the variable data with any variables substituted
++ * :rtype: char *
++ */
++char *
++pkgconf_tuple_parse(const pkgconf_client_t *client, pkgconf_list_t *vars, const char *value)
++{
++ return pkgconf_tuple_parse_sysroot(client, vars, value, true);
++}
++
+ /*
+ * !doc
+ *
+--
+2.19.2
+