Будет работать следующий make-файл:
# Create the macro DATE_TIME from the environment variables %DATE% and %TIME%
!if [echo %DATE%_%TIME% > date_time.tmp] == 0
DATE_TIME = \
!include date_time.tmp # get macro value from first line of temporary file
DATE_TIME = $(DATE_TIME::=+) # replace colons with "+"
DATE_TIME = $(DATE_TIME: =0) # replace spaces with "0"
!if [del date_time.tmp] # clean up temporary file
!endif
!endif
foo.exe: bar
foo.exe:
@echo Info: Building target $@ from $**, because $? is newer (or non-existent)
@type nul > $@
copy $@ "$*_$(DATE_TIME).exe"
bar:
Вывод:
>nmake -nologo
Info: Building target foo.exe from bar, because bar is newer (or non-existent)
copy foo.exe "foo_07-Feb-2019_21+08+48.11.exe"
1 file(s) copied.
Объяснение: Переменные среды% DATE% и%TIME% необычны тем, что их значения могут меняться каждый раз, когда вы смотрите на них;кажется, это вызывает проблемы с их интерфейсом с nmake
.И как небольшая проблема,% TIME% содержит двоеточия, которые, конечно, не могут быть частью имени файла.И как еще одна проблема, форматы % DATE% и% TIME% не являются фиксированными: они могут зависеть от того, что выбрал пользователь.
ДанноеРешение захватывает значения% DATE% и% TIME% во временном файле, а затем устанавливает макрос nmake
в значение первой строки этого файла, используя !include
.Затем двоеточия заменяются на «+» или на все, что вы хотите.
По вопросам, связанным с этим, см. Имена макрокоманд .
.а именно, как найти «книги или ссылки на команды nmake?», см. мой ответ на Подстановочный знак для файлов в подкаталоге в NMAKE .
Обновление# 1: Мой оригинальный ответ работает, но на моем компьютере до 10 часов утра он создал имя файла с пробелом.Таким образом, ответ был обновлен, чтобы исправить это.(Возможно, лучший обходной путь - просто спать до 10 часов утра!)
Обновление № 2: Другой подход состоит в том, чтобы не использовать макросы nmake, а простоиспользовать переменные среды.Это короче.(Я был изначально введен в заблуждение выводом nmake.)
Но необходимость сделать две замены в %TIME%
, одну для замены пробелов и другую для замены двоеточий, добавляет немногоосложнение.Вызов call
необходим для задержки расширения переменной.
Следующий make-файл:
foo.exe: bar
foo.exe:
@echo Info: Building target $@ from $**, because $? is newer (or non-existent)
@type nul > $@
call set XXX=%%DATE%%_%%TIME: =0%%& call copy $@ "$*_%%XXX::=+%%.exe"
bar:
дает:
>nmake -nologo
Info: Building target foo.exe from bar, because bar is newer (or non-existent)
call set XXX=%DATE%_%TIME: =0%& call copy foo.exe "foo_%XXX::=+%.exe"
1 file(s) copied.
с:
>dir /O-D
Volume in drive C has no label.
Volume Serial Number is xxxxxx
Directory of C:xxxxxx
08-Feb-2019 08:19 AM <DIR> ..
08-Feb-2019 08:19 AM <DIR> .
08-Feb-2019 08:19 AM 0 foo_08-Feb-2019_08+19+22.08.exe
08-Feb-2019 08:19 AM 0 foo.exe
08-Feb-2019 08:18 AM 196 Makefile
3 File(s) 196 bytes
2 Dir(s) 12,517,236,736 bytes free