我可以让我的Makefile自动让GCC使用它支持的最新标准吗?

时间:2016-07-12 12:54:54

标签: c++ c++11 gcc c++14 gnu-make

我的C ++ 03项目需要升级到C ++ 11,我可以保证至少在我想要使用的所有GCC中都可以使用它的实验性支持。

但是,这可能是-std=c++0x,或者可能是来自较新GCC的实际-std=c++11。有一天它会-std=c++14(当CentOS赶上......)。

如何构建一个GNU Makefile,将“最佳”标记添加到CXXFLAGS,具体取决于哪个会成功?

可以只是说“好吧,我使用的最早的GCC仍然没有生产就绪的C ++ 11支持所以我应该坚持使用C ++ 03”,但是meh。< / p>

2 个答案:

答案 0 :(得分:5)

这将选择$(CXX)编译器支持的最佳选项:

CXX_MODE.42 := -std=c++98
CXX_MODE.43 := $(CXX_MODE.42)
CXX_MODE.44 := $(CXX_MODE.43)
CXX_MODE.45 := $(CXX_MODE.44)
CXX_MODE.46 := -std=c++0x
# Unnecessary, since -std=c++0x still works, but hey why not:
CXX_MODE.47 := -std=c++11
CXX_MODE.48 := $(CXX_MODE.47)
CXX_MODE.49 := $(CXX_MODE.48)
CXX_MODE.5 := -std=c++14
CXX_MODE.6 := $(CXX_MODE.5)
GXX_VERSION := $(shell $(CXX) -dumpversion | awk -F. '$$1<5{print $$1$$2} $$1>=5{print $$1}')
CXX_MODE := $(CXX_MODE.$(GXX_VERSION))
CXXFLAGS += $(CXX_MODE)

为了获得额外的乐趣,您可以根据其他变量在c++gnu++模式之间进行选择:

CXX_MODE.42 := 98
CXX_MODE.43 := $(CXX_MODE.42)
CXX_MODE.44 := $(CXX_MODE.43)
CXX_MODE.45 := $(CXX_MODE.44)
CXX_MODE.46 := 0x
# Unnecessary, since -std=c++0x still works, but hey why not:
CXX_MODE.47 := 11
CXX_MODE.48 := $(CXX_MODE.47)
CXX_MODE.49 := $(CXX_MODE.48)
CXX_MODE.5 := 14
CXX_MODE.6 := $(CXX_MODE.5)
GXX_VERSION := $(shell $(CXX) -dumpversion | awk -F. '$$1<5{print $$1$$2} $$1>=5{print $$1}')
CXX_MODE := $(CXX_MODE.$(GXX_VERSION))
ifneq($(STRICT),)
CXXFLAGS += -std=c++$(CXX_MODE) -pedantic -pedantic-errors
else
CXXFLAGS += -std=gnu++$(CXX_MODE)
endif

答案 1 :(得分:0)

不完全是答案,因为这不提供自动选择,但我认为无论如何它都可能有用。

您可以使用make命令行选项来选择所需内容:

ifeq($(CPP11),Y)
    CXXFLAGS+=-std=c++11
endif

ifeq($(CPP14),Y)
    CXXFLAGS+=-std=c++14
endif

调用将以这种方式完成:

make <target> CPP11=Y

make <target> CPP14=Y