Невозможно создать привязки SDL Ada на OSX Sonoma из-за ошибки: отсутствует бинарный оператор перед токеном "("

Я пытаюсь написать небольшую игру, используя ADA (через набор инструментов Alire и gnat_native) и SDL2 на своей OSX Sonoma 14.4.1.

Для Ады я использую Alire и, насколько я вижу, у меня есть последняя собственная версия Gnat (согласно https://alire.ada.dev/crates/gnat_native):

> alr --version
alr 2.0.1

> alr toolchain
CRATE VERSION STATUS NOTES
gprbuild 22.0.1 Default
gnat_native 13.2.2 Default

Я добавил привязки SDL в свой проект с помощью следующей команды alr with sdlada, но когда я пытаюсь собрать его с помощью alr build на своем Mac, я получаю следующую ошибку:

> alr build
ⓘ Running pre-build actions for sdlada=2.5.20...                               
mkdir -p gen/src/
ⓘ Building tictactoe=0.1.0-dev/tictactoe.gpr...
Compile
   [C]            version_ttf.c
   [C]            version_images.c
   [C]            version.c
In file included from /usr/local/include/SDL2/SDL_platform.h:76,
                 from /usr/local/include/SDL2/SDL_config.h:33,
                 from /usr/local/include/SDL2/SDL_stdinc.h:31,
                 from /usr/local/include/SDL2/SDL_main.h:25,
                 from /usr/local/include/SDL2/SDL.h:32,
                 from /Users/stefano/.local/share/alire/builds/sdlada_2.5.20_cd53c280/42d3242441b923cdce0d399fdf8d3b6b1a75d0874241c5467499cc92113894c2/src/version.c:4:
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/TargetConditionals.h:140:50: error: missing binary operator before token "("
  140 | #if !defined(__has_extension) || !__has_extension(define_target_os_macros)
      |                                                  ^
In file included from /usr/local/include/SDL2/SDL_platform.h:76,
                 from /usr/local/include/SDL2/SDL_config.h:33,
                 from /usr/local/include/SDL2/SDL_stdinc.h:31,
                 from /usr/local/include/SDL2/SDL_main.h:25,
                 from /usr/local/include/SDL2/SDL.h:32,
                 from /usr/local/include/SDL2/SDL_image.h:32,
                 from /Users/stefano/.local/share/alire/builds/sdlada_2.5.20_cd53c280/42d3242441b923cdce0d399fdf8d3b6b1a75d0874241c5467499cc92113894c2/src/image/version_images.c:4:
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/TargetConditionals.h:140:50: error: missing binary operator before token "("
  140 | #if !defined(__has_extension) || !__has_extension(define_target_os_macros)
      |                                                  ^
In file included from /usr/local/include/SDL2/SDL_platform.h:76,
                 from /usr/local/include/SDL2/SDL_config.h:33,
                 from /usr/local/include/SDL2/SDL_stdinc.h:31,
                 from /usr/local/include/SDL2/SDL_main.h:25,
                 from /usr/local/include/SDL2/SDL.h:32,
                 from /usr/local/include/SDL2/SDL_ttf.h:39,
                 from /Users/stefano/.local/share/alire/builds/sdlada_2.5.20_cd53c280/42d3242441b923cdce0d399fdf8d3b6b1a75d0874241c5467499cc92113894c2/src/ttf/version_ttf.c:4:
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/TargetConditionals.h:140:50: error: missing binary operator before token "("
  140 | #if !defined(__has_extension) || !__has_extension(define_target_os_macros)
      |                                                  ^

   compilation of version.c failed
   compilation of version_images.c failed
   compilation of version_ttf.c failed

gprbuild: *** compilation phase failed

Кажется, это ошибка, возникшая в самих библиотеках OSX SDK.

Я думаю, что эта установка SDL работает, потому что я использовал другой проект, написанный на C++ (C++20) и скомпилированный с помощью CMake/Clang.

Черпая вдохновение из этого поста https://github.com/orgs/Homebrew/discussions/5195 кажется, проблема в том, что используется препроцессор (я не уверен, как узнать какой именно). это так) не поддерживает __has_extension, который является функцией C++17.

Могу ли я каким-либо образом указать Alire/toolchain/gnat_native использовать другой компилятор C++, поддерживающий это? Или заставить компилятор, используемый alr build, использовать стандарт C++17? Или есть способ использовать другую цепочку инструментов, которая может это поддержать (возможно, через Alire)? Или способ просто разрешить привязки SDL ADA к статической или динамической компиляции, которые я уже установил на своем компьютере (через самодельный вариант)?

Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
123
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это был мой вопрос на сайте Homebrew! Мне показалось это знакомым!

Следующие местоположения файлов относятся к Alire 2.0, более ранние версии Alire организованы по-другому.

Под ~.local/share/alire вы найдете 3 каталога:

  • toolchains содержит .. релизы инструментальной цепочки.
  • releases содержит загруженные выпуски ящиков.
  • builds содержит кэшированные сборки ящиков с использованием специальных инструментов.

Теперь у вас есть (неудачная) сборка, последняя будет заполнена, поэтому действуйте дальше:

  • перейти к последней версии sdlada; У меня есть sdlada_2.5.20_cd53c280.
  • Внутри него есть как минимум один длинный хэш, соответствующий используемому инструменту. У меня есть только один; cd в него (если их несколько, я полагаю, вы могли бы использовать последнюю версию).
  • отредактируйте build/gnat/sdlada.gpr вот так:
@@ -36,6 +36,7 @@ library project SDLAda is
    for Library_Kind use "static";
 
    package Compiler is
+      for Driver ("C") use "clang";
       Common_Switches := ("-ffunction-sections", "-fdata-sections");
       C_Switches      := ();
       Ada_Switches    := ("-gnat2012", "-gnata", "-gnato", "-gnatwa",

Это во многом обходной путь! Правильное разрешение должно быть сделано в источнике. Хотите опубликовать проблему в репозитории slada на Github, или мне это сделать?

Это сработало, спасибо! Компиляция (пустого проекта) прошла успешно, и мне удалось создать статическую библиотеку libsddlada.a. Мне интересно, в чем на самом деле заключается проблема: может быть, Apple нужно исправить свой код для поддержки других компиляторов? Может быть, необходимо обновить набор инструментов для поддержки функций препроцессора C++17? Может ли пакет SDL ADA потребовать использования другого компилятора для сред OSX?

sanelli 22.04.2024 14:10

См. этот пиар. Apple прислушивается к разработчикам GCC, но гораздо больше интересуется Swift и т. д., сюрприз-сюрприз. Инструментарий обновляется. Тем временем, обновление ящика slada — это путь вперед.

Simon Wright 23.04.2024 22:24

Другие вопросы по теме