/* * pkg_verify_dependency(pkgdep, flags) * * verify a pkg_dependency_t node in the depgraph. if the dependency is solvable, * return the appropriate pkg_t object, else NULL. */ pkg_t * pkg_verify_dependency(pkg_dependency_t *pkgdep, unsigned int flags, unsigned int *eflags) { pkg_t *pkg = &pkg_config_virtual; if (eflags != NULL) *eflags = PKG_ERRF_OK; /* pkg-config package name is special cased. */ if (strcasecmp(pkgdep->package, "pkg-config")) { pkg = pkg_find(pkgdep->package, flags); if (pkg == NULL) { if (eflags != NULL) *eflags |= PKG_ERRF_PACKAGE_NOT_FOUND; return NULL; } } if (pkg->id == NULL) pkg->id = strdup(pkgdep->package); switch(pkgdep->compare) { case PKG_LESS_THAN: if (pkg_compare_version(pkg->version, pkgdep->version) < 0) return pkg; break; case PKG_GREATER_THAN: if (pkg_compare_version(pkg->version, pkgdep->version) > 0) return pkg; break; case PKG_LESS_THAN_EQUAL: if (pkg_compare_version(pkg->version, pkgdep->version) <= 0) return pkg; break; case PKG_GREATER_THAN_EQUAL: if (pkg_compare_version(pkg->version, pkgdep->version) >= 0) return pkg; break; case PKG_EQUAL: if (pkg_compare_version(pkg->version, pkgdep->version) == 0) return pkg; break; case PKG_NOT_EQUAL: if (pkg_compare_version(pkg->version, pkgdep->version) != 0) return pkg; break; case PKG_ANY: default: return pkg; } if (eflags != NULL) *eflags |= PKG_ERRF_PACKAGE_VER_MISMATCH; return pkg; }
static void addlibrary_process(struct package *pkg, int argc, char **argv) { char *pkg_name; int i, j; char *cmd_name; struct slice *cmd_args; struct package *impkg; if (argc < 1) { fprintf(stderr, "too few arguments for to cmd: add_library\n"); exit(-1); } // maybe a ring //if (pkg->status & PKG_PENDING) { // fprintf(stderr, "the dependence link is a loop: %s\n", pkg->name); // exit(-1); //} for (i = 0; i < argc; i++) { if (!(impkg = pkg_find(argv[i]))) { fprintf(stderr, "unknown package: %s\n", argv[i]); exit(-1); } if (!(impkg->status & PKG_DEPENDENCE_DONE)) { for (j = 0; j < slice_size(&impkg->cmdops); j++) { cmd_args = slice_get(&impkg->cmdops, j); if ((cmd_name = slice_get(cmd_args, 0)) && (strcmp(cmd_name, "add_library"))) { addlibrary_process(impkg, slice_size(&impkg->cmdops) - 1, (char **)slice_data(&impkg->cmdops) + 1); } } } slice_merge_from(&pkg->aux_source, &impkg->aux_source); } return; }