FoxSDR 0.99.39 · OTVORENÁ BETA
Strojový preklad
← Späť na FoxSDR

Zostavenie zo zdrojového kódu · Apple silicon a Intel

Zostavenie na macOS

Túto zostavu ešte nikto nedokončil. FoxSDR sa vyvíja na Windows a má linuxovú úlohu CI, ktorá prechádza pri každom commite. macOS sa ešte nikto nepokúsil. Všetko na tejto stránke je odvodené zo skutočných súborov zostavy a z funkčného linuxového receptu – ale samotné zostavenie je neoverené. Počítajte s tým, že narazíte na niečo, čo táto stránka nespomína, a prosím, dajte nám vedieť, keď sa tak stane.

Ťažká časť je už hotová. Projekt sa na Linuxe v CI zostaví a prejde celou sadou testov, takže cesta kódu mimo Windows je naozaj vyskúšaná, nie teoretická. Nasleduje rozdiel medzi touto cestou a Macom.

Čo potrebujete

Všetko okrem SoapySDR a OpenSSL je pribalené v third_party/: GLFW 3.4, Dear ImGui, PortAudio, pffft, nlohmann/json, tweetnacl a cpp-httplib sa zostavujú zo zdrojového kódu priamo v strome. Pribalené GLFW a PortAudio majú vlastnú skutočnú podporu macOS – Cocoa a CoreAudio –, takže by od vás nemali nič potrebovať.

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

CMake 3.20 alebo novší. Projekt je v C++20 s CMAKE_CXX_STANDARD_REQUIRED ON, takže staré Xcode zlyhá už pri konfigurácii, a nie záhadne neskôr.

Na Macu komunikuje s USB rádiami SoapySDR. Od verzie 0.91.0 má FoxSDR vlastné ovládače pre rodiny RTL-SDR, HackRF, Airspy, Mirics a RX888, ale ich USB prenos existuje len pre Windows (WinUSB) a Linux (usbfs): na macOS sa táto vrstva zostaví ako prázdny stub, ktorý nič nenájde, takže každý USB prijímač prichádza cez SoapySDR::Device::enumerate() a použiť sa dá to, aké moduly SoapySDR si nainštalujete. brew install soapyrtlsdr, soapyairspy, soapyhackrf a tak ďalej, podľa vášho hardvéru. FoxSDR funguje úplne dobre aj bez nich, so vstavaným generátorom signálu alebo prehrávaním I/Q súborov.

Zostavenie

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 je jediný príznak, ktorý Linux nepotrebuje. macOS obsahuje LibreSSL namiesto OpenSSL a Homebrew zámerne drží openssl@3 mimo predvolenej cesty vyhľadávania, takže find_package(OpenSSL REQUIRED) ho sám nenájde. OpenSSL sa používa na primitíva hashovania hesiel a pre HTTPS klienta katalógu pluginov; Windows namiesto toho používa CNG a WinHTTP, a preto tam nie je závislosťou.

Potom:

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

Spustite --selftest skôr, než usúdite, že čokoľvek funguje. Poháňa skutočný reťazec DSP bez grafického rozhrania a overuje známu špičku spektra, takže odhalí zostavu, ktorá sa čisto zlinkuje, prejde jednotkovými testami a počíta nesprávne čísla.

Jeden test otvára skutočné okno. V linuxovom CI to potrebuje Xvfb; na macOS jednoducho spustite testy z bežnej prihlásenej grafickej relácie a malo by to byť v poriadku.

Jediná záplata, ktorú budete takmer určite potrebovať

Dve funkcie hľadajú priečinok vlastného spustiteľného súboru pomocou linuxového /proc, ktorý na macOS neexistuje:

  • src/core/band_plan.cpp, v BandPlan::defaultDir()
  • src/core/plugin_host.cpp, okolo riadku 888

Obe robia:

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

Na macOS to zlyhá, nastaví sa ec, cesta zostane prázdna a obe sa vrátia k ceste relatívnej voči aktuálnemu priečinku. Nič nespadne – ale aplikácia nenájde svoje pásmové plány ani pluginy, pokiaľ ju náhodou nespustíte z priečinka zostavy. Opravou je vetva __APPLE__ s použitím _NSGetExecutablePath a oba súbory už majú štruktúru #ifdef, na ktorú ju možno zavesiť:

#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

s #include <mach-o/dyld.h> a #include <climits> vedľa ostatných hlavičiek pre platformy. _NSGetExecutablePath môže vrátiť cestu obsahujúcu symbolické odkazy a .., a preto sa oplatí prehnať ju cez fs::canonical.

Pre prvú z nich existuje test – test_band_plan overuje, že defaultDir() končí na bandplans a nikdy nie je obyčajným súborom –, takže signál dostanete tak či onak.

Čo nebude fungovať a nestojí za to naháňať

  • Žiadne hlásenia o pádoch. Obsluha pádov je postavená na dbghelp a je len pre Windows.
  • Hlásenia o používaní nie sú otestované. Mimo Windows hlásenie posiela ten istý HTTPS odosielač, aký používa zostava pre Linux, takže zostava pre Mac by mala hlásiť rovnako ako Linux; na Macu to však zatiaľ nikto neoveril.
  • Okno si ponechá záhlavie. src/gui/win_frame.cpp implementuje okno bez rámu cez WM_NCCALCSIZE a WM_NCHITTEST; celé jeho telo je vnútri #ifdef _WIN32, takže inde sa skompiluje na nič a okno jednoducho vyzerá normálne. Len kozmetická vec.

Nič z toho nebráni prijímaču vo fungovaní.

Pásmové plány

Verzia 0.81.0 obsahuje deväť pásmových plánov – svet, tri oblasti ITU a Spojené kráľovstvo, USA, Kanadu, Japonsko a Austráliu. CMake ich na každej platforme umiestni vedľa zostaveného binárneho súboru, takže po zostavení by ste mali mať:

build/resources/bandplans/*.json

Svoju oblasť si vyberte v aplikácii v Zobrazenie → Oblasť. Ak je výber prázdny alebo sa vrstva nikdy nevykreslí, ide o problém s /proc/self/exe opísaný vyššie, nie o chýbajúci súbor – najprv skontrolujte, či build/resources/bandplans/ existuje.

Referencia: recept z linuxového CI

.github/workflows/build.yml sa zostavuje na ubuntu-latest a je najbližšie k overenej zostave mimo Windows. Jeho zoznam závislostí sa prekladá takto:

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-devuž je v macOS SDK
libx11-dev, libwayland-dev, libxkbcommon-dev, …nie je potrebné – GLFW používa Cocoa
libasound2-devnie je potrebné – PortAudio používa CoreAudio
xvfbnie je potrebné v grafickej relácii

Príkazy na konfiguráciu a zostavenie sú inak totožné.

Ak to rozbeháte

Dajte nám vedieť. Zostava pre Mac, ktorú niekto naozaj spustil, má väčšiu cenu než táto stránka a prvý človek, ktorý to dokáže, zmení „neoverené“ na podporovanú platformu. Povedať to môžete v beta programe alebo napíšte na [email protected].

Licencia

FoxSDR je pod licenciou PolyForm Noncommercial – zadarmo na nekomerčné použitie a zostavenie pre vlastnú potrebu do toho jednoznačne patrí. Komerčné použitie vyžaduje samostatnú licenciu. Pribalené komponenty tretích strán si zachovávajú vlastné licencie, uvedené v third_party/THIRD_PARTY.md.