2012-02-19 115 views
0

我想在Makefile中製作一個自定義函數來檢測當前平臺並相應地返回正確的文件。這是我的嘗試。makefile自定義函數

UNAME := $(shell uname -s) 

define platform 
    ifeq ($(UNAME),Linux) 
     $1 
    else ifneq ($(findstring MINGW32_NT, $(UNAME)),) 
     $2 
    else ifeq ($(UNAME),Darwin) 
     $3 
    endif 
endef 

all: 
    @echo $(call platform,linux,windows,mac) 

失敗,並顯示以下錯誤。

/bin/sh: Syntax error: "(" unexpected 
[Finished]make: *** [all] Error 2 

我在做什麼錯?

回答

1

另一種選擇是來連接的uname輸出,以形成一定格式的平臺字符串,並有相應的命名特定於平臺的生成文件:

ARCH := $(firstword $(shell uname -m)) 
SYS := $(firstword $(shell uname -s)) 

# ${SYS}.${ARCH} expands to Linux.x86_64, Linux.i686, SunOS.sun4u, etc.. 
include ${SYS}.${ARCH}.mk 
2

ifeq ... else ... endif在GNU Make中爲conditional directives,它們不能出現在define ... endef的內部,因爲後者將它們視爲文字文本。 (嘗試刪除近echo命令@標誌,你會看到評估platform功能的實際結果)

我希望移居條件語句出define指令。無論如何,在Make的執行過程中,目標平臺不能更改,因此每次調用platform時都不需要解析$(UNAME)

ifeq ($(UNAME),Linux) 
    platform = $1 
else ifneq ($(findstring MINGW32_NT, $(UNAME)),) 
    platform = $2 
else ifeq ($(UNAME),Darwin) 
    platform = $3 
endif