Makefile 如何使用gnu make很好地编译测试片段?

Makefile 如何使用gnu make很好地编译测试片段?,makefile,gnu-make,Makefile,Gnu Make,我的基线中没有配置阶段(出于各种原因),但我需要检查我的C编译器是否支持-mavx2标志 如果我有一个空文件,请调用它test.cc,然后我可以执行以下操作: $(CC) -mavx2 -c test.cc -o test.o 并检查退货状态代码。很明显,我不想让那些test.*文件到处都是,但我想不出一个好方法来在配方之外生成/测试/删除它们。有人知道这样做的好模式吗?事实证明,您可以使用“eval”删除临时文件并返回状态代码,因此这是可行的: AVX2 = $(shell touch t

我的基线中没有配置阶段(出于各种原因),但我需要检查我的C编译器是否支持-mavx2标志

如果我有一个空文件,请调用它
test.cc
,然后我可以执行以下操作:

$(CC) -mavx2 -c test.cc -o test.o 
并检查退货状态代码。很明显,我不想让那些test.*文件到处都是,但我想不出一个好方法来在配方之外生成/测试/删除它们。有人知道这样做的好模式吗?

事实证明,您可以使用“eval”删除临时文件并返回状态代码,因此这是可行的:

AVX2 = $(shell touch test.cc; $(CC) -mavx2 -c test.cc -o /dev/null >& /dev/null; eval "rm -f test.cc; echo $$?")
编辑并删除临时文件(假设系统正常):

事实证明,您可以使用“eval”删除临时文件并返回状态代码,因此:

AVX2 = $(shell touch test.cc; $(CC) -mavx2 -c test.cc -o /dev/null >& /dev/null; eval "rm -f test.cc; echo $$?")
编辑并删除临时文件(假设系统正常):


或者,您可以从
stdin
获取输入,然后输出到
/dev/null

SUPPORTS_MAVX2:=$(shell echo 'void main(){}' | \
                gcc -x c -maxv3 -o /dev/null - 2>/dev/null; \
                echo $$?)

那么就没有要删除的工件文件了。
-xc
是告诉gcc它是什么语言所必需的(因为在本例中它无法从文件名中确定),并且您还需要后面的
-

或者,您可以从
stdin
获取输入,然后输出到
/dev/null

SUPPORTS_MAVX2:=$(shell echo 'void main(){}' | \
                gcc -x c -maxv3 -o /dev/null - 2>/dev/null; \
                echo $$?)

那么就没有要删除的工件文件了。
-xc
是告诉gcc它是什么语言所必需的(因为在本例中它无法从文件名中确定),您还需要后面的
-

为什么需要使用eval?您只需将结果保存在变量中即可。注意,
&
不可移植,因此不应使用它。您可以使用
$(shell…$(CC)…>/dev/null 2>&1;r=$$?;rm-f…;exit$$r)
为什么需要使用eval?您只需将结果保存在变量中即可。注意,
&
不可移植,因此不应使用它。您可以使用
$(shell…$(CC)…>/dev/null 2>&1;r=$$?;rm-f…;exit$$r)