Exemplo n.º 1
0
/*
 * 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;
}
Exemplo n.º 2
0
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;
}