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, перш ніж робити висновок, що щось працює. Він проганяє справжній ланцюжок DSP без графічного інтерфейсу й перевіряє відомий пік спектра, тож виявляє збірку, яка чисто лінкується, проходить свої модульні тести — і обчислює неправильні числа.

Один тест відкриває справжнє вікно. У 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 постачається з дев'ятьма планами діапазонів — світ, три регіони ITU, а також Велика Британія, США, Канада, Японія й Австралія. 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.