summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Nicholson <dbn.lists@gmail.com>2012-11-29 07:11:57 -0800
committerDan Nicholson <dbn.lists@gmail.com>2012-12-03 07:08:20 -0800
commit360a614af8b3a465595cde32216cd12cce8bd0e9 (patch)
tree0a761cbe1370d5e420ded73f4e080d44de11740e
parentbe455b79fe62e2de976e5aef61c04c73c6857f6a (diff)
downloadpkg-config-360a614af8b3a465595cde32216cd12cce8bd0e9.tar.gz
Start from end of package lists when processing Requires
Prior to commit 6ecf318, the resolved list of required packages was built in an appending way where each package on the command line or in Requires would appear in the list in the order they appeared. With 6ecf318, that list building was changed to prepending, which had a subtle change on the resolved order. For example, suppose package a has "Requires: b c d". Previously, the list would be built as a->b->c->d by appending each as they were encountered. Now, the list is built by walking all the way down the dependency chain for each package in a depth first manner and prepending packages while unwinding. This would result in the package ilst being a->d->c->b. This same effect happens with the command line packages where previously requesting packages x and y would create a package list of x->y and now produces a list of y->x. While technically these should be the same since there are no interdependencies, it's causes flags to be output in different order than previously in pkg-config. This can be seen most readily in the check-gtk test. Instead, operate on the package lists backwards when building the resolved package list.
-rwxr-xr-xcheck/check-gtk21
-rwxr-xr-xcheck/check-non-l-flags4
-rwxr-xr-xcheck/check-requires-private8
-rw-r--r--pkg.c25
4 files changed, 26 insertions, 32 deletions
diff --git a/check/check-gtk b/check/check-gtk
index 3f9aae7..7ad565f 100755
--- a/check/check-gtk
+++ b/check/check-gtk
@@ -15,8 +15,8 @@ PKG_CONFIG_LIBDIR=${srcdir}/gtk
# -I/gtk/include -I/gtk/include/freetype2
RESULT="-DGSEAL_ENABLE -pthread -I/gtk/include/gtk-3.0 \
-I/gtk/include/pango-1.0 -I/gtk/include/atk-1.0 -I/gtk/include/cairo \
--I/gtk/include/gdk-pixbuf-2.0 -I/gtk/include -I/gtk/include/freetype2 \
--I/gtk/include/pixman-1 -I/gtk/include/glib-2.0 -I/gtk/lib/glib-2.0/include"
+-I/gtk/include/pixman-1 -I/gtk/include -I/gtk/include/gdk-pixbuf-2.0 \
+-I/gtk/include/glib-2.0 -I/gtk/lib/glib-2.0/include -I/gtk/include/freetype2"
run_test --cflags gtk+-3.0
run_test --cflags --static gtk+-3.0
@@ -26,9 +26,10 @@ run_test --cflags --static gtk+-3.0
# -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lcairo -lpango-1.0 \
# -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt \
# -lglib-2.0
-RESULT="-pthread -L/gtk/lib -lgtk-3 -lpangoft2-1.0 -lfontconfig -lfreetype \
--lgio-2.0 -latk-1.0 -lgdk-3 -lcairo-gobject -lgdk_pixbuf-2.0 -lpangocairo-1.0 \
--lcairo -lpango-1.0 -lgmodule-2.0 -lgobject-2.0 -lgthread-2.0 -lrt -lglib-2.0"
+RESULT="-pthread -L/gtk/lib -lgtk-3 -lgdk-3 -lpangocairo-1.0 -latk-1.0 \
+-lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 \
+-lpango-1.0 -lgobject-2.0 -lgthread-2.0 -lgmodule-2.0 -lrt -lglib-2.0 \
+-lfreetype -lfontconfig"
if [ "$list_indirect_deps" = no ]; then
run_test --libs gtk+-3.0
fi
@@ -46,11 +47,11 @@ fi
# -lpixman-1 -lXrender -lX11 -lpthread -lxcb -lXau -lpng12 -lz -lm \
# -lpango-1.0 -lfontconfig -lexpat -lfreetype -lgobject-2.0 -lffi \
# -lgmodule-2.0 -ldl -lgthread-2.0 -lglib-2.0 -lrt
-RESULT="-pthread -L/gtk/lib -lgtk-3 -lpangoft2-1.0 -lgio-2.0 -lresolv \
--latk-1.0 -lgdk-3 -lcairo-gobject -lgdk_pixbuf-2.0 -lpangocairo-1.0 -lcairo \
--lXrender -lX11 -lpthread -lxcb -lXau -lpng12 -lz -lm -lfontconfig -lexpat \
--lfreetype -lpixman-1 -lpango-1.0 -lgmodule-2.0 -ldl -lgobject-2.0 -lffi \
--lgthread-2.0 -lglib-2.0 -lrt"
+RESULT="-pthread -L/gtk/lib -lgtk-3 -lgdk-3 -lpangocairo-1.0 -latk-1.0 \
+-lcairo-gobject -lcairo -lpixman-1 -lXrender -lX11 -lpthread -lxcb -lXau \
+-lgdk_pixbuf-2.0 -lpng12 -lm -lgio-2.0 -lz -lresolv -lpangoft2-1.0 \
+-lpango-1.0 -lgobject-2.0 -lffi -lgthread-2.0 -lgmodule-2.0 -ldl -lglib-2.0 \
+-lrt -lfontconfig -lexpat -lfreetype"
if [ "$list_indirect_deps" = yes ]; then
run_test --libs gtk+-3.0
fi
diff --git a/check/check-non-l-flags b/check/check-non-l-flags
index f4a4271..dc615e9 100755
--- a/check/check-non-l-flags
+++ b/check/check-non-l-flags
@@ -6,12 +6,8 @@ set -e
RESULT="-I/non-l/include -I/non-l-required/include"
run_test --cflags non-l-required non-l
-
-RESULT="-I/non-l/include -I/non-l-required/include"
run_test --cflags --static non-l-required non-l
RESULT="/non-l.a /non-l-required.a -pthread"
run_test --libs non-l-required non-l
-
-RESULT="/non-l.a /non-l-required.a -pthread"
run_test --libs --static non-l-required non-l
diff --git a/check/check-requires-private b/check/check-requires-private
index 6924188..dc69baf 100755
--- a/check/check-requires-private
+++ b/check/check-requires-private
@@ -5,11 +5,8 @@ set -e
. ${srcdir}/common
# expect cflags from requires-test and public-dep
-RESULT="-I/requires-test/include -I/public-dep/include -I/private-dep/include"
+RESULT="-I/requires-test/include -I/private-dep/include -I/public-dep/include"
run_test --cflags requires-test
-
-# still expect those cflags for static linking case
-RESULT="-I/requires-test/include -I/public-dep/include -I/private-dep/include"
run_test --static --cflags requires-test
# expect libs for just requires-test and public-dep
@@ -19,7 +16,8 @@ if [ "$list_indirect_deps" = no ]; then
fi
# expect libs for requires-test, public-dep and private-dep in static case
-RESULT="-L/requires-test/lib -L/public-dep/lib -L/private-dep/lib -lrequires-test -lpublic-dep -lprivate-dep"
+RESULT="-L/requires-test/lib -L/private-dep/lib -L/public-dep/lib \
+-lrequires-test -lprivate-dep -lpublic-dep"
if [ "$list_indirect_deps" = yes ]; then
run_test --libs requires-test
fi
diff --git a/pkg.c b/pkg.c
index 55b79c8..ea9eeab 100644
--- a/pkg.c
+++ b/pkg.c
@@ -633,7 +633,10 @@ recursive_fill_list (Package *pkg, GetListFunc func, GList **listp)
/* record this package in the dependency chain */
chain = g_list_prepend (chain, pkg);
- for (tmp = (*func) (pkg); tmp != NULL; tmp = g_list_next (tmp))
+ /* Start from the end of the required package list to maintain order since
+ * the recursive list is built by prepending. */
+ for (tmp = g_list_last ((*func) (pkg)); tmp != NULL;
+ tmp = g_list_previous (tmp))
recursive_fill_list (tmp->data, func, listp);
*listp = g_list_prepend (*listp, pkg);
@@ -708,18 +711,14 @@ fill_list (GList *packages, GetListFunc func,
GList **listp, gboolean in_path_order, gboolean include_private)
{
GList *tmp;
- GList *expanded;
-
- expanded = NULL;
- tmp = packages;
- while (tmp != NULL)
- {
- recursive_fill_list (tmp->data,
- include_private ? get_requires_private : get_requires,
- &expanded);
-
- tmp = tmp->next;
- }
+ GList *expanded = NULL;
+
+ /* Start from the end of the requested package list to maintain order since
+ * the recursive list is built by prepending. */
+ for (tmp = g_list_last (packages); tmp != NULL; tmp = g_list_previous (tmp))
+ recursive_fill_list (tmp->data,
+ include_private ? get_requires_private : get_requires,
+ &expanded);
/* Remove duplicate packages from the recursive list. This should provide a
* serialized package list where all interdependencies are resolved