diff -durpN pkg-config.orig/main.c pkg-config/main.c --- pkg-config.orig/main.c 2012-11-02 20:27:55.493095216 +0100 +++ pkg-config/main.c 2012-11-02 22:01:02.753900274 +0100 @@ -740,9 +740,17 @@ main (int argc, char **argv) if (want_l_libs) { - char *str = packages_get_l_libs (packages); + char *str; + + str = packages_get_l_libs (packages); printf ("%s ", str); g_free (str); + + str = packages_get_l_libs_wa (packages); + if (str) + printf ("-Wl,--whole-archive %s -Wl,--no-whole-archive ", str); + g_free (str); + need_newline = TRUE; } else if (want_L_libs) diff -durpN pkg-config.orig/parse.c pkg-config/parse.c --- pkg-config.orig/parse.c 2012-11-02 20:27:55.493095216 +0100 +++ pkg-config/parse.c 2012-11-02 22:01:02.754900280 +0100 @@ -601,7 +601,8 @@ static char *strdup_escape_shell(const c static void _do_parse_libs (Package *pkg, int argc, char **argv) { - int i; + int i, whole_archive, n_whole_archive; + GSList **l_libs; #ifdef G_OS_WIN32 char *L_flag = (msvc_syntax ? "/libpath:" : "-L"); char *l_flag = (msvc_syntax ? "" : "-l"); @@ -613,6 +614,9 @@ static void _do_parse_libs (Package *pkg #endif i = 0; + whole_archive = 0; + n_whole_archive = 0; + l_libs = &pkg->l_libs; while (i < argc) { char *tmp = trim_string (argv[i]); @@ -631,9 +635,21 @@ static void _do_parse_libs (Package *pkg while (*p && isspace ((guchar)*p)) ++p; - pkg->l_libs = g_slist_prepend (pkg->l_libs, + *l_libs = g_slist_prepend (*l_libs, g_strconcat (l_flag, p, lib_suffix, NULL)); + if (whole_archive) + n_whole_archive++; + } + else if (strcmp("-Wl,--whole-archive",arg) == 0) + { + whole_archive = 1; + l_libs = &pkg->l_libs_wa; + } + else if (strcmp("-Wl,--no-whole-archive",arg) == 0) + { + whole_archive = 0; + l_libs = &pkg->l_libs; } else if (p[0] == '-' && p[1] == 'L') @@ -671,7 +687,14 @@ static void _do_parse_libs (Package *pkg ++i; } - + if (pkg->l_libs_wa) + { + if (n_whole_archive == 0) + { + g_slist_free_full(pkg->l_libs_wa, g_free); + pkg->l_libs_wa = NULL; + } + } } diff -durpN pkg-config.orig/pkg.c pkg-config/pkg.c --- pkg-config.orig/pkg.c 2012-11-02 20:27:55.495095230 +0100 +++ pkg-config/pkg.c 2012-11-02 22:06:14.116688899 +0100 @@ -532,6 +532,12 @@ get_l_libs (Package *pkg) } static GSList * +get_l_libs_wa (Package *pkg) +{ + return pkg->l_libs_wa; +} + +static GSList * get_L_libs (Package *pkg) { return pkg->L_libs; @@ -1025,6 +1031,13 @@ packages_get_l_libs (GSList *pkgs) } char * +packages_get_l_libs_wa (GSList *pkgs) +{ + return get_multi_merged_from_back (pkgs, get_l_libs_wa, FALSE, + !ignore_private_libs); +} + +char * packages_get_L_libs (GSList *pkgs) { return get_multi_merged (pkgs, get_L_libs, TRUE, !ignore_private_libs); @@ -1040,6 +1053,7 @@ char * packages_get_all_libs (GSList *pkgs) { char *l_libs; + char *l_libs_wa; char *L_libs; char *other_libs; GString *str; @@ -1050,6 +1064,7 @@ packages_get_all_libs (GSList *pkgs) other_libs = packages_get_other_libs (pkgs); L_libs = packages_get_L_libs (pkgs); l_libs = packages_get_l_libs (pkgs); + l_libs_wa = packages_get_l_libs_wa (pkgs); if (other_libs) g_string_append (str, other_libs); @@ -1060,6 +1075,14 @@ packages_get_all_libs (GSList *pkgs) if (l_libs) g_string_append (str, l_libs); + if (l_libs_wa) + { + g_string_append (str, "-Wl,--whole-archive "); + g_string_append (str, l_libs_wa); + g_string_append (str, "-Wl,--no-whole-archive "); + } + + g_free (l_libs_wa); g_free (l_libs); g_free (L_libs); g_free (other_libs); diff -durpN pkg-config.orig/pkg.h pkg-config/pkg.h --- pkg-config.orig/pkg.h 2012-11-02 20:27:55.495095230 +0100 +++ pkg-config/pkg.h 2012-11-02 22:03:31.315741748 +0100 @@ -57,6 +57,7 @@ struct _Package GSList *requires_private_entries; GSList *requires_private; GSList *l_libs; + GSList *l_libs_wa; GSList *L_libs; GSList *other_libs; GSList *I_cflags; @@ -73,6 +74,7 @@ struct _Package Package *get_package (const char *name); Package *get_package_quiet (const char *name); char * packages_get_l_libs (GSList *pkgs); +char * packages_get_l_libs_wa (GSList *pkgs); char * packages_get_L_libs (GSList *pkgs); char * packages_get_other_libs (GSList *pkgs); char * packages_get_all_libs (GSList *pkgs);