From: Michael Tremer Date: Mon, 8 Aug 2022 15:02:48 +0000 (+0000) Subject: build: Start creating a new build environment X-Git-Tag: 0.9.28~581 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=abbad00be2afdb819dfe9c35462fe2849c4f6b31;p=pakfire.git build: Start creating a new build environment Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/build.c b/src/libpakfire/build.c index afc3cadb5..6cd0edde9 100644 --- a/src/libpakfire/build.c +++ b/src/libpakfire/build.c @@ -40,6 +40,17 @@ #include #include +struct pakfire_build { + struct pakfire* pakfire; + int nrefs; + + // Flags + int flags; + + // Build ID + uuid_t id; +}; + static const char* stages[] = { "prepare", "build", @@ -764,6 +775,75 @@ ERROR: return r; } +static void pakfire_build_free(struct pakfire_build* build) { + pakfire_unref(build->pakfire); + free(build); +} + +static int pakfire_build_parse_id(struct pakfire_build* build, const char* id) { + int r; + + // Try parsing the Build ID + if (id) { + r = uuid_parse(id, build->id); + if (r) { + ERROR(build->pakfire, "Could not parse build ID '%s'\n", id); + return r; + } + + // Otherwise initialize the Build ID with something random + } else { + uuid_generate_random(build->id); + } + + return 0; +} + +PAKFIRE_EXPORT int pakfire_build_create(struct pakfire_build** build, + struct pakfire* pakfire, const char* id, int flags) { + int r; + + // Allocate build object + struct pakfire_build* b = calloc(1, sizeof(*b)); + if (!b) + return 1; + + // Reference pakfire + b->pakfire = pakfire_ref(pakfire); + + // Initialize reference counter + b->nrefs = 1; + + // Copy flags + b->flags = flags; + + // Parse ID + r = pakfire_build_parse_id(b, id); + if (r) + goto ERROR; + + *build = b; + return 0; + +ERROR: + pakfire_build_free(b); + return r; +} + +struct pakfire_build* pakfire_build_ref(struct pakfire_build* build) { + ++build->nrefs; + + return build; +} + +struct pakfire_build* pakfire_build_unref(struct pakfire_build* build) { + if (--build->nrefs > 0) + return build; + + pakfire_build_free(build); + return NULL; +} + PAKFIRE_EXPORT int pakfire_build(struct pakfire* pakfire, const char* path, const char* target, const char* id, int flags) { char makefiles[PATH_MAX]; diff --git a/src/libpakfire/include/pakfire/build.h b/src/libpakfire/include/pakfire/build.h index cdb28b852..2af00c746 100644 --- a/src/libpakfire/include/pakfire/build.h +++ b/src/libpakfire/include/pakfire/build.h @@ -23,6 +23,14 @@ #include +struct pakfire_build; + +int pakfire_build_create(struct pakfire_build** build, + struct pakfire* pakfire, const char* id, int flags); + +struct pakfire_build* pakfire_build_ref(struct pakfire_build* build); +struct pakfire_build* pakfire_build_unref(struct pakfire_build* build); + int pakfire_build(struct pakfire* pakfire, const char* path, const char* target, const char* id, int flags); int pakfire_shell(struct pakfire* pakfire, const char** packages); diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index bccd9cde8..d527125ab 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -70,6 +70,9 @@ global: # build pakfire_build; + pakfire_build_create; + pakfire_build_ref; + pakfire_build_unref; pakfire_shell; # dist