如何让CHECK_CXX_COMPILER_FLAG因非法值而失败?

时间:2017-08-26 14:14:09

标签: cmake solaris compiler-options suncc

我们的CMakeFile.txt包含以下SunCC代码路径。 SunCC使用-xarch=XXX而不是GCC样式-mXXX

CHECK_CXX_COMPILER_FLAG("-xarch=sha" CRYPTOPP_IA32_SHA)

当我们在Sun的编译器下运行CMake时,它会导致:

-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Performing Test CRYPTOPP_IA32_SSSE3
-- Performing Test CRYPTOPP_IA32_SSSE3 - Success
-- Performing Test CRYPTOPP_IA32_SSE4
-- Performing Test CRYPTOPP_IA32_SSE4 - Success
-- Performing Test CRYPTOPP_IA32_CLMUL
-- Performing Test CRYPTOPP_IA32_CLMUL - Success
-- Performing Test CRYPTOPP_IA32_AES
-- Performing Test CRYPTOPP_IA32_AES - Success
-- Performing Test CRYPTOPP_IA32_SHA
-- Performing Test CRYPTOPP_IA32_SHA - Success
...

然而,当我们编译时,结果为:

$ 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
Building CXX object CMakeFiles/cryptopp-object.dir/sha-simd.cpp.o
/opt/solarisstudio12.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
CC: Warning: illegal use of -xarch option, illegal value ignored: sha

make -f CMakeFiles/cryptopp-object.dir/build.make CMakeFiles/cryptopp-object.dir/shacal2-simd.cpp.o
Building CXX object CMakeFiles/cryptopp-object.dir/shacal2-simd.cpp.o
/opt/solarisstudio12.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
CC: Warning: illegal use of -xarch option, illegal value ignored: sha

添加SunCC的-errwarn-errwarn=%all无法帮助CMake检测到失败。

该消息可能会给用户带来很多问题。它也违反了我们对清洁编译的管理。我们想清理它并避免任何麻烦。

我们如何告诉CMake未通过CHECK_CXX_COMPILER_FLAG非法值测试?

2 个答案:

答案 0 :(得分:1)

我猜,在检查编译器标志时,CMake只是验证编译命令的结果。作为"警告"消息不会影响结果,CMake无法检测到该标志实际被忽略。

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

还有CHECK_CXX_SOURCE_COMPILES宏,它已经接受匹配模式。

另见that question及其答案。

答案 1 :(得分:1)

我们能做的最好的事情是添加自定义CheckCompilerOption。但是,它还有其他问题,因为CMake在执行CMakeLists.txt时无法提供准确的CXXFLAGS。交叉编译时出现问题。另请参阅CMake Issue 18813

function(CheckCompilerOption option variable)

    if (${CMAKE_CXX_COMPILER_ID} STREQUAL "SunPro")

        message(STATUS "Performing Test ${variable}")        
        execute_process(
            COMMAND sh -c "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS} ${option} -E -xdumpmacros /dev/null 2>&1"
            COMMAND egrep -i -c "illegal value ignored"
            RESULT_VARIABLE COMMAND_RESULT
            OUTPUT_VARIABLE COMMAND_OUTPUT
            OUTPUT_STRIP_TRAILING_WHITESPACE)

            if (COMMAND_RESULT STREQUAL "1" AND COMMAND_OUTPUT STREQUAL "0")
                set(${variable} 1 PARENT_SCOPE)
                message(STATUS "Performing Test ${variable} - Success")
            else ()
                set(${variable} 0 PARENT_SCOPE)
                message(STATUS "Performing Test ${variable} - Failed")
            endif ()

    else()

        CHECK_CXX_COMPILER_FLAG(${option} ${variable})

    endif()

endfunction(CheckCompilerOption)

"${${variable}}"看起来很奇怪,但我认为它基于一些现有代码是正确的。第一个带有解除引用的版本是错误的。 function的CMake文档没有讨论它,也没有提供示例,所以我们再次失明。它在Stack Overflow上的What's the CMake syntax to set and use variables?中提到。

可以像预期一样调用它:

CheckCompilerOption("-msse4.1 -maes" CRYPTOPP_IA32_AES)
CheckCompilerOption("-msse4.2 -msha" CRYPTOPP_IA32_SHA)
...

CheckCompilerOption("-march=armv7-a -mfloat-abi=hard -mfpu=neon" CRYPTOPP_ARMV7A_HARD)
CheckCompilerOption("-march=armv7-a -mfloat-abi=softfp -mfpu=neon" CRYPTOPP_ARMV7A_SOFTFP)
...

CheckCompilerOption("-march=armv8-a+crc" CRYPTOPP_ARMV8A_CRC)
CheckCompilerOption("-march=armv8-a+crypto" CRYPTOPP_ARMV8A_CRYPTO)
...

CheckCompilerOption("-xarch=aes" CRYPTOPP_SUNCC_AES)
CheckCompilerOption("-xarch=sha" CRYPTOPP_SUNCC_SHA)

如果你需要回到CMake 3.0以上(比如使用CMake 2.8的Ubuntu 10或CentOS 5),那么放弃CHECK_CXX_COMPILER_FLAG并使用函数的顶部用于Clang,GCC,ICC等。

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

$(CXX) -x c++ $(CXXFLAGS) -mssse3 -dM -E - </dev/null 2>&1 | egrep -i -c __SSSE3__
相关问题