143 lines
5.0 KiB
Diff
143 lines
5.0 KiB
Diff
|
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
|
||
|
|