| 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 |
| |