Module Name: src Committed By: sjg Date: Sat Jan 14 22:58:04 UTC 2017
Modified Files: src/usr.bin/make: make.1 var.c src/usr.bin/make/unit-tests: varmisc.exp varmisc.mk Log Message: Allow providing a utc value to :{gm,local}time Reviewed by: christos To generate a diff of this commit: cvs rdiff -u -r1.263 -r1.264 src/usr.bin/make/make.1 cvs rdiff -u -r1.208 -r1.209 src/usr.bin/make/var.c cvs rdiff -u -r1.4 -r1.5 src/usr.bin/make/unit-tests/varmisc.exp cvs rdiff -u -r1.5 -r1.6 src/usr.bin/make/unit-tests/varmisc.mk 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.263 src/usr.bin/make/make.1:1.264 --- src/usr.bin/make/make.1:1.263 Fri Aug 26 23:37:54 2016 +++ src/usr.bin/make/make.1 Sat Jan 14 22:58:04 2017 @@ -1,4 +1,4 @@ -.\" $NetBSD: make.1,v 1.263 2016/08/26 23:37:54 dholland Exp $ +.\" $NetBSD: make.1,v 1.264 2017/01/14 22:58:04 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 August 26, 2016 +.Dd January 14, 2017 .Dt MAKE 1 .Os .Sh NAME @@ -1204,18 +1204,24 @@ safely through recursive invocations of .Nm . .It Cm \&:R Replaces each word in the variable with everything but its suffix. -.It Cm \&:gmtime +.It Cm \&:gmtime[=utc] The value is a format string for .Xr strftime 3 , -using the current +using .Xr gmtime 3 . +If a +.Va utc +value is not provided or is 0, the current time is used. .It Cm \&:hash Compute a 32-bit hash of the value and encode it as hex digits. -.It Cm \&:localtime +.It Cm \&:localtime[=utc] The value is a format string for .Xr strftime 3 , -using the current +using .Xr localtime 3 . +If a +.Va utc +value is not provided or is 0, the current time is used. .It Cm \&:tA Attempt to convert variable to an absolute path using .Xr realpath 3 , Index: src/usr.bin/make/var.c diff -u src/usr.bin/make/var.c:1.208 src/usr.bin/make/var.c:1.209 --- src/usr.bin/make/var.c:1.208 Fri Jun 3 01:21:59 2016 +++ src/usr.bin/make/var.c Sat Jan 14 22:58:04 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: var.c,v 1.208 2016/06/03 01:21:59 sjg Exp $ */ +/* $NetBSD: var.c,v 1.209 2017/01/14 22:58:04 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -69,14 +69,14 @@ */ #ifndef MAKE_NATIVE -static char rcsid[] = "$NetBSD: var.c,v 1.208 2016/06/03 01:21:59 sjg Exp $"; +static char rcsid[] = "$NetBSD: var.c,v 1.209 2017/01/14 22:58:04 sjg Exp $"; #else #include <sys/cdefs.h> #ifndef lint #if 0 static char sccsid[] = "@(#)var.c 8.3 (Berkeley) 3/19/94"; #else -__RCSID("$NetBSD: var.c,v 1.208 2016/06/03 01:21:59 sjg Exp $"); +__RCSID("$NetBSD: var.c,v 1.209 2017/01/14 22:58:04 sjg Exp $"); #endif #endif /* not lint */ #endif @@ -2381,12 +2381,12 @@ VarHash(char *str) } static char * -VarStrftime(const char *fmt, int zulu) +VarStrftime(const char *fmt, int zulu, time_t utc) { char buf[BUFSIZ]; - time_t utc; - time(&utc); + if (!utc) + time(&utc); if (!*fmt) fmt = "%c"; strftime(buf, sizeof(buf), fmt, zulu ? gmtime(&utc) : localtime(&utc)); @@ -2483,6 +2483,8 @@ VarStrftime(const char *fmt, int zulu) /* we now have some modifiers with long names */ #define STRMOD_MATCH(s, want, n) \ (strncmp(s, want, n) == 0 && (s[n] == endc || s[n] == ':')) +#define STRMOD_MATCHX(s, want, n) \ + (strncmp(s, want, n) == 0 && (s[n] == endc || s[n] == ':' || s[n] == '=')) static char * ApplyModifiers(char *nstr, const char *tstr, @@ -2494,12 +2496,14 @@ ApplyModifiers(char *nstr, const char *t const char *cp; /* Secondary pointer into str (place marker * for tstr) */ char *newStr; /* New value to return */ + char *ep; char termc; /* Character which terminated scan */ int cnt; /* Used to count brace pairs when variable in * in parens or braces */ char delim; int modifier; /* that we are processing */ Var_Parse_State parsestate; /* Flags passed to helper functions */ + time_t utc; /* for VarStrftime */ delim = '\0'; parsestate.oneBigWord = FALSE; @@ -2896,8 +2900,6 @@ ApplyModifiers(char *nstr, const char *t * integer for :[N], or two integers * separated by ".." for :[start..end]. */ - char *ep; - VarSelectWords_t seldata = { 0, 0 }; seldata.start = strtol(estr, &ep, 0); @@ -2956,9 +2958,15 @@ ApplyModifiers(char *nstr, const char *t } case 'g': cp = tstr + 1; /* make sure it is set */ - if (STRMOD_MATCH(tstr, "gmtime", 6)) { - newStr = VarStrftime(nstr, 1); - cp = tstr + 6; + if (STRMOD_MATCHX(tstr, "gmtime", 6)) { + if (tstr[6] == '=') { + utc = strtoul(&tstr[7], &ep, 10); + cp = ep; + } else { + utc = 0; + cp = tstr + 6; + } + newStr = VarStrftime(nstr, 1, utc); termc = *cp; } else { goto default_case; @@ -2976,9 +2984,15 @@ ApplyModifiers(char *nstr, const char *t break; case 'l': cp = tstr + 1; /* make sure it is set */ - if (STRMOD_MATCH(tstr, "localtime", 9)) { - newStr = VarStrftime(nstr, 0); - cp = tstr + 9; + if (STRMOD_MATCHX(tstr, "localtime", 9)) { + if (tstr[9] == '=') { + utc = strtoul(&tstr[10], &ep, 10); + cp = ep; + } else { + utc = 0; + cp = tstr + 9; + } + newStr = VarStrftime(nstr, 0, utc); termc = *cp; } else { goto default_case; @@ -3027,7 +3041,6 @@ ApplyModifiers(char *nstr, const char *t goto get_numeric; default: if (isdigit((unsigned char)tstr[3])) { - char *ep; get_numeric: parsestate.varSpace = Index: src/usr.bin/make/unit-tests/varmisc.exp diff -u src/usr.bin/make/unit-tests/varmisc.exp:1.4 src/usr.bin/make/unit-tests/varmisc.exp:1.5 --- src/usr.bin/make/unit-tests/varmisc.exp:1.4 Mon Oct 12 17:09:29 2015 +++ src/usr.bin/make/unit-tests/varmisc.exp Sat Jan 14 22:58:04 2017 @@ -17,4 +17,6 @@ false FALSE do not evaluate or expand :? if discarding is set +year=2016 month=04 day=01 +date=20160401 exit status 0 Index: src/usr.bin/make/unit-tests/varmisc.mk diff -u src/usr.bin/make/unit-tests/varmisc.mk:1.5 src/usr.bin/make/unit-tests/varmisc.mk:1.6 --- src/usr.bin/make/unit-tests/varmisc.mk:1.5 Mon Oct 12 17:09:29 2015 +++ src/usr.bin/make/unit-tests/varmisc.mk Sat Jan 14 22:58:04 2017 @@ -1,8 +1,9 @@ -# $Id: varmisc.mk,v 1.5 2015/10/12 17:09:29 sjg Exp $ +# $Id: varmisc.mk,v 1.6 2017/01/14 22:58:04 sjg Exp $ # # Miscellaneous variable tests. -all: unmatched_var_paren D_true U_true D_false U_false Q_lhs Q_rhs NQ_none +all: unmatched_var_paren D_true U_true D_false U_false Q_lhs Q_rhs NQ_none \ + strftime unmatched_var_paren: @echo ${foo::=foo-text} @@ -40,3 +41,11 @@ Q_rhs: NQ_none: @echo do not evaluate or expand :? if discarding @echo ${VSET:U${1:L:?${True}:${False}}} + +April1= 1459494000 + +# slightly contorted syntax to use utc via variable +strftime: + @echo ${year=%Y month=%m day=%d:L:gmtime=1459494000} + @echo date=${%Y%m%d:L:${gmtime=${April1}:L}} +