Сборка из исходников · 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. Его список зависимостей переносится так:
| 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.