使用CXX查询预处理器定义?

时间:2015-07-24 23:31:12

标签: c++ macros c-preprocessor

我有一个尊重md-item-templateCXX的GNUmake文件。它还执行一些平台和架构测试。目前,makefile假定主机和目标是相同的:

CXXFLAGS

为了提高稳健性,我想问一下工具编译的内容。我想出了以下内容,但我不确定它是否正确。

IS_X86 = $(shell uname -m | $(EGREP) -c "i.86|x86|i86|amd64")

我的问题是,上述内容 - $ export CXX=clang++ $ export CXXFLAGS="-DNDEBUG -g2 -O3 -m32" $ $CXX $CXXFLAGS -dM -E - < /dev/null | egrep "(i386|x86_64)" #define __i386 1 #define __i386__ 1 #define i386 1 $ export CXX=clang++ $ export CXXFLAGS="-DNDEBUG -g2 -O3" $ $CXX $CXXFLAGS -dM -E - < /dev/null | egrep "(i386|x86_64)" #define __x86_64 1 #define __x86_64__ 1 CXX - 能否可靠地检测目标?或者我还需要其他东西吗?

以下是我提出的两个原因。首先,我对Autotools的体验表明了一些不同之处。当Autotools执行上述测试时,他们会测试CXXFLAGS,有时CPPCPP需要包含CXX(或其他黑客)以正确配置内容。

其次,像Clang这样的一些工具链集成了其他组件(如预处理器或汇编程序),因此我无法在所有情况下直接使用--isysroot

事实上,在使用其集成汇编程序时,执行像CPP这样简单的事情(询问汇编程序的版本)会导致Clang下出现“不支持的选项”错误。 (参见,With integrated assembler enabled, fail to fetch version string of assembler)。

以防万一:这不是Autools或Cmake项目。它不使用Boost或任何其他库。它是一个独立的C ++ 03项目。

1 个答案:

答案 0 :(得分:0)

  

我的问题是,上述 - 使用CXX和CXXFLAGS - 能否可靠地检测目标?

答案是,它会。预处理器或compielr驱动程序(传递给预处理器)将主要产生预期的目标定义,其他所有相等。值得注意的例外是GCC and ARMv8/Aarch64,它缺少一系列预期的定义。

要避免的是uname -m(和朋友)。 Uname报告主机上的信息,而不是目标。