head 1.5; access; symbols OPENPKG_E1_MP_HEAD:1.5 OPENPKG_E1_MP:1.5 OPENPKG_E1_MP_2_STABLE:1.3.2.1 OPENPKG_E1_FP:1.3.2.1 OPENPKG_2_STABLE_MP:1.5 OPENPKG_2_STABLE_20061018:1.3.2.1 OPENPKG_2_STABLE_20060622:1.3 OPENPKG_2_STABLE:1.3.0.2 OPENPKG_2_STABLE_BP:1.3 OPENPKG_2_5_RELEASE:1.2 OPENPKG_2_5_SOLID:1.2.0.4 OPENPKG_2_5_SOLID_BP:1.2 OPENPKG_2_4_RELEASE:1.2 OPENPKG_2_4_SOLID:1.2.0.2 OPENPKG_2_4_SOLID_BP:1.2 OPENPKG_CW_FP:1.1 OPENPKG_2_3_RELEASE:1.1 OPENPKG_2_3_SOLID:1.1.0.8 OPENPKG_2_3_SOLID_BP:1.1 OPENPKG_2_2_RELEASE:1.1 OPENPKG_2_2_SOLID:1.1.0.6 OPENPKG_2_2_SOLID_BP:1.1 OPENPKG_2_1_RELEASE:1.1 OPENPKG_2_1_SOLID:1.1.0.4 OPENPKG_2_1_SOLID_BP:1.1 OPENPKG_2_0_RELEASE:1.1 OPENPKG_2_0_SOLID:1.1.0.2 OPENPKG_2_0_SOLID_BP:1.1; locks; strict; comment @# @; 1.5 date 2006.10.04.07.29.29; author rse; state Exp; branches; next 1.4; commitid iuNgOp2D3D67XkPr; 1.4 date 2006.10.04.05.46.46; author rse; state Exp; branches; next 1.3; commitid qG6ArYTn72egokPr; 1.3 date 2005.10.24.13.25.01; author thl; state Exp; branches 1.3.2.1; next 1.2; 1.2 date 2005.04.20.17.02.39; author ms; state Exp; branches; next 1.1; 1.1 date 2003.11.07.10.53.22; author ms; state Exp; branches; next ; 1.3.2.1 date 2006.10.16.14.54.44; author rse; state Exp; branches; next ; commitid iZxwRSmmWscPXUQr; desc @@ 1.5 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... @ text @Index: main.c --- main.c.orig 2006-08-16 19:54:56 +0200 +++ main.c 2006-10-04 08:15:25 +0200 @@@@ -182,7 +182,8 @@@@ int want_I_cflags = 0; int want_other_cflags = 0; int want_list = 0; - int want_static_lib_list = ENABLE_INDIRECT_DEPS; + int want_static_lib_list = 0; + int want_shared_lib_list = 0; int want_short_errors = 0; int result; int want_uninstalled = 0; @@@@ -218,7 +219,9 @@@@ { "libs", 0, POPT_ARG_NONE, &want_libs, 0, "output all linker flags" }, { "static", 0, POPT_ARG_NONE, &want_static_lib_list, 0, - "output linker flags for static linking" }, + "output explicit linker flags for static linking" }, + { "shared", 0, POPT_ARG_NONE, &want_shared_lib_list, 0, + "output implicit linker flags for dynamic linking" }, { "short-errors", 0, POPT_ARG_NONE, &want_short_errors, 0, "print short errors" }, { "libs-only-l", 0, POPT_ARG_NONE, &want_l_libs, 0, @@@@ -415,6 +418,17 @@@@ else debug_spew ("Error printing disabled\n"); + /************************************************************************* + * if user explicitly specified only --static, then recurse. * + * if user explicitly specified both --static and --shared, then recurse. * + * * + * ...but if user did not explicitly specify either argument, then * + * obey the default logic as defined by ENABLE_INDIRECT_DEPS (as set * + * by the configure script with the --enable-indirect-deps argument). * + *************************************************************************/ + if (!want_static_lib_list && !want_shared_lib_list) + want_static_lib_list = ENABLE_INDIRECT_DEPS; + 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-04 08:15:25 +0200 @@@@ -1394,7 +1394,7 @@@@ return pkg; } - else + else if (strncmp (name, "gnome", strlen("gnome")) == 0) { /* Check for the module in gnome-config */ char *output; @@@@ -1493,5 +1493,10 @@@@ return pkg; } + else + { + g_free (pkg); + return NULL; + } #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); @ 1.4 log @cleanup packaging and fix patch @ text @d3 1 a3 1 +++ main.c 2006-10-03 16:21:58 +0200 d43 26 d71 1 a71 1 +++ parse.c 2006-10-03 16:17:58 +0200 d92 214 @ 1.3 log @upgrading package: pkgconfig 0.19 -> 0.20 @ text @a0 24 diff -Nau parse.c.orig parse.c --- parse.c.orig Fri Nov 7 10:55:19 2003 +++ parse.c Fri Nov 7 11:37:53 2003 @@@@ -1239,7 +1239,7 @@@@ return pkg; } - else + else if (strncmp (name, "gnome", strlen("gnome")) == 0) { /* Check for the module in gnome-config */ char *output; @@@@ -1337,6 +1337,11 @@@@ g_free (output); return pkg; + } + else + { + g_free (pkg); + return NULL; } #endif } d2 2 a3 2 --- main.c.orig 2005-10-16 20:04:50 +0200 +++ main.c 2005-10-24 15:13:44 +0200 d25 3 a27 3 @@@@ -621,6 +624,17 @@@@ need_newline = TRUE; } d40 12 a51 1 if (want_l_libs) d53 13 a65 1 char *str = packages_get_l_libs (packages); @ 1.3.2.1 log @Mass merge from CURRENT to 2-STABLE (all packages except those of JUNK class) @ text @d1 24 d26 2 a27 2 --- main.c.orig 2006-08-16 19:54:56 +0200 +++ main.c 2006-10-04 08:15:25 +0200 d49 3 a51 3 @@@@ -415,6 +418,17 @@@@ else debug_spew ("Error printing disabled\n"); a63 5 if (want_static_lib_list) enable_private_libs(); else @@@@ -622,7 +636,7 @@@@ d66 1 a66 259 - 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-04 08:15:25 +0200 @@@@ -1394,7 +1394,7 @@@@ return pkg; } - else + else if (strncmp (name, "gnome", strlen("gnome")) == 0) { /* Check for the module in gnome-config */ char *output; @@@@ -1493,5 +1493,10 @@@@ return pkg; } + else + { + g_free (pkg); + return NULL; + } #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); @ 1.2 log @introduce patch logic to add a new command line argument '--shared', the functional counterpart of the recently added '--static' argument @ text @d25 3 a27 3 diff -Nau main.c.orig main.c --- main.c.orig 2005-04-12 13:08:13 +0200 +++ main.c 2005-04-20 18:04:10 +0200 d35 1 d38 1 a38 2 char *variable_name = NULL; @@@@ -217,7 +218,9 @@@@ d46 2 d49 1 a49 3 "output -l flags" }, { "libs-only-other", 0, POPT_ARG_NONE, &want_other_libs, 0, @@@@ -592,6 +595,17 @@@@ d66 1 a66 1 char *str = packages_get_l_libs (packages, want_static_lib_list); @ 1.1 log @Do not call the nonexistant gnome-config as a default measure @ text @d1 3 a3 3 diff -Naur pkgconfig-0.15.0.orig/parse.c pkgconfig-0.15.0/parse.c --- pkgconfig-0.15.0.orig/parse.c Fri Nov 7 10:55:19 2003 +++ pkgconfig-0.15.0/parse.c Fri Nov 7 11:37:53 2003 d25 42 @