forked from ariadne/pkgconf
pkg: implement a cache for packages and use it to break circular dependencies
parent
d4cef5cad5
commit
14f3e1edd2
34
pkg.c
34
pkg.c
|
@ -140,6 +140,8 @@ pkg_get_parent_dir(pkg_t *pkg)
|
|||
return buf;
|
||||
}
|
||||
|
||||
static pkg_t *pkg_cache = NULL;
|
||||
|
||||
/*
|
||||
* pkg_new_from_file(filename, file)
|
||||
*
|
||||
|
@ -236,6 +238,15 @@ pkg_free(pkg_t *pkg)
|
|||
if (pkg == NULL || pkg->flags & PKG_PROPF_VIRTUAL)
|
||||
return;
|
||||
|
||||
if (pkg->next != NULL)
|
||||
pkg->next->prev = pkg->prev;
|
||||
|
||||
if (pkg->prev != NULL)
|
||||
pkg->prev->next = pkg->next;
|
||||
|
||||
if (pkg == pkg_cache)
|
||||
pkg_cache = pkg->next;
|
||||
|
||||
pkg_dependency_free(pkg->requires);
|
||||
pkg_dependency_free(pkg->requires_private);
|
||||
pkg_dependency_free(pkg->conflicts);
|
||||
|
@ -419,6 +430,21 @@ pkg_find(const char *name, unsigned int flags)
|
|||
return pkg_new_from_file(name, f);
|
||||
}
|
||||
|
||||
/* check cache */
|
||||
if (!(flags & PKGF_NO_CACHE))
|
||||
{
|
||||
PKG_FOREACH_LIST_ENTRY(pkg_cache, pkg)
|
||||
{
|
||||
if (!strcmp(pkg->id, name))
|
||||
{
|
||||
pkg->flags |= PKG_PROPF_CACHED;
|
||||
return pkg;
|
||||
}
|
||||
}
|
||||
|
||||
pkg = NULL;
|
||||
}
|
||||
|
||||
/* PKG_CONFIG_PATH has to take precedence */
|
||||
env_path = getenv("PKG_CONFIG_PATH");
|
||||
if (env_path)
|
||||
|
@ -456,6 +482,12 @@ pkg_find(const char *name, unsigned int flags)
|
|||
#endif
|
||||
|
||||
out:
|
||||
if (!(flags & PKGF_NO_CACHE))
|
||||
{
|
||||
pkg->next = pkg_cache;
|
||||
pkg_cache = pkg;
|
||||
}
|
||||
|
||||
path_free(path, count);
|
||||
return pkg;
|
||||
}
|
||||
|
@ -809,6 +841,8 @@ pkg_walk_list(pkg_dependency_t *deplist,
|
|||
pkgdep = pkg_verify_dependency(node, flags, &eflags);
|
||||
if (eflags != PKG_ERRF_OK)
|
||||
return pkg_report_graph_error(pkgdep, node, eflags);
|
||||
if (pkgdep->flags & PKG_PROPF_CACHED)
|
||||
continue;
|
||||
|
||||
eflags = pkg_traverse(pkgdep, func, data, depth - 1, flags);
|
||||
pkg_free(pkgdep);
|
||||
|
|
4
pkg.h
4
pkg.h
|
@ -80,8 +80,11 @@ typedef struct pkg_queue_ {
|
|||
|
||||
#define PKG_PROPF_NONE 0x0
|
||||
#define PKG_PROPF_VIRTUAL 0x1
|
||||
#define PKG_PROPF_CACHED 0x2
|
||||
|
||||
struct pkg_ {
|
||||
pkg_t *prev, *next; /* for pkg_cache */
|
||||
|
||||
char *id;
|
||||
char *filename;
|
||||
char *realname;
|
||||
|
@ -114,6 +117,7 @@ struct pkg_ {
|
|||
#define PKGF_SKIP_ROOT_VIRTUAL 0x08
|
||||
#define PKGF_MERGE_PRIVATE_FRAGMENTS 0x10
|
||||
#define PKGF_SKIP_CONFLICTS 0x20
|
||||
#define PKGF_NO_CACHE 0x40
|
||||
|
||||
#define PKG_ERRF_OK 0x0
|
||||
#define PKG_ERRF_PACKAGE_NOT_FOUND 0x1
|
||||
|
|
|
@ -87,9 +87,9 @@ run_test "PKG_CONFIG_PATH='${selfdir}/lib1' ${1} --exists '' 'foo'; echo \$?" \
|
|||
run_test "PKG_CONFIG_PATH='${selfdir}/lib1' ${1} --libs intermediary-1 intermediary-2" \
|
||||
'-lintermediary-1 -lintermediary-2 -lfoo -lbar -lbaz'
|
||||
run_test "PKG_CONFIG_PATH='${selfdir}/lib1' ${1} --libs circular-1" \
|
||||
'-lcircular-2 -lcircular-3 -lcircular-1'
|
||||
run_test "PKG_CONFIG_PATH='${selfdir}/lib1' ${1} --libs circular-3" \
|
||||
'-lcircular-1 -lcircular-2 -lcircular-3'
|
||||
run_test "PKG_CONFIG_PATH='${selfdir}/lib1' ${1} --libs circular-3" \
|
||||
'-lcircular-3 -lcircular-1 -lcircular-2'
|
||||
run_test "PKG_CONFIG_PATH='${selfdir}/lib1' ${1} --libs static-archive-libs" \
|
||||
'/libfoo.a -pthread'
|
||||
|
||||
|
|
Loading…
Reference in New Issue