You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							142 lines
						
					
					
						
							4.8 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							142 lines
						
					
					
						
							4.8 KiB
						
					
					
				
								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
							 | 
						|
								@@ -161,6 +161,18 @@
							 | 
						|
								 	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
							 | 
						|
								  *
							 | 
						|
								@@ -181,16 +193,22 @@
							 | 
						|
								 {
							 | 
						|
								 	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);
							 | 
						|
								 
							 | 
						|
								 	dequote_value = dequote(value);
							 | 
						|
								 
							 | 
						|
								 	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);
							 | 
						|
								 
							 | 
						|
								@@ -234,27 +252,14 @@
							 | 
						|
								 	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++)
							 | 
						|
								@@ -294,7 +299,7 @@
							 | 
						|
								 
							 | 
						|
								 				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);
							 | 
						|
								@@ -342,6 +347,25 @@
							 | 
						|
								 /*
							 | 
						|
								  * !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
							 | 
						|
								+ *
							 | 
						|
								  * .. c:function:: void pkgconf_tuple_free_entry(pkgconf_tuple_t *tuple, pkgconf_list_t *list)
							 | 
						|
								  *
							 | 
						|
								  *    Deletes a variable object, removing it from any variable lists and releasing any memory associated
							 | 
						|
								-- 
							 | 
						|
								2.19.2
							 | 
						|
								
							 | 
						|
								
							 |