Module Name: src Committed By: sjg Date: Wed May 10 18:22:33 UTC 2023
Modified Files: src/usr.bin/make: make.1 var.c Log Message: Make :mtime operate on each word in variable value. Reviewed by: rillig To generate a diff of this commit: cvs rdiff -u -r1.365 -r1.366 src/usr.bin/make/make.1 cvs rdiff -u -r1.1053 -r1.1054 src/usr.bin/make/var.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/make/make.1 diff -u src/usr.bin/make/make.1:1.365 src/usr.bin/make/make.1:1.366 --- src/usr.bin/make/make.1:1.365 Tue May 9 20:53:23 2023 +++ src/usr.bin/make/make.1 Wed May 10 18:22:33 2023 @@ -1,4 +1,4 @@ -.\" $NetBSD: make.1,v 1.365 2023/05/09 20:53:23 sjg Exp $ +.\" $NetBSD: make.1,v 1.366 2023/05/10 18:22:33 sjg Exp $ .\" .\" Copyright (c) 1990, 1993 .\" The Regents of the University of California. All rights reserved. @@ -29,7 +29,7 @@ .\" .\" from: @(#)make.1 8.4 (Berkeley) 3/19/94 .\" -.Dd May 9, 2023 +.Dd May 10, 2023 .Dt MAKE 1 .Os .Sh NAME @@ -1511,9 +1511,9 @@ If a .Ar timestamp value is not provided or is 0, the current time is used. .It Cm \&:mtime Ns Oo Cm = Ns Ar timestamp Oc -call +Call .Xr stat 2 -with the value as pathname; +with each word as pathname; use .Ql st_mtime as the new value. Index: src/usr.bin/make/var.c diff -u src/usr.bin/make/var.c:1.1053 src/usr.bin/make/var.c:1.1054 --- src/usr.bin/make/var.c:1.1053 Tue May 9 21:24:56 2023 +++ src/usr.bin/make/var.c Wed May 10 18:22:33 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: var.c,v 1.1053 2023/05/09 21:24:56 rillig Exp $ */ +/* $NetBSD: var.c,v 1.1054 2023/05/10 18:22:33 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -139,7 +139,7 @@ #include "metachar.h" /* "@(#)var.c 8.3 (Berkeley) 3/19/94" */ -MAKE_RCSID("$NetBSD: var.c,v 1.1053 2023/05/09 21:24:56 rillig Exp $"); +MAKE_RCSID("$NetBSD: var.c,v 1.1054 2023/05/10 18:22:33 sjg Exp $"); /* * Variables are defined using one of the VAR=value assignments. Their @@ -2833,49 +2833,69 @@ ApplyModifier_Match(const char **pp, Mod return AMR_OK; } +struct ModifyWord_MtimeArgs { + bool error; + bool fallback; + ApplyModifierResult rc; + time_t t; +}; + +static void +ModifyWord_Mtime(Substring word, SepBuf *buf, void *data) +{ + char tbuf[BUFSIZ]; + struct stat st; + struct ModifyWord_MtimeArgs *args = data; + + if (Substring_IsEmpty(word)) + return; + assert(word.end[0] == '\0'); /* assume null-terminated word */ + if (stat(word.start, &st) < 0) { + if (args->error) { + Parse_Error(PARSE_FATAL, + "Cannot determine mtime for '%s': %s", + word.start, strerror(errno)); + args->rc = AMR_CLEANUP; + return; + } + if (args->fallback) + st.st_mtime = args->t; + else + time(&st.st_mtime); + } + snprintf(tbuf, sizeof(tbuf), "%u", (unsigned)st.st_mtime); + SepBuf_AddStr(buf, tbuf); +} + /* :mtime */ static ApplyModifierResult ApplyModifier_Mtime(const char **pp, ModChain *ch) { - char buf[BUFSIZ]; - Expr *expr = ch->expr; - const char *args, *mod = *pp; - struct stat st; - bool error = false; - int i = -1; + const char *p, *mod = *pp; + struct ModifyWord_MtimeArgs args; if (!ModMatchEq(mod, "mtime", ch)) return AMR_UNKNOWN; *pp += 5; - args = *pp; - if (args[0] == '=') { - args++; - if (!TryParseIntBase0(&args, &i)) { - if (strncmp(args, "error", 5) == 0) { - error = true; - args += 5; + p = *pp; + args.error = args.fallback = false; + args.rc = AMR_OK; + if (p[0] == '=') { + p++; + args.fallback = true; + if (!TryParseTime(&p, &args.t)) { + if (strncmp(p, "error", 5) == 0) { + args.error = true; + p += 5; } else return AMR_BAD; } - *pp = args; + *pp = p; } if (!ModChain_ShouldEval(ch)) return AMR_OK; - if (stat(Expr_Str(expr), &st) < 0) { - if (error) { - Parse_Error(PARSE_FATAL, - "Cannot determine mtime for '%s': %s", - Expr_Str(expr), strerror(errno)); - return AMR_CLEANUP; - } - if (i < 0) - time(&st.st_mtime); - else - st.st_mtime = (time_t)i; - } - snprintf(buf, sizeof(buf), "%u", (unsigned)st.st_mtime); - Expr_SetValueOwn(expr, bmake_strdup(buf)); - return AMR_OK; + ModifyWords(ch, ModifyWord_Mtime, &args, ch->oneBigWord); + return args.rc; } static void