2013-02-13 32 views
1

我想僅在運行make的機器(本地目標)上支持SSE指令集時才製作某些程序。假設它運行linux,有條件地取決於對SSE指令的支持

grep sse /proc/cpu_info | wc -l 

如果不支持SSE指令,則返回0;否則返回> 0。但是我怎樣才能在我的makefile中使用它來促進條件製作?

我目前使用GNU Make 3.81,在linux上運行。

+0

傳統上,這是autoconf'和'configure'的'域。使用它們而不是簡單的'make'。 – thiton 2013-02-13 16:53:06

回答

0

所以我想通了,我自己一個(工作!)的解決方案,類似的建議通過thiton:

SSE  := $(shell grep sse /proc/cpuinfo) 
INVALID := $(shell grep non-sense /proc/cpuinfo) 

ifneq ($(INVALID),$(SSE)) 
sse_target 
endif 
1

在傳統的GNU使用中,您不會讓make完成這項工作,而是configure,它會將其輸出寫入Makefile。畢竟,每次運行make時都不希望重新檢查自己的環境 - 在最好的情況下,您會浪費時間重新檢查未更改的環境,並且最糟糕的是,您的構建不一致。

這就是說,一個化妝唯一的解決方案會是什麼樣子:

HAVE_SSE=$(filter-out 0,$(shell grep sse /proc/cpu_info | wc -l)) 
CFLAGS+=$(if $(HAVE_SSE),-msse) 

ifneq ($(HAVE_SSE),) 
    sse-target 
endif 

Shell函數展開成shell命令的輸出。 filter-out使非SSE輸出爲空字符串而不是0,因爲這更容易進行條件化。然後,您可以按照指示使用if函數對該值進行條件。

+0

這看起來不錯,但不是我想要的(見問題)。我不想設置CFLAGS,但要做或不做。我可以使用$(HAVE_SSE)嗎?怎麼樣? – Walter 2013-02-13 16:59:50

+0

@沃爾特:當然。我更新了這個問題,你可以閱讀make手冊。 – thiton 2013-02-13 17:01:52

+0

沒有工作......我很害怕。 :-(原因可能是我的命令的返回不僅是'0',而是說'0'左右。 – Walter 2013-02-13 17:06:09