如何检查某些关键字/属性的编译器支持?

时间:2018-05-03 14:39:19

标签: c cmake compilation

我想使用CMake来检查我的C编译器是否支持:

  • __hidden或其等效内容,例如__attribute__ ((visibility ("hidden")))
  • restrict或其等价物

这可能吗?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:3)

您可以尝试使用check_c_source_compiles编译它们并将结果存储在make变量中来检查各种功能。例如,您可以在CMakeLists.txt中使用这些测试来检查restrict__hidden的可用性:

check_c_source_compiles(
    "
        int f(void *restrict x);
        int main(void) {return 0;}
    "
    HAVE_RESTRICT
)

check_c_source_compiles(
    "
        typedef struct s *t;
        int f(t __restrict x);
        int main(void) {return 0;}
    "
    HAVE___RESTRICT
)

check_c_source_compiles(
    "
        __hidden int f() {return 1;}
        int main(void) {return 0;}
    "
    HAVE___HIDDEN
)

check_c_source_compiles(
    "
        #include <stdlib.h>
        static void f(void) __attribute__ ((visibility(\"hidden\")));
        int main(void) {return 0;}
    "
    HAVE___ATTRIBUTE__VISIBILITY_HIDDEN
)

这里有一些例子:https://github.com/Kitware/CMake/blob/master/Utilities/cmliblzma/CMakeLists.txt

具体针对restrict关键字,可用性可以通过CMAKE_C_COMPILE_FEATURES变量中c_restrict的存在来确定:

if (c_restrict IN_LIST CMAKE_C_COMPILE_FEATURES)
    [...]
endif()