0

我们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非法值的测试失败?

4

2 回答 2

1

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

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

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

另请参阅该问题和我的答案。

于 2017-08-26T16:16:20.827 回答
1

我们能做的最好的事情就是添加一个自定义CheckCompilerOption. CXXFLAGS但是,它还有其他问题,因为在执行 CMakeLists.txt 时CMake 不提供准确的信息。在交叉编译期间问题浮出水面。另请参阅CMake 问题 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}}"看起来很奇怪,但我相信它基于一些现有代码是正确的。取消引用的第一个版本是错误的。CMake 文档function没有讨论它,也没有提供示例,所以我们又瞎了眼。设置和使用变量的 CMake 语法是什么?关于堆栈溢出。

它可以像预期的那样被调用:

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__
于 2017-08-26T19:35:21.933 回答