You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
282 lines
9.2 KiB
282 lines
9.2 KiB
Index: main.c |
|
--- main.c.orig 2012-07-11 14:24:23.000000000 +0200 |
|
+++ main.c 2012-07-12 08:29:20.000000000 +0200 |
|
@@ -204,7 +204,8 @@ |
|
static int want_I_cflags = 0; |
|
static int want_other_cflags = 0; |
|
static int want_list = 0; |
|
- static int want_static_lib_list = ENABLE_INDIRECT_DEPS; |
|
+ static int want_static_lib_list = 0; |
|
+ static int want_shared_lib_list = 0; |
|
static int want_short_errors = 0; |
|
static int want_uninstalled = 0; |
|
static char *variable_name = NULL; |
|
@@ -238,7 +239,9 @@ |
|
{ "libs", 0, 0, G_OPTION_ARG_NONE, &want_libs, |
|
"output all linker flags", NULL }, |
|
{ "static", 0, 0, G_OPTION_ARG_NONE, &want_static_lib_list, |
|
- "output linker flags for static linking", NULL }, |
|
+ "output explicit linker flags for static linking", NULL }, |
|
+ { "shared", 0, 0, G_OPTION_ARG_NONE, &want_shared_lib_list, |
|
+ "output implicit linker flags for dynamic linking", NULL }, |
|
{ "short-errors", 0, 0, G_OPTION_ARG_NONE, &want_short_errors, |
|
"print short errors", NULL }, |
|
{ "libs-only-l", 0, 0, G_OPTION_ARG_NONE, &want_l_libs, |
|
@@ -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 |
|
@@ -740,7 +754,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; |
|
@@ -754,14 +768,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: pkg.c |
|
--- pkg.c.orig 2012-05-30 14:49:24.000000000 +0200 |
|
+++ pkg.c 2012-07-12 08:27:29.000000000 +0200 |
|
@@ -439,6 +439,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) |
|
{ |
|
@@ -974,6 +1026,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) |
|
{ |
|
@@ -1015,13 +1089,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); |
|
|
|
@@ -1029,8 +1129,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); |
|
} |
|
@@ -1053,9 +1157,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); |
|
|
|
@@ -1063,13 +1171,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; |
|
@@ -1079,9 +1190,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 2012-05-30 14:49:24.000000000 +0200 |
|
+++ pkg.h 2012-07-12 08:27:29.000000000 +0200 |
|
@@ -75,13 +75,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);
|
|
|