我有一个尊重md-item-template
和CXX
的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
,有时CPP
或CPP
需要包含CXX
(或其他黑客)以正确配置内容。
其次,像Clang这样的一些工具链集成了其他组件(如预处理器或汇编程序),因此我无法在所有情况下直接使用--isysroot
。
事实上,在使用其集成汇编程序时,执行像CPP
这样简单的事情(询问汇编程序的版本)会导致Clang下出现“不支持的选项”错误。 (参见,With integrated assembler enabled, fail to fetch version string of assembler)。
以防万一:这不是Autools或Cmake项目。它不使用Boost或任何其他库。它是一个独立的C ++ 03项目。
答案 0 :(得分:0)
我的问题是,上述 - 使用CXX和CXXFLAGS - 能否可靠地检测目标?
答案是是,它会。预处理器或compielr驱动程序(传递给预处理器)将主要产生预期的目标定义,其他所有相等。值得注意的例外是GCC and ARMv8/Aarch64,它缺少一系列预期的定义。
要避免的是uname -m
(和朋友)。 Uname报告主机上的信息,而不是目标。