commit f629615182e2c7fdb39ef1cb453a80a034eb0f37 from: Benjamin Stürz date: Thu Nov 21 09:33:20 2024 UTC make: implement += macro assignment commit - 3c12f67d765d9fd0ee94e3dee7ed65e8fa2765a8 commit + f629615182e2c7fdb39ef1cb453a80a034eb0f37 blob - 3ffee0beee1663f6c8a6433dfe4a5f0bb8c68d68 blob + 0f054e8453b1acec8bdfaeb083b90a715bb9e6fa --- make/TODO.md +++ make/TODO.md @@ -55,18 +55,6 @@ -s silent, do not write commands to stdout -# Macro Definition Operators -## `+=`: Append Assignment -### MyMakefile -```make -CFLAGS = -ansi -.export CFLAGS -``` -### sub/MyMakefile -``` -CFLAGS += -Wall -``` - # Templates ## MyMakefile ```make blob - cc694d669c9d7bfe6c8b778df8d0e882ec1264be blob + b36e5d8963bad822dcc39dc2c6accd1f1f4dbf23 --- make/make.c +++ make/make.c @@ -25,30 +25,35 @@ static struct macro m_shell = { .next = NULL, .enext = NULL, + .prepend = NULL, .name = "SHELL", .value = SHELL, .lazy = 0, }, m_make = { .next = &m_shell, .enext = &m_shell, + .prepend = NULL, .name = "MAKE", .value = NULL, .lazy = 0, }, m_dmake = { .next = &m_make, .enext = &m_make, + .prepend = NULL, .name = ".MAKE", .value = NULL, .lazy = 0, }, m_makeflags = { .next = &m_dmake, .enext = &m_dmake, + .prepend = NULL, .name = "MAKEFLAGS", .value = NULL, .lazy = 0, }, m_dmakeflags = { .next = &m_makeflags, .enext = &m_makeflags, + .prepend = NULL, .name = ".MAKEFLAGS", .value = NULL, .lazy = 0, @@ -483,6 +488,11 @@ expand_macro (sc, m) struct scope *sc; struct macro *m; { + if (m->prepend != NULL) { + expand_macro (sc, m->prepend); + str_push (' '); + } + if (m->lazy) { expand_into (sc, m->value, NULL); } else { @@ -864,7 +874,9 @@ char *path; m = new (struct macro); m->next = sc->dir->macros; + m->enext = NULL; m->help = help; + m->prepend = NULL; if (t[-1] == '!') { t[-1] = '\0'; @@ -884,6 +896,11 @@ char *path; t[t[-2] == ':' ? -2 : -1] = '\0'; m->lazy = 0; m->value = strdup (trim (expand (sc, trim (t + 1), NULL))); + } else if (t[-1] == '+') { + t[-1] = '\0'; + m->value = strdup (trim (t + 1)); + m->prepend = find_macro (sc, trim (s)); + m->lazy = 1; } else { m->lazy = 1; m->value = strdup (trim (t + 1)); @@ -1385,7 +1402,7 @@ struct scope *sc; for (m = sc->dir->macros; m != NULL; m = m->next) { if (m->help != NULL) printf ("\n## %s\n", m->help); - printf ("%s = %s\n", m->name, m->value); + printf ("%s %s= %s\n", m->name, m->prepend != NULL ? "+" : "", m->value); } printf ("\n"); blob - a541402897a1d3a09bcd5962f1577a6c923952f8 blob + 1633f42f1d844ff4030d29d1875de920f48a6758 --- make/make.h +++ make/make.h @@ -66,7 +66,7 @@ struct rule { }; struct macro { - struct macro *next, *enext; + struct macro *next, *enext, *prepend; char *name; char *value; char *help;