Received: from mail-qv1-f68.google.com (mail-qv1-f68.google.com [209.85.219.68]) by nld3-dev1.alpinelinux.org (Postfix) with ESMTPS id 3DE56782B61 for <~alpine/aports@lists.alpinelinux.org>; Mon, 30 Mar 2020 00:14:19 +0000 (UTC) Received: by mail-qv1-f68.google.com with SMTP id s18so3639067qvn.1 for <~alpine/aports@lists.alpinelinux.org>; Sun, 29 Mar 2020 17:14:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:subject:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=OejgZPM9cN62ISWYXr+ZUZJqXsmhlAWMcZtzgZ8xXyk=; b=pht2Qh56D0v7v9ogY/R5Rvw/NKEhdatCZN0+hOnwS2WMRRAnrdvZKAOBfEC4gJwtfk SHlimha5Crl2u6PQiWxhDnkFAJOjg7Gli3xL5Nq6AOOPVBk1mNC5+7rOfu0tru4q/UsB dyFMU/ljjT/PvTrLfSfVs7BPefSauCwWbsUmXeIZTpJYuNa3T+8c1fFibTvJCF7JCX5F kZW4dH0TaqT+/zxNXSIw8lewMHpVsjS0PRrUJaqJrDpGZ4oiZpKPTpkhz9um5GL8FM1h m4USh182olKXni+ORwoHi94HX20bsdedpUJ/qBQJOVy6Sptrl0K7FiOlj9Oq9OEMGVdb e8dw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:subject:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=OejgZPM9cN62ISWYXr+ZUZJqXsmhlAWMcZtzgZ8xXyk=; b=F+4evRvsvY+09nQ3u8trtrW5Xg2hx0vm/0x6mJD+oFx6RZqYrsTI0k5uoCZND927qr npo2YVKmChvEDfAVqEDQOZTqFadVrXd7p4k7NdFniDXJkMGLwC8qFo9ZXkNilPKMJclP prOzxE+jo9cLeUuJarpGzHQMgrgiUFN3uxWA84W1rSZc6z5RTzGpl7yXIjMqA6NSvhK2 o4V88wDB8QFbzkkaMu3ZYr1jFJBnjBt9/szzwvS3rNVvPq7cLV3dUiSh1Pq3L9E2cdlM JhgVy3FrT4ErQLiP5HX0vfZe43RZmkKDTezrtskc16Sz6KIR0AFDuno95dvoFd0DZ302 ttfQ== X-Gm-Message-State: ANhLgQ1lm3ktaSjdJN+pAZYrPlPVfcpWIMcTUBRdBWozJs370ieNKCV1 Z+cPkBlE5UUIGFtT8InG81DQmnKa X-Google-Smtp-Source: ADFU+vtewkH5X2Ojl7j/A7MIdIiRghrezGgV6AtwUmJmEpDofbk8ZN+cIYY/4I6Yf+rjt6oAwCDKlw== X-Received: by 2002:a05:6214:17c8:: with SMTP id cu8mr9728214qvb.178.1585527257724; Sun, 29 Mar 2020 17:14:17 -0700 (PDT) Received: from enterprise ([2804:431:cfcd:a356:619d:8f61:45b9:c5a2]) by smtp.gmail.com with ESMTPSA id s188sm9038427qkh.67.2020.03.29.17.14.16 for <~alpine/aports@lists.alpinelinux.org> (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Mar 2020 17:14:17 -0700 (PDT) Date: Sun, 29 Mar 2020 21:13:36 -0300 From: Leo To: ~alpine/aports@lists.alpinelinux.org Subject: Re: [PATCH] main/samurai: upgrade to 1.1 Message-ID: <20200329211336.4793ef7f@enterprise> In-Reply-To: <20200329235405.21051-1-sir@cmpwn.com> References: <20200329235405.21051-1-sir@cmpwn.com> X-Mailer: Claws Mail 3.17.5 (GTK+ 2.24.32; x86_64-alpine-linux-musl) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit On Sun, 29 Mar 2020 19:54:05 -0400 Drew DeVault wrote: > --- > ...uild-when-it-was-pruned-due-to-resta.patch | 86 -------- > ...eck-that-rules-always-have-a-command.patch | 54 ----- > ...-rules-have-rspfile-iff-they-have-rs.patch | 56 ----- > main/samurai/0004-tool-Implement-compdb.patch | 197 > ------------------ ...issing-depfile-as-empty-for-deps-log.patch | > 64 ------ main/samurai/APKBUILD | 18 +- > 6 files changed, 4 insertions(+), 471 deletions(-) > delete mode 100644 > main/samurai/0001-Fix-manifest-rebuild-when-it-was-pruned-due-to-resta.patch > delete mode 100644 > main/samurai/0002-parse-Check-that-rules-always-have-a-command.patch > delete mode 100644 > main/samurai/0003-parse-Check-that-rules-have-rspfile-iff-they-have-rs.patch > delete mode 100644 main/samurai/0004-tool-Implement-compdb.patch > delete mode 100644 > main/samurai/0005-deps-treat-missing-depfile-as-empty-for-deps-log.patch > > diff --git > a/main/samurai/0001-Fix-manifest-rebuild-when-it-was-pruned-due-to-resta.patch > b/main/samurai/0001-Fix-manifest-rebuild-when-it-was-pruned-due-to-resta.patch > deleted file mode 100644 index eaabb4019c..0000000000 --- > a/main/samurai/0001-Fix-manifest-rebuild-when-it-was-pruned-due-to-resta.patch > +++ /dev/null @@ -1,86 +0,0 @@ > -From c7f1cfd9ed674936e21f99f8c18608b97685d5a7 Mon Sep 17 00:00:00 > 2001 -From: Michael Forney > -Date: Fri, 17 Jan 2020 12:53:59 -0800 > -Subject: [PATCH 1/4] Fix manifest rebuild when it was pruned due to > restat - > -If build.ninja depends on an output with `restat = 1`, it may get > -pruned if the output did not change. In this case, we can continue > -with the build, since the previously loaded manifest is still > -correct. > - > -To make sure that we can add new build targets and start a new build > -after executing the build for another target, add a function to > -reset the build state. > - > -Fixes #31. > ---- > - build.c | 17 +++++++++++++++++ > - build.h | 2 ++ > - samu.c | 10 +++++++--- > - 3 files changed, 26 insertions(+), 3 deletions(-) > - > -diff --git a/build.c b/build.c > -index 7d50d1e..71dda17 100644 > ---- a/build.c > -+++ b/build.c > -@@ -32,6 +32,23 @@ static struct edge *work; > - static size_t nstarted, ntotal; > - static bool consoleused; > - > -+void > -+buildreset(void) { > -+ struct edge *e; > -+ struct node *n; > -+ size_t i; > -+ > -+ for (e = alledges; e; e = e->allnext) { > -+ e->flags = 0; > -+ for (i = 0; i < e->nout; ++i) { > -+ n = e->out[i]; > -+ free(n->use); > -+ n->nuse = 0; > -+ n->use = NULL; > -+ } > -+ } > -+} > -+ > - /* returns whether n1 is newer than n2, or false if n1 is NULL */ > - static bool > - isnewer(struct node *n1, struct node *n2) > -diff --git a/build.h b/build.h > -index fa221bd..6eb1988 100644 > ---- a/build.h > -+++ b/build.h > -@@ -7,6 +7,8 @@ struct buildoptions { > - > - extern struct buildoptions buildopts; > - > -+/* reset state, so a new build can be executed */ > -+void buildreset(void); > - /* schedule a particular target to be built */ > - void buildadd(struct node *); > - /* execute rules to build the scheduled targets */ > -diff --git a/samu.c b/samu.c > -index a489b0f..f09c808 100644 > ---- a/samu.c > -+++ b/samu.c > -@@ -240,9 +240,13 @@ retry: > - buildadd(n); > - if (n->dirty) { > - build(); > -- if (++tries > 100) > -- fatal("manifest '%s' dirty after > 100 tries", manifest); -- goto retry; > -+ if (n->gen->flags & FLAG_DIRTY_OUT || > n->gen->nprune > 0) { -+ if (++tries > > 100) -+ fatal("manifest '%s' > dirty after 100 tries", manifest); -+ > goto retry; -+ } > -+ /* manifest was pruned; reset state, then > continue with build */ -+ buildreset(); > - } > - } > - > --- > -2.24.0 > - > diff --git > a/main/samurai/0002-parse-Check-that-rules-always-have-a-command.patch > b/main/samurai/0002-parse-Check-that-rules-always-have-a-command.patch > deleted file mode 100644 index 9256ab9421..0000000000 --- > a/main/samurai/0002-parse-Check-that-rules-always-have-a-command.patch > +++ /dev/null @@ -1,54 +0,0 @@ > -From 6d510d99dee4135bcb6f973c6e208f05f889bc8d Mon Sep 17 00:00:00 > 2001 -From: Michael Forney > -Date: Wed, 22 Jan 2020 10:45:07 -0800 > -Subject: [PATCH 2/4] parse: Check that rules always have a command > - > -This way, we catch the error earlier than build(), and won't have > -to repeat the check for the compdb tool. > ---- > - build.c | 4 ---- > - parse.c | 5 +++++ > - 2 files changed, 5 insertions(+), 4 deletions(-) > - > -diff --git a/build.c b/build.c > -index 71dda17..c382c17 100644 > ---- a/build.c > -+++ b/build.c > -@@ -231,10 +231,6 @@ jobstart(struct job *j, struct edge *e) > - } > - j->edge = e; > - j->cmd = edgevar(e, "command", true); > -- if (!j->cmd) { > -- warn("rule '%s' has no command", e->rule->name); > -- goto err2; > -- } > - j->fd = fd[0]; > - argv[2] = j->cmd->s; > - > -diff --git a/parse.c b/parse.c > -index f8f9509..6d07816 100644 > ---- a/parse.c > -+++ b/parse.c > -@@ -35,6 +35,7 @@ parserule(struct scanner *s, struct environment > *env) > - struct rule *r; > - char *var; > - struct evalstring *val; > -+ bool hascommand = false; > - > - r = mkrule(scanname(s)); > - scannewline(s); > -@@ -42,7 +43,11 @@ parserule(struct scanner *s, struct environment > *env) > - var = scanname(s); > - parselet(s, &val); > - ruleaddvar(r, var, val); > -+ if (strcmp(var, "command") == 0) > -+ hascommand = true; > - } > -+ if (!hascommand) > -+ fatal("rule '%s' has no command", r->name); > - envaddrule(env, r); > - } > - > --- > -2.24.0 > - > diff --git > a/main/samurai/0003-parse-Check-that-rules-have-rspfile-iff-they-have-rs.patch > b/main/samurai/0003-parse-Check-that-rules-have-rspfile-iff-they-have-rs.patch > deleted file mode 100644 index 3915fc1bd2..0000000000 --- > a/main/samurai/0003-parse-Check-that-rules-have-rspfile-iff-they-have-rs.patch > +++ /dev/null @@ -1,56 +0,0 @@ > -From f549b757394fdb4ac27e4a4bc42e865e98434361 Mon Sep 17 00:00:00 > 2001 -From: Michael Forney > -Date: Wed, 22 Jan 2020 11:36:30 -0800 > -Subject: [PATCH 3/4] parse: Check that rules have $rspfile iff they > have > - $rspfile_content > - > ---- > - parse.c | 8 +++++++- > - util.c | 2 +- > - 2 files changed, 8 insertions(+), 2 deletions(-) > - > -diff --git a/parse.c b/parse.c > -index 6d07816..413e5d7 100644 > ---- a/parse.c > -+++ b/parse.c > -@@ -35,7 +35,7 @@ parserule(struct scanner *s, struct environment > *env) > - struct rule *r; > - char *var; > - struct evalstring *val; > -- bool hascommand = false; > -+ bool hascommand = false, hasrspfile = false, hasrspcontent > = false; > - > - r = mkrule(scanname(s)); > - scannewline(s); > -@@ -45,9 +45,15 @@ parserule(struct scanner *s, struct environment > *env) > - ruleaddvar(r, var, val); > - if (strcmp(var, "command") == 0) > - hascommand = true; > -+ else if (strcmp(var, "rspfile") == 0) > -+ hasrspfile = true; > -+ else if (strcmp(var, "rspfile_content") == 0) > -+ hasrspcontent = true; > - } > - if (!hascommand) > - fatal("rule '%s' has no command", r->name); > -+ if (hasrspfile != hasrspcontent) > -+ fatal("rule '%s' has rspfile and no rspfile_content > or vice versa", r->name); > - envaddrule(env, r); > - } > - > -diff --git a/util.c b/util.c > -index 8eccf92..39bab18 100644 > ---- a/util.c > -+++ b/util.c > -@@ -257,7 +257,7 @@ writefile(const char *name, struct string *s) > - return -1; > - } > - ret = 0; > -- if (s && (fwrite(s->s, 1, s->n, f) != s->n || fflush(f) != > 0)) { -+ if (fwrite(s->s, 1, s->n, f) != s->n || fflush(f) != > 0) { > - warn("write %s:", name); > - ret = -1; > - } > --- > -2.24.0 > - > diff --git a/main/samurai/0004-tool-Implement-compdb.patch > b/main/samurai/0004-tool-Implement-compdb.patch deleted file mode > 100644 index fff96e6804..0000000000 > --- a/main/samurai/0004-tool-Implement-compdb.patch > +++ /dev/null > @@ -1,197 +0,0 @@ > -From 9c1f015c21211c5df5822f70d3d5be81bd54fee2 Mon Sep 17 00:00:00 > 2001 -From: Michael Forney > -Date: Wed, 22 Jan 2020 11:50:03 -0800 > -Subject: [PATCH 4/4] tool: Implement compdb > - > -This tool outputs a JSON compilation database[0], which is used for > -integration with certain IDEs (for example, GNOME Builder). > - > -Fixes #33. > - > -[0] https://clang.llvm.org/docs/JSONCompilationDatabase.html > ---- > - samu.1 | 21 +++++++++++-- > - tool.c | 99 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > - 2 files changed, 117 insertions(+), 3 deletions(-) > - > -diff --git a/samu.1 b/samu.1 > -index a4f3f70..0f10e93 100644 > ---- a/samu.1 > -+++ b/samu.1 > -@@ -1,4 +1,4 @@ > --.Dd July 3, 2019 > -+.Dd January 22, 2019 > - .Dt SAMU 1 > - .Os > - .Sh NAME > -@@ -20,6 +20,12 @@ > - .Fl t Cm clean > - .Op Fl gr > - .Op Ar target... > -+.Nm > -+.Op Fl C Ar dir > -+.Op Fl f Ar buildfile > -+.Fl t Cm compdb > -+.Op Fl x > -+.Op Ar rule... > - .Sh DESCRIPTION > - .Nm > - loads a build manifest from > -@@ -48,6 +54,12 @@ Targets built with > - rules are only removed if > - .Fl g > - is specified. > -+.Pp > -+If the > -+.Cm compdb > -+tool is used, a compilation database > -+.Lk ( https://clang.llvm.org/docs/JSONCompilationDatabase.html ) > -+is printed instead. > - .Sh OPTIONS > - .Bl -tag -width Ds > - .It Fl C > -@@ -106,9 +118,10 @@ only print a diagnostic message. > - .It Fl t > - Instead of building, invoke a subtool. > - All arguments and flags after the subtool are interpreted by the > subtool. --Currently, > -+The currently supported subtools are > - .Cm clean > --is the only subtool. > -+and > -+.Cm compdb . > - .It Fl g > - When cleaning, also clean outputs of > - .Sy generator > -@@ -117,6 +130,8 @@ actions. > - .Ar targets > - are interpreted as rules, and all outputs of actions with the > specified rule > - types will be cleaned instead. > -+.It Fl x > -+When printing a compilation database, replace @$rspfile with > $rspfile_content (with in place of ). > - .El > - .Sh ENVIRONMENT > - .Bl -tag -width SAMUFLAGS > -diff --git a/tool.c b/tool.c > -index aae97c0..f77931e 100644 > ---- a/tool.c > -+++ b/tool.c > -@@ -1,7 +1,10 @@ > -+#define _POSIX_C_SOURCE 200809L > - #include > -+#include > - #include > - #include > - #include > -+#include > - #include "arg.h" > - #include "env.h" > - #include "graph.h" > -@@ -123,8 +126,104 @@ clean(int argc, char *argv[]) > - return ret; > - } > - > -+static void > -+printjson(const char *s, size_t n, bool join) > -+{ > -+ size_t i; > -+ char c; > -+ > -+ for (i = 0; i < n; ++i) { > -+ c = s[i]; > -+ switch (c) { > -+ case '"': > -+ case '\\': > -+ putchar('\\'); > -+ break; > -+ case '\n': > -+ if (join) > -+ c = ' '; > -+ break; > -+ case '\0': > -+ return; > -+ } > -+ putchar(c); > -+ } > -+} > -+ > -+static int > -+compdb(int argc, char *argv[]) > -+{ > -+ char dir[PATH_MAX], *p; > -+ struct edge *e; > -+ struct string *cmd, *rspfile, *content; > -+ bool expandrsp = false, first = true; > -+ int i; > -+ size_t off; > -+ > -+ ARGBEGIN { > -+ case 'x': > -+ expandrsp = true; > -+ break; > -+ default: > -+ fprintf(stderr, "usage: %s ... -t compdb [-x] > rules...\n", argv0); -+ return 2; > -+ } ARGEND > -+ > -+ if (!getcwd(dir, sizeof(dir))) > -+ fatal("getcwd:"); > -+ > -+ putchar('['); > -+ for (e = alledges; e; e = e->allnext) { > -+ if (e->nin == 0) > -+ continue; > -+ for (i = 0; i < argc; ++i) { > -+ if (strcmp(e->rule->name, argv[i]) == 0) { > -+ if (first) > -+ first = false; > -+ else > -+ putchar(','); > -+ > -+ printf("\n {\n \"directory\": > \""); -+ printjson(dir, -1, false); > -+ > -+ printf("\",\n \"command\": \""); > -+ cmd = edgevar(e, "command", true); > -+ rspfile = expandrsp ? edgevar(e, > "rspfile", true) : NULL; -+ p = > rspfile ? strstr(cmd->s, rspfile->s) : NULL; -+ > if (!p || p == cmd->s || p[-1] != '@') { -+ > printjson(cmd->s, cmd->n, false); > -+ } else { -+ > off = p - cmd->s; -+ > printjson(cmd->s, off - 1, false); -+ > content = edgevar(e, "rspfile_content", true); > -+ printjson(content->s, > content->n, true); -+ off += > rspfile->n; -+ > printjson(cmd->s + off, cmd->n - off, false); -+ > } -+ -+ printf("\",\n > \"file\": \""); -+ > printjson(e->in[0]->path->s, -1, false); -+ > -+ printf("\",\n \"output\": \""); > -+ printjson(e->out[0]->path->s, -1, > false); -+ > -+ printf("\",\n }"); > -+ break; > -+ } > -+ } > -+ } > -+ puts("\n]"); > -+ > -+ fflush(stdout); > -+ if (ferror(stdout)) > -+ fatal("write failed"); > -+ > -+ return 0; > -+} > -+ > - static const struct tool tools[] = { > - {"clean", clean}, > -+ {"compdb", compdb}, > - }; > - > - const struct tool * > --- > -2.24.0 > - > diff --git > a/main/samurai/0005-deps-treat-missing-depfile-as-empty-for-deps-log.patch > b/main/samurai/0005-deps-treat-missing-depfile-as-empty-for-deps-log.patch > deleted file mode 100644 index cdb0cb78b3..0000000000 --- > a/main/samurai/0005-deps-treat-missing-depfile-as-empty-for-deps-log.patch > +++ /dev/null @@ -1,64 +0,0 @@ > -From 9d15bff89c1566e40569f689696d0393e7659df1 Mon Sep 17 00:00:00 > 2001 -From: Michael Forney > -Date: Wed, 12 Feb 2020 23:19:05 -0800 > -Subject: [PATCH] deps: Treat missing depfile as empty for deps log > - > -This matches ninja's behavior. When deps is not set, a missing > -depfile causes the output to be dirty. When it is set, an empty set > -of dependencies is recorded into the log. > ---- > - deps.c | 15 +++++++++------ > - 1 file changed, 9 insertions(+), 6 deletions(-) > - > -diff --git a/deps.c b/deps.c > -index 4eef994..1338919 100644 > ---- a/deps.c > -+++ b/deps.c > -@@ -296,7 +296,7 @@ depsclose(void) > - } > - > - static struct nodearray * > --depsparse(const char *name) > -+depsparse(const char *name, bool allowmissing) > - { > - static struct buffer buf; > - static struct nodearray deps; > -@@ -306,12 +306,15 @@ depsparse(const char *name) > - int c, n; > - bool sawcolon; > - > -+ deps.len = 0; > - f = fopen(name, "r"); > -- if (!f) > -+ if (!f) { > -+ if (errno == ENOENT && allowmissing) > -+ return &deps; > - return NULL; > -+ } > - sawcolon = false; > - buf.len = 0; > -- deps.len = 0; > - c = getc(f); > - for (;;) { > - /* TODO: this parser needs to be rewritten to be > made simpler */ -@@ -438,9 +441,9 @@ depsload(struct edge *e) > - depfile = edgevar(e, "depfile", false); > - if (!depfile) > - return; > -- deps = depsparse(depfile->s); > -+ deps = depsparse(depfile->s, false); > - if (buildopts.explain && !deps) > -- warn("explain %s: missing or invalid dep > file", n->path->s); -+ warn("explain %s: > missing or invalid depfile", n->path->s); > - } > - if (deps) { > - edgeadddeps(e, deps->node, deps->len); > -@@ -473,7 +476,7 @@ depsrecord(struct edge *e) > - return; > - } > - out = e->out[0]; > -- deps = depsparse(depfile->s); > -+ deps = depsparse(depfile->s, true); > - if (!buildopts.keepdepfile) > - remove(depfile->s); > - if (!deps) > diff --git a/main/samurai/APKBUILD b/main/samurai/APKBUILD > index cd9777d5e9..c0c9159eeb 100644 > --- a/main/samurai/APKBUILD > +++ b/main/samurai/APKBUILD > @@ -1,20 +1,15 @@ > # Contributor: Drew DeVault > # Maintainer: Drew DeVault > pkgname=samurai > -pkgver=1.0 > -pkgrel=4 > +pkgver=1.1 > +pkgrel=0 > pkgdesc="ninja-compatible build tool written in C" > url="https://github.com/michaelforney/samurai" > arch="all" > license="Apache-2.0" > options="!check" # No test suite. > subpackages="$pkgname-doc" > -source="https://github.com/michaelforney/samurai/releases/download/$pkgver/samurai-$pkgver.tar.gz > - > 0001-Fix-manifest-rebuild-when-it-was-pruned-due-to-resta.patch > - 0002-parse-Check-that-rules-always-have-a-command.patch > - > 0003-parse-Check-that-rules-have-rspfile-iff-they-have-rs.patch > - 0004-tool-Implement-compdb.patch > - 0005-deps-treat-missing-depfile-as-empty-for-deps-log.patch" > +source="https://github.com/michaelforney/samurai/releases/download/$pkgver/samurai-$pkgver.tar.gz" > provides="ninja" > replaces="ninja" > > @@ -27,9 +22,4 @@ package() { > ln -s samu "$pkgdir"/usr/bin/ninja > } > > -sha512sums="87b2a11a39dc36f3582abdc7c9d358c8fce241fe4155b5177d3e8588d1c040a62eb9daafd2365febbfadd6fcc27a3ceacf6f29ca6f871c822aad6f4bad527a51 > samurai-1.0.tar.gz > -a53c3a16a5d3115572a9c47d8a939bce6f5c5d05c9d4626a27a11c46a2bcec1497b1ca886d85da7f298340cc34fd6c65e613de9a4d726003b7f202376c267ae9 > 0001-Fix-manifest-rebuild-when-it-was-pruned-due-to-resta.patch > -2e4a061daa55115437af476c5e7721448d6986cf3111f4e94edf82f853e65a3da89e55103abc7f401506d3ea69aca34f3f9602c160bdf98c4c2ae3f38f8294e9 > 0002-parse-Check-that-rules-always-have-a-command.patch > -2558c16c5039bda1fb12f404e740dde780a195a875649cc87a51ccae8cee3e9ceb03befb9ba9301b6ed3cba02fd827ce50131a17aab74a5eacca9841a7e5efdd > 0003-parse-Check-that-rules-have-rspfile-iff-they-have-rs.patch > -630a59438f8bf71466766b42aced2adf22bb19972b3d871f734b0fa9f09cb7fad8d3a5bc2acc4e690538f9f34339b8516fb1f1642817dbe66812b43095899114 > 0004-tool-Implement-compdb.patch > -03da692b82d4ec07e59600abf46dbdef44957709c10f216465456abd68ab7f259bff06f13f3e069393f69a8689081f69573a1ed6b21755dd9b91841d92d616c4 > 0005-deps-treat-missing-depfile-as-empty-for-deps-log.patch" > +sha512sums="b27302c34d736f483909e57c8b162609eaa4c86571c1167b71a5564b521cc3af2861307a16bb6dca55e80952088989e9526b103160d2ea054d15f4ed85b1cedb > samurai-1.1.tar.gz" Applied