2015-04-07 2 views
1

Я хочу использовать переменные Баш синхронизации в моей Makefile , например, в моем терминале я могу это сделать, и это работаетИспользование Баш переменных в Makefile

MY_TIME=$SECONDS 
echo $MY_TIME 

, но когда я пишу это на моем Makefile это не работа

Как я могу использовать эти две строки в файле make?

это то, что я делаю

.PHONY: myProg 
myProg: 
     MY_TIME=$SECONDS 
     echo $MY_TIME 

После ответа Этан Рейснер»

Это то, что я сейчас

.PHONY: myProg 
myProg: 
     MY_TIME= date; echo $MY_TIME 

но результат моего эха пустая строка , он не похож, что он хранит дату

+0

Где вы положить, что в вашем Makefile Это, очевидно, не является допустимым make variable. Вероятно, он будет работать в рецепте, если вы установите make для использования 'bash' в качестве оболочки (в отличие от значения по умолчанию'/bin/sh'). –

+0

Каждая строка запускается в отдельной оболочке, поэтому нет. –

+0

@EtanReisner Как это сделать? Я обновил свой вопрос – Lily

ответ

2

По умолчанию make использует /bin/sh в качестве оболочки, которая выполняет линии рецептов.

Предположительно /bin/sh не поддерживает переменную SECONDS.

Вы можете указать make использовать другую оболочку, присвоив значение переменной SHELL (то есть SHELL := /bin/bash).

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

Чтобы сделать то, что вы хотите, вам нужно будет написать обе эти строки на одной строке или продолжить линию над новой строкой.

.PHONY: myProg 
myProg: 
     MY_TIME=$SECONDS; echo $MY_TIME 

или

.PHONY: myProg 
myProg: 
     MY_TIME=$SECONDS; \ 
     echo $MY_TIME 

Это сказанное вы почти наверняка будет лучше не делать это и вместо того, чтобы использовать что-то вроде date, запускаемые при старте/конце рецепта или time вызывается на команда, которая должна быть синхронизирована непосредственно.

.PHONY: myProg 
myProg: 
     date 
     # Do something 
     date 

или

.PHONY: myProg 
myProg: 
     time some_command 
+1

Есть ли способ сохранить вывод даты в переменной, чтобы использовать ее позже? – Lily

+0

Только с версией продолжения строки. Или если у вас есть достаточно новая версия make и вы можете использовать [.ONESHELL] (http://www.gnu.org/software/make/manual/make.html#index-_002eONESHELL). –

+0

Вы также можете установить переменную 'make' с' $ (eval LOL: = $ (shell echo $$ RANDOM)) '(SECONDS бессмысленно, так как при запуске всегда 0). На следующей строке вы можете «echo $ (LOL)» выписать значение. –

-1
PROGRAM_NAME = myLittleProgram 

... 

$(PROGRAM_NAME) : myLittleProgram.o 

Я знаю, что вышеуказанные работы, так как это в моем Makefile (имена программ и имена объектов изменены, чтобы защитить невинных).


«Переменные ссылки могут быть использованы в любом контексте: цели, зависимости, команды, большинство директив, а также новые значения переменных.Вот пример общего случая, когда переменная хранит имена всех объектных файлов в программе:»

objects = program.o foo.o utils.o 
program : $(objects) 
    cc -o program $(objects) 

$(objects) : defs.h 

http://web.mit.edu/gnu/doc/html/make_6.html

+1

Это не имеет никакого отношения к заданному вопросу и даже не пытается его решить. –