123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- 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:
- 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>
- ---
- 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,21 @@ 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[] = {
- + "g_ir_scanner",
- + "g_ir_compiler",
- + "g_ir_generate",
- + "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
|