fragment, pkg: handle --static correctly in some more esoteric scenarios

pull/81/head
William Pitcock 2015-05-21 23:06:38 -05:00
parent fa665a40a5
commit 1cc0ae62a9
3 changed files with 31 additions and 18 deletions

View File

@ -86,7 +86,7 @@ pkg_fragment_lookup(pkg_list_t *list, pkg_fragment_t *base)
{
pkg_node_t *node;
PKG_FOREACH_LIST_ENTRY(list->head, node)
PKG_FOREACH_LIST_ENTRY_REVERSE(list->tail, node)
{
pkg_fragment_t *frag = node->data;
@ -101,11 +101,18 @@ pkg_fragment_lookup(pkg_list_t *list, pkg_fragment_t *base)
}
static inline bool
pkg_fragment_can_merge_back(pkg_fragment_t *base, unsigned int flags)
pkg_fragment_can_merge_back(pkg_fragment_t *base, unsigned int flags, bool is_private)
{
if ((flags & PKGF_MERGE_PRIVATE_FRAGMENTS) && base->type == 'l')
(void) flags;
if (base->type == 'l')
{
if (is_private)
return false;
return true;
}
if (base->type == 'F')
return false;
@ -113,10 +120,13 @@ pkg_fragment_can_merge_back(pkg_fragment_t *base, unsigned int flags)
}
static inline bool
pkg_fragment_can_merge(pkg_fragment_t *base, unsigned int flags)
pkg_fragment_can_merge(pkg_fragment_t *base, unsigned int flags, bool is_private)
{
(void) flags;
if (is_private)
return false;
if (!strncmp(base->data, "-framework", 10))
return false;
@ -124,25 +134,25 @@ pkg_fragment_can_merge(pkg_fragment_t *base, unsigned int flags)
}
static inline pkg_fragment_t *
pkg_fragment_exists(pkg_list_t *list, pkg_fragment_t *base, unsigned int flags)
pkg_fragment_exists(pkg_list_t *list, pkg_fragment_t *base, unsigned int flags, bool is_private)
{
if (!pkg_fragment_can_merge_back(base, flags))
if (!pkg_fragment_can_merge_back(base, flags, is_private))
return NULL;
if (!pkg_fragment_can_merge(base, flags))
if (!pkg_fragment_can_merge(base, flags, is_private))
return NULL;
return pkg_fragment_lookup(list, base);
}
void
pkg_fragment_copy(pkg_list_t *list, pkg_fragment_t *base, unsigned int flags)
pkg_fragment_copy(pkg_list_t *list, pkg_fragment_t *base, unsigned int flags, bool is_private)
{
pkg_fragment_t *frag;
if ((frag = pkg_fragment_exists(list, base, flags)) != NULL)
if ((frag = pkg_fragment_exists(list, base, flags, is_private)) != NULL)
pkg_fragment_delete(list, frag);
else if (!pkg_fragment_can_merge_back(base, flags) && (pkg_fragment_lookup(list, base) != NULL))
else if (!is_private && !pkg_fragment_can_merge_back(base, flags, is_private) && (pkg_fragment_lookup(list, base) != NULL))
return;
frag = calloc(sizeof(pkg_fragment_t), 1);

11
pkg.c
View File

@ -972,7 +972,7 @@ pkg_traverse(pkg_t *root,
if (flags & PKGF_SEARCH_PRIVATE)
{
eflags = pkg_walk_list(root, &root->requires_private, func, data, maxdepth, rflags);
eflags = pkg_walk_list(root, &root->requires_private, func, data, maxdepth, rflags | PKGF_ITER_PKG_IS_PRIVATE);
if (eflags != PKG_ERRF_OK)
return eflags;
}
@ -990,8 +990,7 @@ pkg_cflags_collect(pkg_t *pkg, void *data, unsigned int flags)
PKG_FOREACH_LIST_ENTRY(pkg->cflags.head, node)
{
pkg_fragment_t *frag = node->data;
pkg_fragment_copy(list, frag, flags);
pkg_fragment_copy(list, frag, flags, false);
}
}
@ -1006,7 +1005,7 @@ pkg_cflags_private_collect(pkg_t *pkg, void *data, unsigned int flags)
{
pkg_fragment_t *frag = node->data;
pkg_fragment_copy(list, frag, flags);
pkg_fragment_copy(list, frag, flags, true);
}
}
@ -1039,7 +1038,7 @@ pkg_libs_collect(pkg_t *pkg, void *data, unsigned int flags)
PKG_FOREACH_LIST_ENTRY(pkg->libs.head, node)
{
pkg_fragment_t *frag = node->data;
pkg_fragment_copy(list, frag, flags);
pkg_fragment_copy(list, frag, flags, (flags & PKGF_ITER_PKG_IS_PRIVATE) != 0);
}
if (flags & PKGF_MERGE_PRIVATE_FRAGMENTS)
@ -1047,7 +1046,7 @@ pkg_libs_collect(pkg_t *pkg, void *data, unsigned int flags)
PKG_FOREACH_LIST_ENTRY(pkg->libs_private.head, node)
{
pkg_fragment_t *frag = node->data;
pkg_fragment_copy(list, frag, flags);
pkg_fragment_copy(list, frag, flags, true);
}
}
}

6
pkg.h
View File

@ -48,6 +48,9 @@ typedef struct pkg_fragment_ pkg_fragment_t;
#define PKG_FOREACH_LIST_ENTRY_SAFE(head, nextiter, value) \
for ((value) = (head), (nextiter) = (head) != NULL ? (head)->next : NULL; (value) != NULL; (value) = (nextiter), (nextiter) = (nextiter) != NULL ? (nextiter)->next : NULL)
#define PKG_FOREACH_LIST_ENTRY_REVERSE(tail, value) \
for ((value) = (tail); (value) != NULL; (value) = (value)->prev)
#define PKG_MIN(a,b) (((a) < (b)) ? (a) : (b))
#define PKG_MAX(a,b) (((a) > (b)) ? (a) : (b))
@ -119,6 +122,7 @@ struct pkg_ {
#define PKGF_NO_CACHE 0x040
#define PKGF_MUNGE_SYSROOT_PREFIX 0x080
#define PKGF_SKIP_ERRORS 0x100
#define PKGF_ITER_PKG_IS_PRIVATE 0x200
#define PKG_ERRF_OK 0x0
#define PKG_ERRF_PACKAGE_NOT_FOUND 0x1
@ -159,7 +163,7 @@ void pkg_argv_free(char **argv);
/* fragment.c */
void pkg_fragment_parse(pkg_list_t *list, pkg_list_t *vars, const char *value, unsigned int flags);
void pkg_fragment_add(pkg_list_t *list, const char *string, unsigned int flags);
void pkg_fragment_copy(pkg_list_t *list, pkg_fragment_t *base, unsigned int flags);
void pkg_fragment_copy(pkg_list_t *list, pkg_fragment_t *base, unsigned int flags, bool is_private);
void pkg_fragment_delete(pkg_list_t *list, pkg_fragment_t *node);
void pkg_fragment_free(pkg_list_t *list);