Збирання з вихідного коду · 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. Його список залежностей перекладається так:
| Linux | macOS |
|---|---|
build-essential | Xcode Command Line Tools |
cmake ninja-build | brew install cmake ninja |
libsoapysdr-dev | brew install soapysdr |
libssl-dev | brew 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.