Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cmake 如何让CHECK_CXX_编译器_标志在非法值上失败?_Cmake_Solaris_Compiler Options_Suncc - Fatal编程技术网

Cmake 如何让CHECK_CXX_编译器_标志在非法值上失败?

Cmake 如何让CHECK_CXX_编译器_标志在非法值上失败?,cmake,solaris,compiler-options,suncc,Cmake,Solaris,Compiler Options,Suncc,对于SunCC代码路径,我们包含以下内容。SunCC使用-xarch=XXX而不是GCC样式-mXXX 检查\u CXX\u编译器\u标志(“-xarch=sha”CRYPTOPP\u IA32\u sha) 当我们在Sun的编译器下运行CMake时,结果是: --检测CXX编译器ABI信息 --检测CXX编译器ABI信息-完成 --检测CXX编译特性 --检测CXX编译功能-完成 --正在执行测试加密PP_IA32_SSSE3 --执行测试加密PP_IA32_SSSE3-成功 --执行测试加

对于SunCC代码路径,我们包含以下内容。SunCC使用
-xarch=XXX
而不是GCC样式
-mXXX

检查\u CXX\u编译器\u标志(“-xarch=sha”CRYPTOPP\u IA32\u sha)
当我们在Sun的编译器下运行CMake时,结果是:

--检测CXX编译器ABI信息
--检测CXX编译器ABI信息-完成
--检测CXX编译特性
--检测CXX编译功能-完成
--正在执行测试加密PP_IA32_SSSE3
--执行测试加密PP_IA32_SSSE3-成功
--执行测试加密PP_IA32_SSE4
--执行测试加密PP_IA32_SSE4-成功
--正在执行测试加密PP_IA32_CLMUL
--执行测试加密PP_IA32_CLMUL-成功
--执行测试加密PP_IA32_AES
--执行测试加密PP_IA32_AES-成功
--正在执行测试加密PP_IA32_SHA
--执行测试加密PP_IA32_SHA-成功
...
然而,当我们编译它时,结果是:

$make sha simd.o shacal2 simd.o VERBOSE=1
make-f CMakeFiles/cryptopp-object.dir/build.make CMakeFiles/cryptopp-object.dir/sha simd.cpp.o
构建CXX对象cmakfiles/cryptopp object.dir/sha simd.cpp.o
/opt/solaristudio12.4/bin/CC-m32-template=no%extdef-g-xO2-DNDEBUG-xarch=sha-o CMakeFiles/cryptopp object.dir/sha simd.cpp.o-c/export/home/test/sha-simd.cpp
抄送:警告:非法使用-xarch选项,忽略非法值:sha
make-f CMakeFiles/cryptopp-object.dir/build.make CMakeFiles/cryptopp-object.dir/shacal2 simd.cpp.o
构建CXX对象cmakfiles/cryptopp object.dir/shacal2 simd.cpp.o
/opt/solaristudio12.4/bin/CC-m32-template=no%extdef-g-xO2-DNDEBUG-xarch=sha-o CMakeFiles/cryptopp object.dir/shacal2 simd.cpp.o-c/export/home/test/shacal2-simd.cpp
抄送:警告:非法使用-xarch选项,忽略非法值:sha
添加SunCC的
-errwarn
-errwarn=%all
无助于CMake检测故障

该消息可能会给用户带来很多问题。它还违反了我们对干净编译的治理。我们想把它清理干净,避免任何麻烦


如何让CMake在非法值上通过
检查\u CXX\u编译器\u标志
测试?

我想,当检查编译器标志时,CMake只需验证编译命令的结果。由于“警告”消息不影响结果,CMake无法检测到该标志实际上被忽略

您可以使用命令手动测试标志,以便检查某些模式的输出(例如“警告”)

还有一个宏,它已经接受模式匹配


另请参见和我的答案。

我想,当检查编译器标志时,CMake只需验证编译命令的结果。由于“警告”消息不影响结果,CMake无法检测到该标志实际上被忽略

您可以使用命令手动测试标志,以便检查某些模式的输出(例如“警告”)

还有一个宏,它已经接受模式匹配


另请参见和我的答案。

我们所能做的最好的事情就是添加一个自定义的
检查编译器选项。但是,它还有其他问题,因为在执行CMakeLists.txt时,CMake不能提供准确的
cxflags
。交叉编译过程中会出现问题。另见

函数(CheckCompilerOption选项变量)
if(${CMAKE_CXX_COMPILER_ID}STREQUAL“SunPro”)
消息(状态“正在执行测试${variable}”)
执行程序(
命令sh-c“${CMAKE_CXX_COMPILER}${CMAKE_CXX_FLAGS}${option}-E-xdumpmacros/dev/null 2>&1”
命令egrep-i-c“忽略非法值”
结果\变量命令\结果
输出\变量命令\输出
输出(带尾随空白)
if(命令\u结果STREQUAL“1”和命令\u输出STREQUAL“0”)
set(${variable}1父范围)
消息(状态“正在执行测试${variable}-成功”)
else()
set(${variable}0父范围)
消息(状态“正在执行测试${variable}-失败”)
endif()
else()
检查\u CXX\u编译器\u标志(${option}${variable})
endif()
endfunction(检查编译器选项)
“${${variable}}”
看起来很奇怪,但基于一些现有代码,我相信它是正确的。取消引用的第一个版本是错误的。CMake文档没有讨论它,也没有提供示例,所以我们又瞎了眼。它在关于堆栈溢出的文章中提到

它可以像预期的那样被称为:

checkcompiler选项(“-msse4.1-maes”CRYPTOPP\u IA32\u AES)
检查编译器选项(“-msse4.2-msha”CRYPTOPP\u IA32\u SHA)
...
选中编译器选项(“-march=armv7-a-mfloat abi=hard-mfpu=neon”CRYPTOPP\u ARMV7A\u hard)
选中编译器选项(“-march=armv7-a-mfloat abi=softfp-mfpu=neon”CRYPTOPP\u ARMV7A\u softfp)
...
检查编译器选项(“-march=armv8-a+crc”CRYPTOPP\u ARMV8A\u crc)
检查编译器选项(“-march=armv8-a+crypto”CRYPTOPP\u ARMV8A\u crypto)
...
检查编译器选项(“-xarch=aes”CRYPTOPP\u SUNCC\u aes)
checkcompiler选项(“-xarch=sha”CRYPTOPP\u SUNCC\u sha)
如果您需要回到CMake 3.0之前的版本(比如使用CMake 2.8的Ubuntu 10或CentOS 5),那么请放弃
检查\u CXX\u COMPILER\u FLAG
,并将函数的顶部用于Clang、GCC、ICC等

GCC的检查语法是一个选项,如下所示。该命令以SSSE3为例

$(CXX) -x c++ $(CXXFLAGS) -mssse3 -dM -E - </dev/null 2>&1 | egrep -i -c __SSSE3__
<代码> $(CXX)-x C++ $(CXXFLAGS)-MSSESE3-DM -E&1 EGRIP-I C -C SSSE3*
我们所能做的最好的事情就是添加一个自定义的
检查编译器选项
。但是,它还有其他问题,因为在执行CMakeLists.txt时,CMake不能提供准确的
cxflags
。交叉编译过程中会出现问题。另见

函数(CheckCompilerOption选项变量)
如果(${CMAKE\u CXX\u COMPILER\u ID}STREQUAL“Su