Module Name: src Committed By: sjg Date: Tue May 9 20:14:28 UTC 2023
Modified Files: src/distrib/sets/lists/tests: mi src/usr.bin/make: make.1 var.c src/usr.bin/make/unit-tests: Makefile Added Files: src/usr.bin/make/unit-tests: varmod-mtime.exp varmod-mtime.mk Log Message: make: add :mtime to provide mtime of file The value of the variable is passed to stat(2) and st_mtime is new value. An optional arg can be used if stat(2) fails, otherwise the current time is used. See varmod-mtime.mk for usage examples. To generate a diff of this commit: cvs rdiff -u -r1.1258 -r1.1259 src/distrib/sets/lists/tests/mi cvs rdiff -u -r1.363 -r1.364 src/usr.bin/make/make.1 cvs rdiff -u -r1.1050 -r1.1051 src/usr.bin/make/var.c cvs rdiff -u -r1.333 -r1.334 src/usr.bin/make/unit-tests/Makefile cvs rdiff -u -r0 -r1.1 src/usr.bin/make/unit-tests/varmod-mtime.exp \ src/usr.bin/make/unit-tests/varmod-mtime.mk Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/distrib/sets/lists/tests/mi diff -u src/distrib/sets/lists/tests/mi:1.1258 src/distrib/sets/lists/tests/mi:1.1259 --- src/distrib/sets/lists/tests/mi:1.1258 Sun Apr 23 08:47:27 2023 +++ src/distrib/sets/lists/tests/mi Tue May 9 20:14:28 2023 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.1258 2023/04/23 08:47:27 rillig Exp $ +# $NetBSD: mi,v 1.1259 2023/05/09 20:14:28 sjg Exp $ # # Note: don't delete entries from here - mark them as "obsolete" instead. # @@ -6099,6 +6099,8 @@ ./usr/tests/usr.bin/make/unit-tests/varmod-match-escape.mk tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/make/unit-tests/varmod-match.exp tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/make/unit-tests/varmod-match.mk tests-usr.bin-tests compattestfile,atf +./usr/tests/usr.bin/make/unit-tests/varmod-mtime.exp tests-usr.bin-tests compattestfile,atf +./usr/tests/usr.bin/make/unit-tests/varmod-mtime.mk tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/make/unit-tests/varmod-no-match.exp tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/make/unit-tests/varmod-no-match.mk tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/make/unit-tests/varmod-order-numeric.exp tests-usr.bin-tests compattestfile,atf Index: src/usr.bin/make/make.1 diff -u src/usr.bin/make/make.1:1.363 src/usr.bin/make/make.1:1.364 --- src/usr.bin/make/make.1:1.363 Sun May 7 16:43:50 2023 +++ src/usr.bin/make/make.1 Tue May 9 20:14:27 2023 @@ -1,4 +1,4 @@ -.\" $NetBSD: make.1,v 1.363 2023/05/07 16:43:50 sjg Exp $ +.\" $NetBSD: make.1,v 1.364 2023/05/09 20:14:27 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 6, 2023 +.Dd May 9, 2023 .Dt MAKE 1 .Os .Sh NAME @@ -1510,6 +1510,18 @@ producing the formatted timestamp. 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 +.Xr stat 2 +with the value as pathname; +use +.Ql st_mtime +as the new value. +If +.Xr stat 2 +fails; use +.Ar timestamp +or current time. .It Cm \&:tA Attempts to convert the value to an absolute path using .Xr realpath 3 . Index: src/usr.bin/make/var.c diff -u src/usr.bin/make/var.c:1.1050 src/usr.bin/make/var.c:1.1051 --- src/usr.bin/make/var.c:1.1050 Tue May 9 16:26:59 2023 +++ src/usr.bin/make/var.c Tue May 9 20:14:27 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: var.c,v 1.1050 2023/05/09 16:26:59 rillig Exp $ */ +/* $NetBSD: var.c,v 1.1051 2023/05/09 20:14:27 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.1050 2023/05/09 16:26:59 rillig Exp $"); +MAKE_RCSID("$NetBSD: var.c,v 1.1051 2023/05/09 20:14:27 sjg Exp $"); /* * Variables are defined using one of the VAR=value assignments. Their @@ -2833,6 +2833,39 @@ ApplyModifier_Match(const char **pp, Mod return AMR_OK; } +/* :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; + int i = -1; + + if (!ModMatchEq(mod, "mtime", ch)) + return AMR_UNKNOWN; + *pp += 5; + args = *pp; + if (args[0] == '=') { + args++; + if (!TryParseIntBase0(&args, &i)) + return AMR_BAD; + *pp = args; + } + if (!ModChain_ShouldEval(ch)) + return AMR_OK; + if (stat(Expr_Str(expr), &st) < 0) { + 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; +} + static void ParsePatternFlags(const char **pp, PatternFlags *pflags, bool *oneBigWord) { @@ -3815,6 +3848,8 @@ ApplyModifier(const char **pp, ModChain case 'M': case 'N': return ApplyModifier_Match(pp, ch); + case 'm': + return ApplyModifier_Mtime(pp, ch); case 'O': return ApplyModifier_Order(pp, ch); case 'P': Index: src/usr.bin/make/unit-tests/Makefile diff -u src/usr.bin/make/unit-tests/Makefile:1.333 src/usr.bin/make/unit-tests/Makefile:1.334 --- src/usr.bin/make/unit-tests/Makefile:1.333 Sat Feb 25 19:30:32 2023 +++ src/usr.bin/make/unit-tests/Makefile Tue May 9 20:14:27 2023 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.333 2023/02/25 19:30:32 sjg Exp $ +# $NetBSD: Makefile,v 1.334 2023/05/09 20:14:27 sjg Exp $ # # Unit tests for make(1) # @@ -374,6 +374,7 @@ TESTS+= varmod-loop-delete TESTS+= varmod-loop-varname TESTS+= varmod-match TESTS+= varmod-match-escape +TESTS+= varmod-mtime TESTS+= varmod-no-match TESTS+= varmod-order TESTS+= varmod-order-numeric Added files: Index: src/usr.bin/make/unit-tests/varmod-mtime.exp diff -u /dev/null src/usr.bin/make/unit-tests/varmod-mtime.exp:1.1 --- /dev/null Tue May 9 20:14:28 2023 +++ src/usr.bin/make/unit-tests/varmod-mtime.exp Tue May 9 20:14:27 2023 @@ -0,0 +1 @@ +exit status 0 Index: src/usr.bin/make/unit-tests/varmod-mtime.mk diff -u /dev/null src/usr.bin/make/unit-tests/varmod-mtime.mk:1.1 --- /dev/null Tue May 9 20:14:28 2023 +++ src/usr.bin/make/unit-tests/varmod-mtime.mk Tue May 9 20:14:27 2023 @@ -0,0 +1,30 @@ +# $NetBSD: varmod-mtime.mk,v 1.1 2023/05/09 20:14:27 sjg Exp $ +# +# Tests for the :mtime variable modifier, which provides mtime +# of variable value assumed to be a pathname. + +all: + +# mtime of this makefile +mtime:= ${MAKEFILE:mtime} + +# if pathname does not exist and timestamp is provided +# that is the result +.if ${no/such:L:mtime=0} != "0" +. error +.endif + +.if ${no/such:L:mtime=42} != "42" +. error +.endif + +# if no timestamp is provided and stat(2) fails use current time +.if ${no/such:L:mtime} < ${mtime} +. error no/such:L:mtime ${no/such:L:mtime} < ${mtime} +.endif + +COOKIE = ${TMPDIR}/varmod-mtime.cookie +x!= touch ${COOKIE} +.if ${COOKIE:mtime=0} < ${mtime} +. error COOKIE:mtime=0 ${COOKIE:mtime=0} < ${mtime} +.endif