Я пытаюсь написать небольшую игру, используя 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 к статической или динамической компиляции, которые я уже установил на своем компьютере (через самодельный вариант)?
Это был мой вопрос на сайте 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, или мне это сделать?
См. этот пиар. Apple прислушивается к разработчикам GCC, но гораздо больше интересуется Swift и т. д., сюрприз-сюрприз. Инструментарий обновляется. Тем временем, обновление ящика slada — это путь вперед.
Это сработало, спасибо! Компиляция (пустого проекта) прошла успешно, и мне удалось создать статическую библиотеку libsddlada.a. Мне интересно, в чем на самом деле заключается проблема: может быть, Apple нужно исправить свой код для поддержки других компиляторов? Может быть, необходимо обновить набор инструментов для поддержки функций препроцессора C++17? Может ли пакет SDL ADA потребовать использования другого компилятора для сред OSX?