diff --git a/make/host-tools.mk b/make/host-tools.mk index 8d7569b8..a12d879b 100644 --- a/make/host-tools.mk +++ b/make/host-tools.mk @@ -54,7 +54,7 @@ $(HOST_DIR)/bin/$(TARGET)-pkg-config: | $(HOST_DIR)/bin # ----------------------------------------------------------------------------- -HOST_PKGCONF_VER = 1.6.1 +HOST_PKGCONF_VER = 1.6.3 HOST_PKGCONF_TMP = pkgconf-$(HOST_PKGCONF_VER) HOST_PKGCONF_SOURCE = pkgconf-$(HOST_PKGCONF_VER).tar.gz HOST_PKGCONF_URL = https://distfiles.dereferenced.org/pkgconf @@ -79,7 +79,7 @@ $(HOST_DIR)/bin/pkgconf: $(ARCHIVE)/$(HOST_PKGCONF_SOURCE) | $(HOST_DIR)/bin pkg ; \ $(MAKE); \ $(MAKE) install - $(INSTALL_EXEC) $(PATCHES)/pkgconf-pkg-config $(HOST_DIR)/bin/pkg-config + $(INSTALL_EXEC) $(PATCHES)/$(@F)/pkgconf-pkg-config $(HOST_DIR)/bin/pkg-config $(REMOVE)/$(HOST_PKGCONF_TMP) # ----------------------------------------------------------------------------- diff --git a/patches/pkgconf/0001-Only-prefix-with-the-sysroot-a-subset-of-variables.patch b/patches/pkgconf/0001-Only-prefix-with-the-sysroot-a-subset-of-variables.patch new file mode 100644 index 00000000..fdf15359 --- /dev/null +++ b/patches/pkgconf/0001-Only-prefix-with-the-sysroot-a-subset-of-variables.patch @@ -0,0 +1,142 @@ +From 267a57022699453e8d8f517519df25ac6bf6ac4e Mon Sep 17 00:00:00 2001 +From: Thomas Petazzoni +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 +--- + 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 + diff --git a/patches/pkgconf/0002-Revert-main-assume-modversion-insted-of-version-if-o.patch b/patches/pkgconf/0002-Revert-main-assume-modversion-insted-of-version-if-o.patch new file mode 100644 index 00000000..f659a3b0 --- /dev/null +++ b/patches/pkgconf/0002-Revert-main-assume-modversion-insted-of-version-if-o.patch @@ -0,0 +1,45 @@ +From 4ccef40918a539905a2951bfb81cf8dba4a245c6 Mon Sep 17 00:00:00 2001 +From: Thomas Petazzoni +Date: Wed, 2 Jan 2019 18:15:50 +0100 +Subject: [PATCH] Revert "main: assume --modversion insted of --version if + other flags or module names are provided" + +This reverts commit 12a0eb124cea85586e57f33c91a1e4c73459eef6, as it +causes pkg-config to assume --modversion is used when something as +simple as 'pkg-config --static --version' is used, leading to a +failure instead of the expected behavior: the one of "pkg-config +--version". + +Signed-off-by: Thomas Petazzoni +--- + cli/main.c | 14 ++------------ + 1 file changed, 2 insertions(+), 12 deletions(-) + +diff --git a/cli/main.c b/cli/main.c +index b52cc85..c5acc10 100644 +--- a/cli/main.c ++++ b/cli/main.c +@@ -1002,18 +1002,8 @@ main(int argc, char *argv[]) + + if ((want_flags & PKG_VERSION) == PKG_VERSION) + { +- if (argc > 2) +- { +- fprintf(stderr, "%s: --version specified with other options or module names, assuming --modversion.\n", argv[0]); +- +- want_flags &= ~PKG_VERSION; +- want_flags |= PKG_MODVERSION; +- } +- else +- { +- version(); +- return EXIT_SUCCESS; +- } ++ version(); ++ return EXIT_SUCCESS; + } + + if ((want_flags & PKG_HELP) == PKG_HELP) +-- +2.20.1 + diff --git a/patches/pkgconf-pkg-config b/patches/pkgconf/pkgconf-pkg-config similarity index 100% rename from patches/pkgconf-pkg-config rename to patches/pkgconf/pkgconf-pkg-config