Как проверить поддержку компилятором определенных ключевых слов / атрибутов? - PullRequest
0 голосов
/ 03 мая 2018

Я хочу использовать CMake, чтобы проверить, поддерживает ли мой компилятор C:

  • __hidden или его эквивалент, такой как __attribute__ ((visibility ("hidden")))
  • restrict или его эквивалент

Возможно ли это? Если да, то как?

1 Ответ

0 голосов
/ 03 мая 2018

Вы можете проверить различные функции, попытавшись скомпилировать их с помощью 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 доступность можно определить по наличию c_restrict в переменной CMAKE_C_COMPILE_FEATURES:

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