Компилиране от изходен код · 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 SoapySDR е това, което комуникира с USB радиоустройствата. От 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.