Определение и использование метки времени сборки для GNU Make в Windows - PullRequest
2 голосов
/ 09 ноября 2010

Я пытаюсь собрать какое-то программное обеспечение для Windows, используя как GNU make 3.81, так и древнюю версию, распространяемую с Wind River Tornado (make 3.76).

Пока мне удалось захватить дату из windows:

NOW=\"$(shell cmd /C date /T) $(shell cmd /C time /T)\"

но когда я передаю его компилятору

CFLAGS = ... -DBUILD_TIMESTAMP=$(NOW) ...

, я получаю ошибки сборки из-за пробелов, двоеточий и косых черт в метке времени.Если я отображаю переменную $ (NOW), она правильно указывается в кавычках, но когда я повторяю переменную $ (CFLAGS), кавычки исчезают.

Ответы [ 3 ]

0 голосов
/ 09 ноября 2010

Я думаю, вы должны установить: CFLAGS = ... -DBUILD_TIMESTAMP = "$ (NOW)" ...

т.е. добавить кавычки.

Есть еще одно "хакерское" решение -удаление пробелов в $ (NOW) -> Try:

empty:=
space:= $(empty) $(empty)
NOW:=$(subst $space,_,$(NOW))
0 голосов
/ 05 декабря 2010

Возможно, вам будет легче отладить проблему, если вы устраните хитрость передачи строк в кавычках в командной строке компилятора, например:

.PHONY: force
timestamp.h: force
    echo "#define BUILD_TIMESTAMP \"`cmd /c date /t` `cmd /c time /t`\"" > $@

... и #include "timestamp.h" в вашем коде. Таким образом, вам нужно беспокоиться только о поведении в кавычках вашей оболочки, а не о make и компиляторе.

Это было давно, но я думаю Я помню, что Торнадо поставляется с оболочкой в ​​стиле csh, которая обрабатывает кавычки, например, по-другому , чем более обычные оболочки Борна. Он также включает в себя интерпретатор TCL, который можно использовать вместо этого, создав timestamp.tcl с содержимым, подобным

puts "#define BUILD_TIMESTAMP \"[clock format [clock seconds] -format {%D %T}]\""

и запись

timestamp.h: force
    tclsh timestamp.tcl > $@

в make-файле.

0 голосов
/ 09 ноября 2010

Вы хотите заключить в кавычки переменную для оболочки (чтобы она не подлежала разбиению по словам) и снова заключить ее в кавычку для C (поэтому, когда она подставляется в cpp, у вас есть строковый литерал).Попробуйте это:

NOW := "\"$(shell cmd /C date /T) $(shell cmd /C time /T)\""

Обратите внимание, что я использую := вместо =.Если ваш старый make не поддерживает его, используйте :=, который оценивает подстановку в точке определения, а не в точке расширения.Использование = заставит вызывать эти две команды оболочки дважды каждый раз, когда вы пытаетесь скомпилировать файл.Не очень хорошо для производительности.

...