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

Reply via email to