2010-04-23 4 views
4

Я хотел бы создать Makefile, который также создает простой скрипт для запуска скомпилированного приложения.GNU make variables в Makefile

У меня есть что-то вроде следующего:

@touch $(SCRIPT) 
@echo LD_LIBRARY_PATH=$(LIB_DIR) $(APP_DIR)/$(APP) $1 $2 $3 $4 $5 $6 > $(SCRIPT) 
@chmod +x $(SCRIPT) 
@echo Script successfully created. 

И я хочу $ 1 $ 2 ... появляются в сценарии точно как $ 1 $ 2 ... чтобы представить сценарии аргументы командной строки. Я не могу заставить его работать, потому что Makefile использует $ 1 $ 2 как свои собственные переменные. Как я могу это сделать?

ответ

11

Используйте двойной знак доллара сказать сделать вы имеете в виду буквальное $, а не расширение переменной, и одинарной кавычки все это, чтобы предотвратить дальнейшее расширение оболочки, когда повторил:

@echo 'LD_LIBRARY_PATH=$(LIB_DIR) $(APP_DIR)/$(APP) $$1 $$2 $$3 $$4 $$5 $$6' 
+0

отлично, это работает, спасибо! – JTom

+0

и я хотел бы добавить строку LD_LIBRA ... в строку #!/Bin/bash, но после @echo '#!/Bin/bash' в скрипте не появится строка. В чем проблема на этот раз? – JTom

+0

вы спасатель жизни. Благодарю. Фокус в том, чтобы использовать '\ $$ i' в моем случае. где 'i' была переменной в моем цикле. – Devaroop

2

Побег $ удваивая его:

@echo LD_LIBRARY_PATH=$(LIB_DIR) $(APP_DIR)/$(APP) $$1 $$2 $$3 $$4 $$5 $$6 > $(SCRIPT) 

Если у вас есть вторичное расширение активированного (не волнуйтесь - вы, вероятно, нет!), Вы должны удвоить $ s снова, в результате чего например $$$$1.

Кстати, команда @touch является избыточной.

+2

Я думаю, что эхо запускается в подоболочке (особенно потому, что есть перенаправление вывода), поэтому оболочка также расширяет переменные. Процитировать это, как в моем ответе, и это работает для меня. – Cascabel

+0

@touch удален ... спасибо – JTom

Смежные вопросы