FoxSDR 0.99.39 · ОТКРЫТАЯ БЕТА
Машинный перевод
← Назад к FoxSDR

Сборка из исходников · Apple silicon и Intel

Сборка на macOS

Эту сборку ещё никто не довёл до конца. FoxSDR разрабатывается в Windows, и у него есть задание Linux CI, которое проходит при каждом коммите. На macOS сборку ни разу не пробовали. Всё на этой странице выведено из реальных файлов сборки и работающего рецепта для Linux, но сама сборка не проверена. Будьте готовы наткнуться на то, о чём эта страница не упоминает, и, пожалуйста, сообщите нам, когда это случится.

Самое трудное уже сделано. Проект собирается и проходит полный набор тестов в Linux CI, так что код для платформ, отличных от Windows, действительно проверяется, а не существует лишь в теории. Дальше описана разница между этим путём и Mac.

Что вам понадобится

Всё, кроме SoapySDR и OpenSSL, включено в исходники в third_party/: GLFW 3.4, Dear ImGui, PortAudio, pffft, nlohmann/json, tweetnacl и cpp-httplib собираются из исходного кода в дереве проекта. У включённых GLFW и PortAudio есть собственная полноценная поддержка macOS — Cocoa и CoreAudio, — так что от вас им ничего не должно понадобиться.

xcode-select --install                      # Apple Clang, needs C++20
brew install cmake ninja soapysdr openssl@3

CMake 3.20 или новее. Проект написан на C++20 с CMAKE_CXX_STANDARD_REQUIRED ON, поэтому старый Xcode отказывает уже на этапе конфигурации, а не загадочным образом позже.

На Mac с USB-приёмниками работает SoapySDR. Начиная с 0.91.0 в FoxSDR есть собственные драйверы для семейств RTL-SDR, HackRF, Airspy, Mirics и RX888, но их USB-транспорт существует только для Windows (WinUSB) и Linux (usbfs): на macOS этот слой собирается как заглушка, которая ничего не находит, поэтому каждый USB-приёмник подключается через SoapySDR::Device::enumerate(), и использовать можно те модули SoapySDR, которые вы установите. brew install soapyrtlsdr, soapyairspy, soapyhackrf и так далее — в зависимости от вашего оборудования. FoxSDR прекрасно работает и без них, используя встроенный генератор сигнала или воспроизведение файлов I/Q.

Сборка

git clone https://github.com/wonderingStars/foxsdr.git
cd foxsdr
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release \
      -DOPENSSL_ROOT_DIR="$(brew --prefix openssl@3)"
cmake --build build -j"$(sysctl -n hw.ncpu)"

OPENSSL_ROOT_DIR — единственный флаг, который не нужен в Linux. macOS поставляется с LibreSSL, а не OpenSSL, а Homebrew намеренно не включает openssl@3 в путь поиска по умолчанию, поэтому find_package(OpenSSL REQUIRED) сам его не найдёт. OpenSSL используется для примитивов хеширования паролей и для HTTPS-клиента каталога плагинов; в Windows вместо него используются CNG и WinHTTP, поэтому там он не является зависимостью.

Затем:

ctest --test-dir build --output-on-failure
./build/cascade --selftest

Запустите --selftest, прежде чем делать вывод, что что-то работает. Он прогоняет настоящую цепочку ЦОС без интерфейса и проверяет известный пик спектра, поэтому ловит сборку, которая чисто компонуется, проходит модульные тесты и вычисляет неверные числа.

Один тест открывает настоящее окно. В Linux CI для этого нужен Xvfb; на macOS просто запускайте тесты из обычного графического сеанса с выполненным входом, и всё должно быть в порядке.

Единственный патч, который вам почти наверняка понадобится

Две функции находят каталог собственного исполняемого файла с помощью /proc из Linux, которого нет в macOS:

  • src/core/band_plan.cpp, в BandPlan::defaultDir()
  • src/core/plugin_host.cpp, примерно в строке 888

Обе делают так:

