summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--parse.c76
-rw-r--r--pkg.c63
-rw-r--r--pkg.h2
3 files changed, 64 insertions, 77 deletions
diff --git a/parse.c b/parse.c
index 76a994c..671ad71 100644
--- a/parse.c
+++ b/parse.c
@@ -523,10 +523,8 @@ parse_module_list (Package *pkg, const char *str, const char *path)
static void
parse_requires (Package *pkg, const char *str, const char *path)
{
- GSList *parsed;
- GSList *iter;
char *trimmed;
-
+
if (pkg->requires)
{
verbose_error ("Requires field occurs twice in '%s'\n", path);
@@ -535,45 +533,15 @@ parse_requires (Package *pkg, const char *str, const char *path)
}
trimmed = trim_and_sub (pkg, str, path);
- parsed = parse_module_list (pkg, trimmed, path);
+ pkg->requires_entries = parse_module_list (pkg, trimmed, path);
g_free (trimmed);
-
- iter = parsed;
- while (iter != NULL)
- {
- Package *req;
- RequiredVersion *ver = iter->data;
-
- req = get_package (ver->name);
-
- if (req == NULL)
- {
- verbose_error ("Package '%s', required by '%s', not found\n",
- ver->name, pkg->name ? pkg->name : path);
-
- exit (1);
- }
-
- if (pkg->required_versions == NULL)
- pkg->required_versions = g_hash_table_new (g_str_hash, g_str_equal);
-
- g_hash_table_insert (pkg->required_versions, ver->name, ver);
-
- pkg->requires = g_slist_prepend (pkg->requires, req);
-
- iter = g_slist_next (iter);
- }
-
- g_slist_free (parsed);
}
static void
parse_requires_private (Package *pkg, const char *str, const char *path)
{
- GSList *parsed;
- GSList *iter;
char *trimmed;
-
+
if (pkg->requires_private)
{
verbose_error ("Requires.private field occurs twice in '%s'\n", path);
@@ -582,36 +550,8 @@ parse_requires_private (Package *pkg, const char *str, const char *path)
}
trimmed = trim_and_sub (pkg, str, path);
- parsed = parse_module_list (pkg, trimmed, path);
+ pkg->requires_private_entries = parse_module_list (pkg, trimmed, path);
g_free (trimmed);
-
- iter = parsed;
- while (iter != NULL)
- {
- Package *req;
- RequiredVersion *ver = iter->data;
-
- req = get_package (ver->name);
-
- if (req == NULL)
- {
- verbose_error ("Package '%s', required by '%s', not found\n",
- ver->name, pkg->name ? pkg->name : path);
-
- exit (1);
- }
-
- if (pkg->required_versions == NULL)
- pkg->required_versions = g_hash_table_new (g_str_hash, g_str_equal);
-
- g_hash_table_insert (pkg->required_versions, ver->name, ver);
-
- pkg->requires_private = g_slist_prepend (pkg->requires_private, req);
-
- iter = g_slist_next (iter);
- }
-
- g_slist_free (parsed);
}
static void
@@ -1152,14 +1092,6 @@ parse_package_file (const char *path, gboolean ignore_requires,
g_string_free (str, TRUE);
fclose(f);
- /* make ->requires_private include a copy of the public requires too */
- pkg->requires_private = g_slist_concat(g_slist_copy (pkg->requires),
- pkg->requires_private);
-
- pkg->requires = g_slist_reverse (pkg->requires);
-
- pkg->requires_private = g_slist_reverse (pkg->requires_private);
-
pkg->I_cflags = g_slist_reverse (pkg->I_cflags);
pkg->other_cflags = g_slist_reverse (pkg->other_cflags);
diff --git a/pkg.c b/pkg.c
index 547fcc3..dcbf85e 100644
--- a/pkg.c
+++ b/pkg.c
@@ -264,6 +264,7 @@ internal_get_package (const char *name, gboolean warn)
{
Package *pkg = NULL;
const char *location;
+ GSList *iter;
pkg = g_hash_table_lookup (packages, name);
@@ -349,13 +350,65 @@ internal_get_package (const char *name, gboolean warn)
debug_spew ("Path position of '%s' is %d\n",
pkg->name, pkg->path_position);
- verify_package (pkg);
-
- debug_spew ("Adding '%s' to list of known packages, returning as package '%s'\n",
- pkg->key, name);
-
+ debug_spew ("Adding '%s' to list of known packages\n", pkg->key);
g_hash_table_insert (packages, pkg->key, pkg);
+ /* pull in Requires packages */
+ for (iter = pkg->requires_entries; iter != NULL; iter = g_slist_next (iter))
+ {
+ Package *req;
+ RequiredVersion *ver = iter->data;
+
+ debug_spew ("Searching for '%s' requirement '%s'\n",
+ pkg->name, ver->name);
+ req = internal_get_package (ver->name, warn);
+ if (req == NULL)
+ {
+ verbose_error ("Package '%s', required by '%s', not found\n",
+ ver->name, pkg->name);
+ exit (1);
+ }
+
+ if (pkg->required_versions == NULL)
+ pkg->required_versions = g_hash_table_new (g_str_hash, g_str_equal);
+
+ g_hash_table_insert (pkg->required_versions, ver->name, ver);
+ pkg->requires = g_slist_prepend (pkg->requires, req);
+ }
+
+ /* pull in Requires.private packages */
+ for (iter = pkg->requires_private_entries; iter != NULL;
+ iter = g_slist_next (iter))
+ {
+ Package *req;
+ RequiredVersion *ver = iter->data;
+
+ debug_spew ("Searching for '%s' private requirement '%s'\n",
+ pkg->name, ver->name);
+ req = internal_get_package (ver->name, warn);
+ if (req == NULL)
+ {
+ verbose_error ("Package '%s', required by '%s', not found\n",
+ ver->name, pkg->name);
+ exit (1);
+ }
+
+ if (pkg->required_versions == NULL)
+ pkg->required_versions = g_hash_table_new (g_str_hash, g_str_equal);
+
+ g_hash_table_insert (pkg->required_versions, ver->name, ver);
+ pkg->requires_private = g_slist_prepend (pkg->requires_private, req);
+ }
+
+ /* make requires_private include a copy of the public requires too */
+ pkg->requires_private = g_slist_concat(g_slist_copy (pkg->requires),
+ pkg->requires_private);
+
+ pkg->requires = g_slist_reverse (pkg->requires);
+ pkg->requires_private = g_slist_reverse (pkg->requires_private);
+
+ verify_package (pkg);
+
return pkg;
}
diff --git a/pkg.h b/pkg.h
index eeb5466..c1a49f6 100644
--- a/pkg.h
+++ b/pkg.h
@@ -52,7 +52,9 @@ struct _Package
char *description;
char *url;
char *pcfiledir; /* directory it was loaded from */
+ GSList *requires_entries;
GSList *requires;
+ GSList *requires_private_entries;
GSList *requires_private;
GSList *l_libs;
GSList *L_libs;