FoxSDR 0.99.39 · ODPRTA BETA
Strojni prevod
← Nazaj na FoxSDR

Gradnja iz izvorne kode · Apple silicon in Intel

Gradnja v sistemu macOS

Te gradnje še nihče ni dokončal. FoxSDR se razvija v sistemu Windows in ima opravilo Linux CI, ki uspe ob vsakem commitu. Za macOS še nikoli ni bilo poskusa. Vse na tej strani je izpeljano iz dejanskih datotek za gradnjo in tega delujočega recepta za Linux – sama gradnja pa je nepreverjena. Pričakujte, da boste naleteli na nekaj, česar ta stran ne omenja, in nam to prosim sporočite.

Težji del je že opravljen. Projekt se zgradi in opravi celoten nabor testov v Linuxu v CI, zato je pot kode zunaj Windows dejansko preizkušena in ne le teoretična. V nadaljevanju je razlika med to potjo in Macom.

Kaj potrebujete

Vse razen SoapySDR in OpenSSL je vključeno v third_party/: GLFW 3.4, Dear ImGui, PortAudio, pffft, nlohmann/json, tweetnacl in cpp-httplib se vsi zgradijo iz izvorne kode v drevesu. Vključena GLFW in PortAudio imata vsak svojo pravo podporo za macOS – Cocoa in CoreAudio – zato od vas ne bi smela potrebovati ničesar.

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

CMake 3.20 ali novejši. Projekt je C++20 z CMAKE_CXX_STANDARD_REQUIRED ON, zato star Xcode odpove že pri konfiguraciji in ne skrivnostno pozneje.

Na Macu se z radii USB pogovarja SoapySDR. Od 0.91.0 ima FoxSDR lastne gonilnike za družine RTL-SDR, HackRF, Airspy, Mirics in RX888, vendar njihov transport USB obstaja samo za Windows (WinUSB) in Linux (usbfs): v sistemu macOS se ta plast zgradi kot nadomestek, ki ne najde ničesar, zato vsak sprejemnik USB pride prek SoapySDR::Device::enumerate(), uporabi pa lahko tiste module SoapySDR, ki jih namestite. brew install soapyrtlsdr, soapyairspy, soapyhackrf in tako naprej, kakor ustreza vaši strojni opremi. FoxSDR odlično deluje tudi brez vseh njih, z vgrajenim generatorjem signala ali predvajanjem datotek I/Q.

Gradnja

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 edina zastavica, ki je Linux ne potrebuje. macOS priloži LibreSSL namesto OpenSSL, Homebrew pa openssl@3 namerno drži zunaj privzete iskalne poti, zato ga find_package(OpenSSL REQUIRED) sam od sebe ne bo našel. OpenSSL se uporablja za primitive izvlečkov gesel in za odjemalca HTTPS kataloga vtičnikov; Windows namesto tega uporablja CNG in WinHTTP, zato tam ni odvisnost.

Nato:

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

Zaženite --selftest, preden sklepate, da karkoli deluje. Brez grafičnega vmesnika požene pravo verigo DSP in preveri znan vrh spektra, zato ujame gradnjo, ki se čisto poveže, opravi teste enot in računa napačne številke.

En test odpre pravo okno. V Linux CI to potrebuje Xvfb; v sistemu macOS teste preprosto zaženite iz običajne prijavljene seje z grafičnim vmesnikom in bi moralo biti v redu.

Edini popravek, ki ga boste skoraj zagotovo potrebovali

Dve funkciji najdeta lastno mapo izvršljive datoteke z Linuxovim /proc, ki v sistemu macOS ne obstaja:

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

Obe naredita:

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

V sistemu macOS to odpove, ec je nastavljen, pot ostane prazna in obe se zatečeta k poti, relativni glede na trenutno mapo. Nič se ne sesuje – vendar aplikacija ne bo našla svojih pasovnih načrtov ali vtičnikov, razen če jo po naključju zaženete iz mape za gradnjo. Popravek je veja __APPLE__, ki uporablja _NSGetExecutablePath, obe datoteki pa že imata strukturo #ifdef, na katero jo lahko obesite:

#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

z #include <mach-o/dyld.h> in #include <climits> ob drugih glavah za platforme. _NSGetExecutablePath lahko vrne pot, ki vsebuje simbolne povezave in .., zato jo je vredno prepeljati skozi fs::canonical.

Za prvo obstaja test – test_band_plan preveri, da se defaultDir() konča z bandplans in nikoli ni navadna datoteka – zato dobite signal v vsakem primeru.

Kaj ne bo delovalo in se tega ne splača loviti

  • Ni poročil o sesutju. Obravnavalnik sesutij temelji na dbghelp in je samo za Windows.
  • Poročanje o uporabi ni preizkušeno. Zunaj sistema Windows poročilo pošilja isti pošiljatelj HTTPS, ki ga uporablja gradnja za Linux, zato bi gradnja za Mac morala poročati tako kot Linux; na Macu tega še nihče ni preveril.
  • Okno ohrani naslovno vrstico. src/gui/win_frame.cpp izvede okno brez okvirja prek WM_NCCALCSIZE in WM_NCHITTEST; njegovo celotno telo je znotraj #ifdef _WIN32, zato se drugje prevede v nič in okno je preprosto videti običajno. Samo kozmetično.

Nič od tega ne ustavi delovanja sprejemnika.

Pasovni načrti

0.81.0 priloži devet pasovnih načrtov – svet, tri regije ITU ter Združeno kraljestvo, ZDA, Kanado, Japonsko in Avstralijo. CMake jih na vsaki platformi postavi poleg zgrajene izvršljive datoteke, zato bi morali po gradnji imeti:

build/resources/bandplans/*.json

Svojo regijo izberite v aplikaciji pod Prikaz → Regija. Če je izbirnik prazen ali se prekrivna plast nikoli ne izriše, je to zgoraj opisana težava /proc/self/exe in ne manjkajoča datoteka – najprej preverite, ali build/resources/bandplans/ obstaja.

Referenca: recept za Linux CI

.github/workflows/build.yml gradi na ubuntu-latest in je najbližje znano delujoči gradnji zunaj Windows. Njegov seznam odvisnosti se prevede takole:

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-devže v macOS SDK
libx11-dev, libwayland-dev, libxkbcommon-dev, …ni potrebno – GLFW uporablja Cocoa
libasound2-devni potrebno – PortAudio uporablja CoreAudio
xvfbni potrebno v seji z grafičnim vmesnikom

Ukazi za konfiguracijo in gradnjo so sicer enaki.

Če vam uspe

Povejte nam. Gradnja za Mac, ki jo je nekdo zares pognal, je vredna več kot ta stran, in prvi, ki mu to uspe, spremeni „nepreverjeno“ v podprto platformo. To lahko sporočite v programu bete ali pišete na [email protected].

Licenca

FoxSDR je pod licenco PolyForm Noncommercial – brezplačen za nekomercialno uporabo, gradnja zase pa je povsem znotraj tega. Komercialna uporaba potrebuje ločeno licenco. Vključene komponente tretjih oseb ohranijo svoje licence, navedene v third_party/THIRD_PARTY.md.