const fs::path link = fs::read_symlink("/proc/self/exe", ec);

На macOS это не срабатывает, устанавливается ec, путь остаётся пустым, и обе функции откатываются к пути относительно текущего каталога. Ничего не падает, но приложение не найдёт свои планы диапазонов и плагины, если только вы случайно не запустите его из каталога сборки. Исправление — ветка __APPLE__ с использованием _NSGetExecutablePath, и в обоих файлах уже есть структура #ifdef, куда её можно встроить:

#elif defined(__APPLE__)
    char buf[PATH_MAX];
    uint32_t size = sizeof(buf);
    if (_NSGetExecutablePath(buf, &size) == 0) {
        std::error_code rc;
        const fs::path resolved = fs::canonical(fs::path(buf), rc);
        exe = rc ? fs::path(buf) : resolved;
    }
#else
    // existing Linux /proc branch
#endif

с #include <mach-o/dyld.h> и #include <climits> рядом с заголовками других платформ. _NSGetExecutablePath может вернуть путь, содержащий символические ссылки и .., поэтому его стоит пропустить через fs::canonical.

Для первой функции есть тест — test_band_plan проверяет, что defaultDir() оканчивается на bandplans и никогда не является обычным файлом, — так что сигнал вы получите в любом случае.

Что не будет работать и за чем не стоит гоняться

  • Нет отчётов о сбоях. Обработчик сбоев построен на dbghelp и работает только в Windows.
  • Отчёты об использовании не проверены. Вне Windows отчёт отправляется тем же HTTPS-отправителем, который использует сборка для Linux, поэтому сборка для Mac должна отправлять отчёты так же, как Linux; на Mac это ещё никто не проверял.
  • У окна остаётся строка заголовка. src/gui/win_frame.cpp реализует окно без рамки через WM_NCCALCSIZE и WM_NCHITTEST; всё его тело находится внутри #ifdef _WIN32, поэтому на других платформах оно компилируется в ничто, и окно просто выглядит обычно. Чисто косметический момент.

Ничто из этого не мешает приёмнику работать.

Планы диапазонов

Версия 0.81.0 поставляет девять планов диапазонов — мировой, три региона МСЭ, а также Великобритании, США, Канады, Японии и Австралии. CMake на каждой платформе помещает их рядом с собранным двоичным файлом, так что после сборки у вас должно быть:

build/resources/bandplans/*.json

Выберите свой регион в приложении в разделе Дисплей → Регион. Если список пуст или слой никогда не рисуется, дело в описанной выше проблеме с /proc/self/exe, а не в отсутствующем файле, — сначала проверьте, существует ли build/resources/bandplans/.

Для справки: рецепт Linux CI

.github/workflows/build.yml собирается на ubuntu-latest и ближе всего к заведомо рабочей сборке не для Windows. Его список зависимостей переносится так:

LinuxmacOS
build-essentialXcode Command Line Tools
cmake ninja-buildbrew install cmake ninja
libsoapysdr-devbrew install soapysdr
libssl-devbrew install openssl@3 + OPENSSL_ROOT_DIR
libgl1-mesa-devуже есть в macOS SDK
libx11-dev, libwayland-dev, libxkbcommon-dev, …не нужен — GLFW использует Cocoa
libasound2-devне нужен — PortAudio использует CoreAudio
xvfbне нужен в графическом сеансе

В остальном команды конфигурации и сборки идентичны.

Если у вас получится

Сообщите нам. Сборка для Mac, которую кто-то действительно запустил, ценнее этой страницы, и первый, кто это сделает, превратит «не проверено» в поддерживаемую платформу. Сказать об этом можно в программе бета-тестирования или написав на [email protected].

Лицензия

FoxSDR распространяется по лицензии PolyForm Noncommercial — бесплатно для некоммерческого использования, и сборка для себя целиком в эти рамки укладывается. Для коммерческого использования нужна отдельная лицензия. Включённые в исходники сторонние компоненты сохраняют свои собственные лицензии, перечисленные в third_party/THIRD_PARTY.md.