FoxSDR 0.99.39 · BETA DESCHISĂ
Traducere automată
← Înapoi la FoxSDR

Compilare din sursă · Apple silicon și Intel

Compilarea pe macOS

Nimeni nu a terminat încă această compilare. FoxSDR este dezvoltat pe Windows și are o lucrare CI pentru Linux care trece la fiecare commit. Pe macOS nu s-a încercat niciodată. Tot ce se află pe această pagină este derivat din fișierele reale de build și din acea rețetă Linux funcțională — dar compilarea în sine este neverificată. Așteptați-vă să dați peste ceva ce această pagină nu menționează și vă rugăm să ne spuneți când se întâmplă.

Partea grea este deja făcută. Proiectul se compilează și trece întreaga suită de teste pe Linux, în CI, deci calea de cod non-Windows este exersată cu adevărat, nu doar teoretic. Ce urmează este diferența dintre acea cale și un Mac.

De ce aveți nevoie

Totul, cu excepția SoapySDR și OpenSSL, este inclus în third_party/: GLFW 3.4, Dear ImGui, PortAudio, pffft, nlohmann/json, tweetnacl și cpp-httplib se compilează toate din sursă, în arbore. GLFW și PortAudio incluse au suport macOS real, propriu — Cocoa și CoreAudio — deci n-ar trebui să aibă nevoie de nimic de la dvs.

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

CMake 3.20 sau mai nou. Proiectul este C++20 cu CMAKE_CXX_STANDARD_REQUIRED ON, așa că un Xcode vechi eșuează la configurare, nu misterios, mai târziu.

Pe un Mac, SoapySDR este cel care comunică cu radiourile USB. Începând cu 0.91.0, FoxSDR are propriile drivere pentru familiile RTL-SDR, HackRF, Airspy, Mirics și RX888, dar transportul lor USB există doar pentru Windows (WinUSB) și Linux (usbfs): pe macOS acel strat se compilează ca un stub care nu găsește nimic, așa că fiecare receptor USB ajunge prin SoapySDR::Device::enumerate(), iar modulele SoapySDR pe care le instalați sunt cele pe care le poate folosi. brew install soapyrtlsdr, soapyairspy, soapyhackrf și așa mai departe, după hardware-ul dvs. FoxSDR rulează perfect și fără niciunul dintre ele, folosind generatorul de semnal încorporat sau redarea fișierelor I/Q.

Compilare

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 este singurul flag de care Linux nu are nevoie. macOS vine cu LibreSSL în loc de OpenSSL, iar Homebrew ține în mod deliberat openssl@3 în afara căii de căutare implicite, așa că find_package(OpenSSL REQUIRED) nu îl va găsi singur. OpenSSL este folosit pentru primitivele de rezumat al parolelor și pentru clientul HTTPS al catalogului de pluginuri; Windows folosește în schimb CNG și WinHTTP, motiv pentru care acolo nu este o dependență.

Apoi:

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

Rulați --selftest înainte de a concluziona că ceva funcționează. Acesta rulează lanțul DSP real fără interfață grafică și verifică un vârf de spectru cunoscut, așa că prinde un build care se leagă curat, își trece testele unitare și calculează numere greșite.

Un test deschide o fereastră reală. Pe CI-ul Linux asta necesită Xvfb; pe macOS rulați pur și simplu testele dintr-o sesiune grafică normală, cu utilizator autentificat, și ar trebui să fie în regulă.

Singurul patch de care aproape sigur veți avea nevoie

Două funcții găsesc directorul propriu al executabilului folosind /proc din Linux, care nu există pe macOS:

  • src/core/band_plan.cpp, în BandPlan::defaultDir()
  • src/core/plugin_host.cpp, în jurul liniei 888

Ambele fac:

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

Pe macOS asta eșuează, ec este setat, calea rămâne goală și ambele revin la o cale relativă la directorul curent. Nimic nu se prăbușește — dar aplicația nu își va găsi planurile de benzi sau pluginurile decât dacă o lansați întâmplător din directorul de build. Remedierea este o ramură __APPLE__ care folosește _NSGetExecutablePath, iar ambele fișiere au deja structura #ifdef de care să o agățați:

#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

cu #include <mach-o/dyld.h> și #include <climits> alături de celelalte anteturi de platformă. _NSGetExecutablePath poate returna o cale care conține legături simbolice și .., motiv pentru care merită trecută prin fs::canonical.

Există un test pentru prima — test_band_plan verifică faptul că defaultDir() se termină în bandplans și nu este niciodată un simplu fișier — deci primiți un semnal în ambele cazuri.

Ce nu va funcționa și nu merită urmărit

  • Fără rapoarte de prăbușire. Handlerul de prăbușiri este construit pe dbghelp și există doar pe Windows.
  • Raportarea utilizării nu este testată. În afara Windows, raportul este trimis de același expeditor HTTPS pe care îl folosește build-ul Linux, așa că un build pentru Mac ar trebui să raporteze la fel ca Linux; nimeni nu a verificat încă acest lucru pe un Mac.
  • Fereastra își păstrează bara de titlu. src/gui/win_frame.cpp implementează fereastra fără cadru prin WM_NCCALCSIZE și WM_NCHITTEST; întregul lui corp se află în #ifdef _WIN32, deci în altă parte se compilează în nimic, iar fereastra arată pur și simplu normal. Doar cosmetic.

Niciuna dintre acestea nu împiedică receptorul să funcționeze.

Planuri de benzi

0.81.0 include nouă planuri de benzi — mondial, cele trei regiuni ITU și Regatul Unit, SUA, Canada, Japonia și Australia. CMake le plasează lângă binarul compilat pe fiecare platformă, așa că după o compilare ar trebui să aveți:

build/resources/bandplans/*.json

Alegeți-vă regiunea în aplicație, din Afișaj → Regiune. Dacă lista de selecție este goală sau suprapunerea nu se desenează niciodată, aceasta este problema /proc/self/exe de mai sus, nu un fișier lipsă — verificați mai întâi că build/resources/bandplans/ există.

Referință: rețeta CI pentru Linux

.github/workflows/build.yml se compilează pe ubuntu-latest și este cel mai apropiat lucru de un build non-Windows cunoscut ca funcțional. Lista lui de dependențe se traduce astfel:

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-devdeja în SDK-ul macOS
libx11-dev, libwayland-dev, libxkbcommon-dev, …nu este necesar — GLFW folosește Cocoa
libasound2-devnu este necesar — PortAudio folosește CoreAudio
xvfbnu este necesar într-o sesiune grafică

În rest, comenzile de configurare și de compilare sunt identice.

Dacă reușiți să-l faceți să funcționeze

Spuneți-ne. Un build pentru Mac pe care cineva l-a rulat efectiv valorează mai mult decât această pagină, iar prima persoană care o face transformă „neverificat” într-o platformă suportată. Programul beta este locul unde să ne spuneți, sau scrieți la [email protected].

Licență

FoxSDR este PolyForm Noncommercial — gratuit pentru uz necomercial, iar compilarea lui pentru propriul uz se încadrează pe deplin în asta. Utilizarea comercială necesită o licență separată. Componentele terțe incluse își păstrează propriile licențe, listate în third_party/THIRD_PARTY.md.