OpenPKG CVS Repository http://cvs.openpkg.org/ ____________________________________________________________________________
Server: cvs.openpkg.org Name: Ralf S. Engelschall Root: /v/openpkg/cvs Email: [EMAIL PROTECTED] Module: openpkg-src Date: 04-Oct-2006 09:29:30 Branch: HEAD Handle: 2006100408292900 Modified files: openpkg-src/pkgconfig pkgconfig.patch Log: Removing duplicate -lxxx from the back or from the front of the list is not always the correct thing as there can be situations constructed where each one fails in case of static library linking. For instance, the auto-generated (because of listed dependencies in *.pc files) "-lpango -lfreetype -lz -lfontconfig -lpango -lfreetype -lz" on remove-from-back results in "-lpango -lfreetype -lz -lfontconfig" and leads to "fontconfig with freetype symbols unresolved" while on remove-from-front results in "-lfontconfig -lpango -lfreetype -lz" and leads to "pango with fontconfig symbols unresolved". The only safe method is either to not remove duplicated at all or just remove them from the middle (keeping first and last occurrences). Hence, let's take the "usual large RSE hammer" ;-) and force pkg-config to do what we wish... Summary: Revision Changes Path 1.5 +242 -2 openpkg-src/pkgconfig/pkgconfig.patch ____________________________________________________________________________ patch -p0 <<'@@ .' Index: openpkg-src/pkgconfig/pkgconfig.patch ============================================================================ $ cvs diff -u -r1.4 -r1.5 pkgconfig.patch --- openpkg-src/pkgconfig/pkgconfig.patch 4 Oct 2006 05:46:46 -0000 1.4 +++ openpkg-src/pkgconfig/pkgconfig.patch 4 Oct 2006 07:29:29 -0000 1.5 @@ -1,6 +1,6 @@ Index: main.c --- main.c.orig 2006-08-16 19:54:56 +0200 -+++ main.c 2006-10-03 16:21:58 +0200 ++++ main.c 2006-10-04 08:15:25 +0200 @@ -182,7 +182,8 @@ int want_I_cflags = 0; int want_other_cflags = 0; @@ -40,9 +40,35 @@ if (want_static_lib_list) enable_private_libs(); else +@@ -622,7 +636,7 @@ + + if (want_l_libs) + { +- char *str = packages_get_l_libs (packages); ++ char *str = packages_get_l_libs (packages, want_static_lib_list); + printf ("%s ", str); + g_free (str); + need_newline = TRUE; +@@ -636,14 +650,14 @@ + } + else if (want_other_libs) + { +- char *str = packages_get_other_libs (packages); ++ char *str = packages_get_other_libs (packages, want_static_lib_list); + printf ("%s ", str); + g_free (str); + need_newline = TRUE; + } + else if (want_libs) + { +- char *str = packages_get_all_libs (packages); ++ char *str = packages_get_all_libs (packages, want_static_lib_list); + printf ("%s ", str); + g_free (str); + need_newline = TRUE; Index: parse.c --- parse.c.orig 2006-08-16 20:45:45 +0200 -+++ parse.c 2006-10-03 16:17:58 +0200 ++++ parse.c 2006-10-04 08:15:25 +0200 @@ -1394,7 +1394,7 @@ return pkg; @@ -63,3 +89,217 @@ + } #endif } +Index: pkg.c +--- pkg.c.orig 2006-08-16 21:01:04 +0200 ++++ pkg.c 2006-10-04 08:54:57 +0200 +@@ -473,6 +473,58 @@ + return nodups; + } + ++static GSList* ++string_list_strip_duplicates_from_middle (GSList *list) ++{ ++ GHashTable *table_first; ++ GHashTable *table_last; ++ GList *dlist; ++ GList *dlelem; ++ GSList *slist; ++ GSList *selem; ++ ++ /* shuffle from single-linked list to double-linked list ++ in order to be able to go both forward and backward while ++ still having the element (not its data) as the identifier */ ++ dlist = NULL; ++ for (selem = list; selem != NULL; selem = g_slist_next(selem)) ++ dlist = g_list_prepend(dlist, selem->data); ++ dlist = g_list_reverse(dlist); ++ ++ /* determine first and last elements */ ++ table_first = g_hash_table_new (g_str_hash, g_str_equal); ++ table_last = g_hash_table_new (g_str_hash, g_str_equal); ++ for (dlelem = dlist; dlelem != NULL; dlelem = g_list_next(dlelem)) { ++ if (g_hash_table_lookup(table_first, dlelem->data) == NULL) ++ g_hash_table_insert(table_first, dlelem->data, dlelem); ++ } ++ for (dlelem = g_list_last(dlist); dlelem != NULL; dlelem = g_list_previous(dlelem)) { ++ if (g_hash_table_lookup(table_last, dlelem->data) == NULL) ++ g_hash_table_insert(table_last, dlelem->data, dlelem); ++ } ++ ++ /* remove duplicates */ ++ slist = NULL; ++ for (dlelem = dlist; dlelem != NULL; dlelem = g_list_next(dlelem)) { ++ if ( g_hash_table_lookup(table_first, dlelem->data) == dlelem ++ || g_hash_table_lookup(table_last, dlelem->data) == dlelem) { ++ slist = g_slist_append(slist, dlelem->data); ++ debug_spew("<%s>: TAKE\n", (char *)dlelem->data); ++ } ++ else { ++ debug_spew ("<%s>: REMOVE\n", (char *)dlelem->data); ++ // debug_spew (" removing duplicate (from middle) \"%s\"\n", dlelem->data); ++ } ++ } ++ ++ /* cleanup intermediate data structures */ ++ g_hash_table_destroy(table_first); ++ g_hash_table_destroy(table_last); ++ g_list_free(dlist); ++ ++ return slist; ++} ++ + static char * + string_list_to_string (GSList *list) + { +@@ -1006,6 +1058,28 @@ + } + + static char* ++get_merged_from_middle (Package *pkg, GetListFunc func, gboolean in_path_order, ++ gboolean include_private) ++{ ++ GSList *list; ++ GSList *dups_list = NULL; ++ char *retval; ++ ++ fill_list_single_package (pkg, func, &dups_list, in_path_order, ++ include_private); ++ ++ list = string_list_strip_duplicates_from_middle (dups_list); ++ ++ g_slist_free (dups_list); ++ ++ retval = string_list_to_string (list); ++ ++ g_slist_free (list); ++ ++ return retval; ++} ++ ++static char* + get_multi_merged (GSList *pkgs, GetListFunc func, gboolean in_path_order, + gboolean include_private) + { +@@ -1049,13 +1123,39 @@ + return retval; + } + ++static char* ++get_multi_merged_from_middle (GSList *pkgs, GetListFunc func, ++ gboolean in_path_order, gboolean include_private) ++{ ++ GSList *tmp; ++ GSList *dups_list = NULL; ++ GSList *list; ++ char *retval; ++ ++ fill_list (pkgs, func, &dups_list, in_path_order, include_private); ++ ++ list = string_list_strip_duplicates_from_middle (dups_list); ++ ++ g_slist_free (dups_list); ++ ++ retval = string_list_to_string (list); ++ ++ g_slist_free (list); ++ ++ return retval; ++} ++ + char * +-package_get_l_libs (Package *pkg) ++package_get_l_libs (Package *pkg, int want_static_lib_list) + { + /* We don't want these in search path order, rather in dependency + * order, so static linking works. + */ + if (pkg->l_libs_merged == NULL) ++ if (want_static_lib_list) ++ pkg->l_libs_merged = get_merged_from_middle (pkg, get_l_libs, FALSE, ++ !ignore_private_libs); ++ else + pkg->l_libs_merged = get_merged_from_back (pkg, get_l_libs, FALSE, + !ignore_private_libs); + +@@ -1063,8 +1163,12 @@ + } + + char * +-packages_get_l_libs (GSList *pkgs) ++packages_get_l_libs (GSList *pkgs, int want_static_lib_list) + { ++ if (want_static_lib_list) ++ return get_multi_merged_from_middle (pkgs, get_l_libs, FALSE, ++ !ignore_private_libs); ++ else + return get_multi_merged_from_back (pkgs, get_l_libs, FALSE, + !ignore_private_libs); + } +@@ -1087,9 +1191,13 @@ + } + + char * +-package_get_other_libs (Package *pkg) ++package_get_other_libs (Package *pkg, int want_static_lib_list) + { + if (pkg->other_libs_merged == NULL) ++ if (want_static_lib_list) ++ pkg->other_libs_merged = get_merged_from_middle (pkg, get_other_libs, TRUE, ++ !ignore_private_libs); ++ else + pkg->other_libs_merged = get_merged (pkg, get_other_libs, TRUE, + !ignore_private_libs); + +@@ -1097,13 +1205,16 @@ + } + + char * +-packages_get_other_libs (GSList *pkgs) ++packages_get_other_libs (GSList *pkgs, int want_static_lib_list) + { ++ if (want_static_lib_list) ++ return get_multi_merged_from_middle (pkgs, get_other_libs, TRUE, !ignore_private_libs); ++ else + return get_multi_merged (pkgs, get_other_libs, TRUE, !ignore_private_libs); + } + + char * +-packages_get_all_libs (GSList *pkgs) ++packages_get_all_libs (GSList *pkgs, int want_static_lib_list) + { + char *l_libs; + char *L_libs; +@@ -1113,9 +1224,9 @@ + + str = g_string_new (""); + +- other_libs = packages_get_other_libs (pkgs); ++ other_libs = packages_get_other_libs (pkgs, want_static_lib_list); + L_libs = packages_get_L_libs (pkgs); +- l_libs = packages_get_l_libs (pkgs); ++ l_libs = packages_get_l_libs (pkgs, want_static_lib_list); + + if (other_libs) + g_string_append (str, other_libs); +Index: pkg.h +--- pkg.h.orig 2006-08-16 19:05:30 +0200 ++++ pkg.h 2006-10-04 08:15:25 +0200 +@@ -79,13 +79,13 @@ + + Package *get_package (const char *name); + Package *get_package_quiet (const char *name); +-char * package_get_l_libs (Package *pkg); +-char * packages_get_l_libs (GSList *pkgs); ++char * package_get_l_libs (Package *pkg, int want_static_lib_list); ++char * packages_get_l_libs (GSList *pkgs, int want_static_lib_list); + char * package_get_L_libs (Package *pkg); + char * packages_get_L_libs (GSList *pkgs); +-char * package_get_other_libs (Package *pkg); +-char * packages_get_other_libs (GSList *pkgs); +-char * packages_get_all_libs (GSList *pkgs); ++char * package_get_other_libs (Package *pkg, int want_static_lib_list); ++char * packages_get_other_libs (GSList *pkgs, int want_static_lib_list); ++char * packages_get_all_libs (GSList *pkgs, int want_static_lib_list); + char * package_get_I_cflags (Package *pkg); + char * packages_get_I_cflags (GSList *pkgs); + char * package_get_other_cflags (Package *pkg); @@ . ______________________________________________________________________ The OpenPKG Project www.openpkg.org CVS Repository Commit List openpkg-cvs@openpkg.org