|
|
@@ -0,0 +1,150 @@
|
|
|
+From c912e9bb8d5be414fda74b2019deb2a6d2d041a0 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:
|
|
|
+g_ir_scanner, g_ir_compiler, g_ir_generate, 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>
|
|
|
+[Updated to include gobject-introspection paths]
|
|
|
+Signed-off-by: Adam Duskett <aduskett@gmail.com>
|
|
|
+[Dropped the pkgdatadir path]
|
|
|
+Signed-off-by: Thomas Devoogdt <thomas@devoogdt.com>
|
|
|
+---
|
|
|
+ libpkgconf/tuple.c | 64 ++++++++++++++++++++++++++++++++--------------
|
|
|
+ 1 file changed, 45 insertions(+), 19 deletions(-)
|
|
|
+
|
|
|
+diff --git a/libpkgconf/tuple.c b/libpkgconf/tuple.c
|
|
|
+index 83f6a47..d56fcec 100644
|
|
|
+--- a/libpkgconf/tuple.c
|
|
|
++++ b/libpkgconf/tuple.c
|
|
|
+@@ -178,6 +178,20 @@ dequote(const char *value)
|
|
|
+ return buf;
|
|
|
+ }
|
|
|
+
|
|
|
++static char *
|
|
|
++pkgconf_tuple_parse_sysroot(const pkgconf_client_t *client, pkgconf_list_t *vars, const char *value, unsigned int flags, bool add_sysroot);
|
|
|
++
|
|
|
++const char *sysrooted_keys[] = {
|
|
|
++ "g_ir_scanner",
|
|
|
++ "g_ir_compiler",
|
|
|
++ "g_ir_generate",
|
|
|
++ "includedir",
|
|
|
++ "libdir",
|
|
|
++ "mapdir",
|
|
|
++ "sdkdir",
|
|
|
++ NULL,
|
|
|
++};
|
|
|
++
|
|
|
+ static const char *
|
|
|
+ find_sysroot(const pkgconf_client_t *client, pkgconf_list_t *vars)
|
|
|
+ {
|
|
|
+@@ -237,14 +251,20 @@ pkgconf_tuple_add(const pkgconf_client_t *client, pkgconf_list_t *list, const ch
|
|
|
+ {
|
|
|
+ char *dequote_value;
|
|
|
+ pkgconf_tuple_t *tuple = calloc(1, sizeof(pkgconf_tuple_t));
|
|
|
++ bool add_sysroot = false;
|
|
|
++ int i;
|
|
|
+
|
|
|
+ pkgconf_tuple_find_delete(list, key);
|
|
|
+
|
|
|
+ dequote_value = dequote(value);
|
|
|
+
|
|
|
++ 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, flags);
|
|
|
++ tuple->value = pkgconf_tuple_parse_sysroot(client, list, dequote_value, flags, add_sysroot);
|
|
|
+ else
|
|
|
+ tuple->value = strdup(dequote_value);
|
|
|
+
|
|
|
+@@ -294,22 +314,8 @@ 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, unsigned int flags)
|
|
|
+- *
|
|
|
+- * 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.
|
|
|
+- * :param uint flags: Any flags to consider while parsing.
|
|
|
+- * :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, unsigned int flags)
|
|
|
++static char *
|
|
|
++pkgconf_tuple_parse_sysroot(const pkgconf_client_t *client, pkgconf_list_t *vars, const char *value, unsigned int flags, bool add_sysroot)
|
|
|
+ {
|
|
|
+ char buf[PKGCONF_BUFSIZE];
|
|
|
+ const char *ptr;
|
|
|
+@@ -318,7 +324,7 @@ pkgconf_tuple_parse(const pkgconf_client_t *client, pkgconf_list_t *vars, const
|
|
|
+ if (!(client->flags & PKGCONF_PKG_PKGF_FDO_SYSROOT_RULES) &&
|
|
|
+ (!(flags & PKGCONF_PKG_PROPF_UNINSTALLED) || (client->flags & PKGCONF_PKG_PKGF_PKGCONF1_SYSROOT_RULES)))
|
|
|
+ {
|
|
|
+- 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);
|
|
|
+ }
|
|
|
+
|
|
|
+@@ -381,7 +387,7 @@ pkgconf_tuple_parse(const pkgconf_client_t *client, pkgconf_list_t *vars, const
|
|
|
+ {
|
|
|
+ size_t nlen;
|
|
|
+
|
|
|
+- parsekv = pkgconf_tuple_parse(client, vars, kv, flags);
|
|
|
++ parsekv = pkgconf_tuple_parse_sysroot(client, vars, kv, flags, add_sysroot);
|
|
|
+ nlen = pkgconf_strlcpy(bptr, parsekv, remain);
|
|
|
+ free(parsekv);
|
|
|
+
|
|
|
+@@ -432,6 +438,26 @@ 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, unsigned int flags)
|
|
|
++ *
|
|
|
++ * 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.
|
|
|
++ * :param uint flags: Any flags to consider while parsing.
|
|
|
++ * :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, unsigned int flags)
|
|
|
++{
|
|
|
++ return pkgconf_tuple_parse_sysroot(client, vars, value, flags, true);
|
|
|
++}
|
|
|
++
|
|
|
+ /*
|
|
|
+ * !doc
|
|
|
+ *
|
|
|
+--
|
|
|
+2.43.0
|
|
|
+
|