2010-04-23 111 views
4

我想创建一个Makefile,它也创建一个用于运行编译应用程序的简单脚本。Makefile中的GNU make变量

我有类似如下:

@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

使用双美元符号告诉让你的意思是字面$,不是一个变量扩大,单引号整个事情,以防止进一步shell扩展回荡时:

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

很好,这个作品,谢谢! – JTom 2010-04-23 17:12:35

+0

我想用#!/ bin/bash行预先安装LD_LIBRA ...行,但在@echo'#!/ bin/bash'脚本中不显示任何行。这次可能是什么问题? – JTom 2010-04-23 17:33:01

+0

你是一个拯救生命的人。谢谢。诀窍是在我的情况下使用'\ $$ i'。其中'我'是我的循环中的变量。 – Devaroop 2013-10-07 07:12:00

2

加倍它逃离$

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

如果你有激活的次膨胀(不要担心 - 你可能没有!),你需要再增加一倍的$ S,导致例如$$$$1

顺便说一下,@touch命令是多余的。

+2

我认为回声运行在一个子shell(特别是因为有一个输出重定向),所以shell也扩展了这些变量。在我的回答中引用它,它适用于我。 – Cascabel 2010-04-23 17:06:30

+0

@ touch删除...谢谢 – JTom 2010-04-23 17:12:06