2013-02-13 47 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