2017-06-05 124 views
0

我有這個Makefile/bin/sh的:1:語法錯誤:單詞意外(預期 「)」)

TMP_DIR := tmp 
RUN_OR_NOT := $(shell date '+%y%m%d%H%M') 

all: version 

version: 
    ifeq ($(shell test -d ${TMP_DIR} && echo -n "yes";),yes) 
     $(shell echo ${TMP_DIR} already exists ...) 
    else 
     $(shell mkdir -p ${TMP_DIR}) 
    endif 

我想先檢查,如果目錄tmp存在與否,並創建只有,如果它不存在。這工作,但有一個奇怪的錯誤:

ifeq (yes,yes) 
/bin/sh: 1: Syntax error: word unexpected (expecting ")") 
Makefile:7: die Regel für Ziel „version「 scheiterte 
make: *** [version] Fehler 2 

爲什麼會出現這種奇怪的/bin/sh: 1: Syntax error: word unexpected (expecting ")")錯誤?以及如何解決這個問題?

+0

看起來應該只是'version:$ {TMP_DIR}'和'$ {TMP_DIR}:; mkdir -p $ {TMP_DIR}'。 – melpomene

+0

'mkdir -p'僅在目錄不存在時才創建目錄。 – Beta

+0

僅供參考,'echo -n'的行爲不是POSIX定義的(POSIX顯式*允許* echo'基於'-n'標誌修改其行爲 - 與'echo -e'形成對比,這是如果它不在輸出上打印「-e」,但在給定該標誌時未指定其行爲)。考慮使用'printf%s foo'而不是'echo -n foo'。 –

回答

5

在makefile中,配方是一個shell腳本。您正在嘗試將ifeq這樣的結構放入您的食譜中。 Make會將它們傳遞給shell並且shell會拋出此錯誤,因爲它不理解makefile語法。

你應該使用shell腳本編寫你的食譜,而不是生成文件語法:

version: 
     if test -d ${TMP_DIR}; then \ 
      echo ${TMP_DIR} already exists ...; \ 
     else \ 
      mkdir -p ${TMP_DIR}; \ 
     fi 

雖然你爲什麼關心,如果該目錄已經不知是否存在;我個人只是使​​用:

version: 
     mkdir -p ${TMP_DIR} 
+0

可以添加:'version:$ {TMP_DIR} \ n $ {TMP_DIR}:\ n mkdir $ {TMP_DIR}'。 (評論標記吃了我的空白,但我希望你知道我的意思) – ArturFH