2010-04-23 78 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