diff --git a/pkg.c b/pkg.c index 8508c1c..67a67b1 100644 --- a/pkg.c +++ b/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); diff --git a/pkg.h b/pkg.h index f871124..24148c1 100644 --- a/pkg.h +++ b/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 diff --git a/tests/run.sh.in b/tests/run.sh.in index 97a4e1b..4291e2c 100644 --- a/tests/run.sh.in +++ b/tests/run.sh.in @@ -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'