Jelajahi Sumber

pkgconf: update to 2.3.0, add buildroot patch to fix sysroot behaviour

Waldemar Brodkorb 11 bulan lalu
induk
melakukan
a6ab111f3c

+ 3 - 3
package/pkgconf/Makefile

@@ -4,9 +4,9 @@
 include $(ADK_TOPDIR)/rules.mk
 
 PKG_NAME:=		pkgconf
-PKG_VERSION:=		1.1.0
-PKG_RELEASE:=		2
-PKG_HASH:=		5f1ef65d73a880fa5e7012102a17f7b32010e5e46139aed85851a541ba828a63
+PKG_VERSION:=		2.3.0
+PKG_RELEASE:=		1
+PKG_HASH:=		3a9080ac51d03615e7c1910a0a2a8df08424892b5f13b0628a204d3fcce0ea8b
 PKG_DESCR:=		smart pkg-config replacement
 PKG_SECTION:=		dev/tools
 HOST_BUILDDEP:=		sed-host

+ 150 - 0
package/pkgconf/patches/0001-Only-prefix-with-the-sysroot-a-subset-of-variables.patch

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