Я пытаюсь портировать свою программу под Mac (Lazarus), и мне сказали, что нужно выбирать между двумя архитектурами — x86_64 или ARM. Я тут пока ничего не знаю, создалось ощущение что ARM это что-то более современное и продвинутое (в том числе по статье на хабре), но один пользователь написал выбирать x86_64. Можете что-то подсказать?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, Khimik, Вы писали:
K>Я пытаюсь портировать свою программу под Mac (Lazarus), и мне сказали, что нужно выбирать между двумя архитектурами — x86_64 или ARM. Я тут пока ничего не знаю, создалось ощущение что ARM это что-то более современное и продвинутое (в том числе по статье на хабре), но один пользователь написал выбирать x86_64. Можете что-то подсказать?
Лучше и то, и то. Это всего лишь вопрос сборки: то есть собираешь на двух разных маках и получается два разных бинарника. Насчет кросс-компиляции не знаю.
x86_64 — это маки на базе интеловых процессоров. Последние пару лет теряют актуальность, так как вышли новые на ARM, которые сильно лучше и производительнее.
Теоретически, x86_64 может запускаться на АРМе через Розетту (эмулятор от Эпла) автоматом. Но может быть просадка по скорости, что может быть важно, если программа требовательна к ресурсам.
Здравствуйте, Khimik, Вы писали:
K> Я пытаюсь портировать свою программу под Mac (Lazarus), и мне сказали, что нужно выбирать между двумя архитектурами — x86_64 или ARM. Я тут пока ничего не знаю, создалось ощущение что ARM это что-то более современное и продвинутое (в том числе по статье на хабре), но один пользователь написал выбирать x86_64. Можете что-то подсказать?
Ничего выбирать не нужно. Делай две сборки: x86_64 для отживающих маков и aarch64 (arm64) для новых. В лазаре это вопрос создания доп. конфигурации в настройках проекта.
Здравствуйте, Khimik, Вы писали:
K>Я пытаюсь портировать свою программу под Mac (Lazarus), и мне сказали, что нужно выбирать между двумя архитектурами — x86_64 или ARM. Я тут пока ничего не знаю, создалось ощущение что ARM это что-то более современное и продвинутое (в том числе по статье на хабре), но один пользователь написал выбирать x86_64. Можете что-то подсказать?
Нужно скомпилировать 2 версии исполняемого файла проекта (для ARM и Intel) а затем склеить их в один файл. Получится Universal Binary для старых и новых Mac. Компилировать можно на любом Мак, главное чтобы была версия macOS 11 Big Sur или новее.
Вот куски кода для Терминала (можно упаковать в скрипт):
lazbuild --cpu=aarch64 --build-all --recursive MyProject.lpi
strip MyProject
// Затем переименуйте в MyProject_arm64
lazbuild --cpu=x86_64 --build-all --recursive MyProject.lpi
strip MyProject
// Затем переименуйте в MyProject_intel
lipo -create -output MyProject MyProject_intel MyProject_arm64
// Команда lipo склеивает обе версии в единый файл.
Команда strip убирает лишнюю отладочную информацию из исполняемого файла и сильно уменьшит размер исполняемого файла
Когда пользователь на Intel Mac запустит приложение, то macOS автоматически выберет Intel код, а на ARM автоматически выберет arm код.
Здравствуйте, Khimik, Вы писали:
K>Я пытаюсь портировать свою программу под Mac (Lazarus), и мне сказали, что нужно выбирать между двумя архитектурами — x86_64 или ARM. Я тут пока ничего не знаю, создалось ощущение что ARM это что-то более современное и продвинутое (в том числе по статье на хабре), но один пользователь написал выбирать x86_64. Можете что-то подсказать?
Как уже сказали выше — надо делать и то и то.
А потом собирать "universal binary". Это комбинированное приложение которое содержит оба кода и система сама выбирает что ей запускать. По ссылке вроде есть инструкция как это сделать используя терминал. Ну или ищите дальше про "universal binary"
В macOS это давно используемая технология — так делали еще при переходе с PowerPC на Intel.
Если сделать только x86_64 то розетта его конечно запустит и даже потерь в производительность почти не будет, (Розетта 2 очень эффективна, ее почти незаметна. Это первая розетта PowerPC -> Intel жрала кучу ресурсов) но в последних macOS розетта уже не установлена по умолчанию и при попытке запуска интеловского приложения предлагает ее установить. Не создавайте своим пользователям лишние хлопоты.
Ну а если делать только Apple Silicon — то запустить программу на интеловской машинке будет нельзя в принципе. А их еще довольно много
Добавлю к вышеописаному что для разработки понадобится физический мак на чипе М1/М2 (на интеловском чипе не получится протестировать софт под AArch64), ну или виртальный мак в облаке.
Первые маки были на процессорах PowerPC, они уже давно вымерли. Потом были маки на процессорах Intel x86_64, выпускаются до сих пор. Новые модели уже на процессорах M1/M2. Это процессоры между собой естественно никак не совместимы, поэтому прогу нужно компилировать (и тестировать) отдельно под Intel и M1 и склеивать файлы в толстый бинарник. А там система разберется какой ей запускать.
Lazarus/FPC умеют компилировать под эти процессоры без особых проблем, у меня многие проги собираются под Windows (i386, x86_64) и macOS (x86_64, AArch64). Скоро вроде должны поддержку AArch64 на Windows завезти.
ЧВ>Первые маки были на процессорах PowerPC, они уже давно вымерли. Потом были маки на процессорах Intel x86_64, выпускаются до сих пор. Новые модели уже на процессорах M1/M2. Это процессоры между собой естественно никак не совместимы, поэтому прогу нужно компилировать (и тестировать) отдельно под Intel и M1 и склеивать файлы в толстый бинарник. А там система разберется какой ей запускать.
До PowerPC были еще маки на процессорах Motorola, еще до Mac OS X, под Mac OS Classic.
если компилятору подать сразу две архитектуры через ключи (-arch x86_64 -arch arm64) то он собирает сразу universal binary:
Для сборки дистрибутива в DMG файле (если собираетесь вне AppStore сами распространять)
советую взять этот opensource скрипт, очень простой в использовании:
Здравствуйте, rudzuk, Вы писали:
K>> Я пытаюсь портировать свою программу под Mac (Lazarus), и мне сказали, что нужно выбирать между двумя архитектурами — x86_64 или ARM. Я тут пока ничего не знаю, создалось ощущение что ARM это что-то более современное и продвинутое (в том числе по статье на хабре), но один пользователь написал выбирать x86_64. Можете что-то подсказать?
R>Ничего выбирать не нужно. Делай две сборки: x86_64 для отживающих маков и aarch64 (arm64) для новых. В лазаре это вопрос создания доп. конфигурации в настройках проекта.
Мне неудобно задавать такие вопросы, поскольку портированием моей программы для Mac занимается другой человек, он это спросил, а я не очень понимаю сам вопрос. Он говорит, что ему надо два Mac-а, один на x86_64, второй на ARM, и на каждом скомпилировать проект. А в настройках Лазаруса нет такого выбора, там вариант целевой платформы только Mac. Можете пояснить, что такое доп. конфигурация в настройках проекта, и можно ли например на Linux версии Lazarus-а скомпилировать и проект под x86_64, и под ARM? И как это делается?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, Khimik, Вы писали:
K> R>Ничего выбирать не нужно. Делай две сборки: x86_64 для отживающих маков и aarch64 (arm64) для новых. В лазаре это вопрос создания доп. конфигурации в настройках проекта.
K> Мне неудобно задавать такие вопросы, поскольку портированием моей программы для Mac занимается другой человек, он это спросил, а я не очень понимаю сам вопрос. Он говорит, что ему надо два Mac-а, один на x86_64, второй на ARM, и на каждом скомпилировать проект. А в настройках Лазаруса нет такого выбора, там вариант целевой платформы только Mac. Можете пояснить, что такое доп. конфигурация в настройках проекта, и можно ли например на Linux версии Lazarus-а скомпилировать и проект под x86_64, и под ARM? И как это делается?
Помнишь я говорил тебе про fpcupdeluxe? С помощью нее можно поставить несколько кросс-компиляторов (можно и руками, конечно, но это сложнее), которые позволят на одной системе делать сборки для других платформ. У меня сейчас в линуксе установлено 6 кросс-компиляторов, выглядит в fpcupdeluxe это так:
macOS это darwin. Поддержку aarch64 я не ставил, ставил только интеловские i386 и x86_64.
Когда с кросс-компиляцией разобрались, в настройках проекта Project Options, нужно выбрать настройки компилятора Compiler Options и в самом верху есть поле Build Modes (режимы сборки) и кнопка для открытия редактора этих режимов. Режим сборки включает в себя настройки компилятора. Например, создаешь новый режим сборки и называешь его macOS_x86_64_release, после чего в настройках проекта указываешь целевую платформу (Target Platform): Darwin, и компилятор (Target CPU family): x86_64, отключаешь все относящееся к режиму отладки и вот у тебя готов режим сборки для интеловского мака. Ну и создаешь этих режимов сколько требуется. Потом, при сборке через lazbuild, указываешь требуемый режим сборки, например: "--build-mode=macOS_x86_64_release".
Здравствуйте, rudzuk, Вы писали: R> R>macOS это darwin. Поддержку aarch64 я не ставил, ставил только интеловские i386 и x86_64.
О тут aarch64-windows у вас. Оно уже работоспособно?
Автору оригинального вопрооса тоже посоветую FpcupDeluxe, можно легко ставить самые свежие версии FPC/LAZARUS и кросс-компиляторы.
К слову под мак можно собирать даже из под Windows, правда тестировать придется отдельно на маке. Ну и также можно с x86_64 мака кросс-компилить под aarch64 (наоборот у меня не получилось, но может это уже исправили).
Здравствуйте, Aleksid1, Вы писали:
A>Команда strip убирает лишнюю отладочную информацию из исполняемого файла и сильно уменьшит размер исполняемого файла
Там есть еще один прикол с дефолтным visibility символов. Может оказаться так, что все символы окажутся экспортируемыми и, насколько я знаю, strip с ними ничего не делает.
Мы собираем под мак с -fvisibility=hidden, strip делается потом средствами VMProtect.