]> git.ipfire.org Git - pakfire.git/commitdiff
build: Start creating a new build environment
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 8 Aug 2022 15:02:48 +0000 (15:02 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 8 Aug 2022 15:02:48 +0000 (15:02 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/build.c
src/libpakfire/include/pakfire/build.h
src/libpakfire/libpakfire.sym

index afc3cadb58fec717c6adbca4f3bfecddbb5afa69..6cd0edde959d0579225f5fc6056da79b3c596e19 100644 (file)
 #include <pakfire/scriptlet.h>
 #include <pakfire/util.h>
 
+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];
index cdb28b85205f02d585ad26b448b10e6537c8db6e..2af00c746768301ba8ad475be5dea71ee2394d25 100644 (file)
 
 #include <pakfire/pakfire.h>
 
+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);
index bccd9cde868b690e18b534db57b57b56d7ced08b..d527125abe96c298ce2b82abe37165228b418ca0 100644 (file)
@@ -70,6 +70,9 @@ global:
 
        # build
        pakfire_build;
+       pakfire_build_create;
+       pakfire_build_ref;
+       pakfire_build_unref;
        pakfire_shell;
 
        # dist