Проверить совместимость - PullRequest
       47

Проверить совместимость

1 голос
/ 20 сентября 2019

У меня есть приложение, которое требует openssl, которое скомпилировано с помощью cmake.Стабильная версия AIX 7.1 cmake: 3.14.3

В файле сборки cmake у меня есть следующий тест

include(CheckCSourceCompiles)
check_c_source_compiles(check_openssl.c HAS_NEW_ENOUGH_OPENSSL)

check_openssl.c

#include <stdio.h>
#include "/usr/local/include/openssl/ossl_type.h"
#include "/usr/local/include/openssl/evp.h"

int main(int argc, char **argv){
   printf("out = %d", !EVP_aes_256_ctr);
   return !EVP_aes_256_ctr;
}

gcc без проблем компилируется, и комментарий печатается, как и ожидалось.Тем не менее, я получаю ошибку компиляции, когда я тестирую его с помощью cmake.

Обновление 1: после ответа @squareskittles и выполнения обновления cmake до 3.15.0 (созданного из AIX), я все еще ничего не получаю.Единственное сообщение об ошибке, которое я получил, было -- Performing Test HAS_NEW_ENOUGH_OPENSSL - Failed

Что касается команды, которую я использую для сборки

cmake -DJVM_ARCH_DATA_MODEL=64 -DUSE64bit=true -G "Unix Makefiles"

1 Ответ

2 голосов
/ 20 сентября 2019

РЕДАКТИРОВАТЬ: Для правильного использования check_c_source_compiles() необходимо вставить фактический код C inline в файл CMake.Кроме того, поскольку ваш код содержит кавычки, вы должны экранировать кавычки с обратной косой чертой (\").Смотрите мой пример ниже.


Эта команда check_c_source_compiles() должна использоваться для проверки , если источник может быть скомпилирован и связан с исполняемым файлом.Если это возможно, то вы должны использовать add_executable() или add_library() для его фактической компиляции.После компиляции вы можете запустить его, чтобы напечатать сообщение с комментарием.Или, если вы хотите проверить совместимость компиляции, компоновки и запуска всего за один раз, вы должны использовать check_c_source_runs() вместо этого, как предложил @Tsyvarev.Вы не опубликовали полный пример своего кода, но я думаю, вы могли бы сделать что-то вроде этого:

# Check for compile, link, run compatibility.
include(CheckCSourceRuns)
check_c_source_runs(
    "
    #include <stdio.h>
    #include \"/usr/local/include/openssl/ossl_type.h\"
    #include \"/usr/local/include/openssl/evp.h\"

    int main(int argc, char **argv){
        printf(\"out = %d\", !EVP_aes_256_ctr);
        return !EVP_aes_256_ctr;
    } 
    "
    HAS_NEW_ENOUGH_OPENSSL
)

# Build if it is compatible.
if(HAS_NEW_ENOUGH_OPENSSL)
  add_executable(MyOpenSslTest check_openssl.c)
endif()

...

unset(HAS_NEW_ENOUGH_OPENSSL CACHE)

ПРИМЕЧАНИЕ: Эти команды полагаются на другие переменные для извлечения всехнеобходимые параметры компиляции / ссылки для успешного тестирования совместимости.Скорее всего, вам потребуется установить CMAKE_REQUIRED_INCLUDES, CMAKE_REQUIRED_LIBRARIES или некоторые другие переменные, перечисленные в документации , чтобы безошибочно запускать команды check_c_*.Вы можете проверить файл CMakeError.log, чтобы увидеть, какие ошибки могут возникать при проверке совместимости.

Кроме того, переменная результата HAS_NEW_ENOUGH_OPENSSL будет кэшироваться и не будет меняться при изменении исходного файла, поэтомувы можете захотеть unset после того, как вы его используете.

...