FoxSDR 0.99.39 · ATVIRA BETA
Mašininis vertimas
← Atgal į FoxSDR

Kompiliavimas iš išeitinio kodo · Apple silicon ir Intel

Kompiliavimas macOS

Niekas dar nėra užbaigęs šio kompiliavimo. FoxSDR kuriama Windows sistemoje ir turi Linux CI užduotį, kuri praeina su kiekvienu įsipareigojimu. macOS dar niekada nebandyta. Viskas šiame puslapyje išvesta iš tikrųjų kompiliavimo failų ir to veikiančio Linux recepto, — bet pats kompiliavimas yra nepatikrintas. Tikėkitės susidurti su kažkuo, ko šis puslapis nemini, ir, kai taip nutiks, praneškite mums.

Sunkiausia dalis jau atlikta. Projektas kompiliuojamas ir praeina visą savo testų rinkinį Linux CI aplinkoje, todėl ne Windows kodo kelias iš tikrųjų išbandytas, o ne teorinis. Toliau aprašomas skirtumas tarp to kelio ir Mac.

Ko jums reikia

Viskas, išskyrus SoapySDR ir OpenSSL, yra įtraukta į projektą kataloge third_party/: GLFW 3.4, Dear ImGui, PortAudio, pffft, nlohmann/json, tweetnacl ir cpp-httplib — visi kompiliuojami iš išeitinio kodo medyje. Įtraukti GLFW ir PortAudio patys tikrai palaiko macOS — Cocoa ir CoreAudio, — todėl iš jūsų jiems nieko neturėtų prireikti.

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

CMake 3.20 ar naujesnė. Projektas parašytas C++20 su CMAKE_CXX_STANDARD_REQUIRED ON, todėl sena Xcode versija sugrius konfigūravimo metu, o ne paslaptingai vėliau.

Mac kompiuteryje su USB SDR bendrauja SoapySDR. Nuo 0.91.0 FoxSDR turi savas tvarkykles RTL-SDR, HackRF, Airspy, Mirics ir RX888 šeimoms, bet jų USB perdavimo sluoksnis egzistuoja tik Windows (WinUSB) ir Linux (usbfs): macOS šis sluoksnis kompiliuojamas kaip tuščias kamštis, kuris nieko neranda, todėl kiekvienas USB imtuvas pasiekiamas per SoapySDR::Device::enumerate(), ir naudoti galima tuos SoapySDR modulius, kuriuos įdiegiate. brew install soapyrtlsdr, soapyairspy, soapyhackrf ir t. t., pagal jūsų aparatūrą. FoxSDR puikiai veikia ir be jų, naudodama įtaisytą signalų generatorių arba I/Q failų atkūrimą.

Kompiliavimas

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 — vienintelė vėliavėlė, kurios nereikia Linux. macOS pateikiama su LibreSSL, o ne OpenSSL, o Homebrew sąmoningai laiko openssl@3 už numatytojo paieškos kelio ribų, todėl find_package(OpenSSL REQUIRED) pats jo neras. OpenSSL naudojamas slaptažodžių maišos primityvams ir papildinių katalogo HTTPS klientui; Windows vietoj to naudoja CNG ir WinHTTP, todėl ten tai nėra priklausomybė.

Tada:

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

Prieš darydami bet kokias išvadas, kad kažkas veikia, paleiskite --selftest. Jis be ekrano paleidžia tikrą DSP grandinę ir tikrina žinomą spektro smailę, todėl sugauna leidimą, kuris švariai susisaistė, praeina vienetų testus, bet skaičiuoja neteisingus skaičius.

Vienas testas atveria tikrą langą. Linux CI aplinkoje tam reikia Xvfb; macOS tiesiog paleiskite testus iš įprasto grafinio seanso su prisijungusiu naudotoju, ir viskas turėtų būti gerai.

Vienintelė pataisa, kurios jums beveik neabejotinai prireiks

Dvi funkcijos vykdomojo failo katalogą randa naudodamos Linux /proc, kurio macOS nėra:

  • src/core/band_plan.cpp, faile BandPlan::defaultDir()
  • src/core/plugin_host.cpp, maždaug ties eilute 888

Abi daro taip:

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

macOS tai nepavyksta, nustatoma ec, kelias lieka tuščias, ir abi grįžta prie kelio, santykinio su dabartiniu katalogu. Niekas nesugriūva — bet programa neras savo juostų planų ir papildinių, nebent atsitiktinai ją paleisite iš kompiliavimo katalogo. Pataisa — __APPLE__ šaka, naudojanti _NSGetExecutablePath, o abiejuose failuose jau yra #ifdef struktūra, prie kurios ją galima prikabinti:

#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

su #include <mach-o/dyld.h> ir #include <climits> šalia kitų platformų antraščių. _NSGetExecutablePath gali grąžinti kelią su simbolinėmis nuorodomis ir .., todėl verta jį praleisti per fs::canonical.

Pirmajai yra testas — test_band_plan tikrina, kad defaultDir() baigiasi bandplans ir niekada nėra paprastas failas, — todėl signalą gausite bet kuriuo atveju.

Kas neveiks ir ko neverta vaikytis

  • Jokių strigčių ataskaitų. Strigčių tvarkyklė sukurta su dbghelp ir veikia tik Windows.
  • Naudojimo ataskaitos neišbandytos. Ne Windows sistemose ataskaitą siunčia tas pats HTTPS siuntėjas, kurį naudoja Linux leidimas, todėl Mac leidimas turėtų pranešti taip pat kaip Linux; niekas to Mac kompiuteryje dar nepatikrino.
  • Langas išlaiko savo pavadinimo juostą. src/gui/win_frame.cpp įgyvendina berėmį langą per WM_NCCALCSIZE ir WM_NCHITTEST; visas jo turinys yra #ifdef _WIN32 viduje, todėl kitur jis sukompiliuojamas į nieką, o langas tiesiog atrodo įprastai. Tik kosmetinis dalykas.

Nė vienas iš šių dalykų netrukdo imtuvui veikti.

Juostų planai

Nuo versijos 0.81.0 pateikiami devyni juostų planai — pasaulio, trijų ITU regionų ir JK, JAV, Kanados, Japonijos bei Australijos. CMake juos padeda šalia sukompiliuoto dvejetainio failo kiekvienoje platformoje, todėl po kompiliavimo turėtumėte turėti:

build/resources/bandplans/*.json

Savo regioną programoje pasirinkite skiltyje Ekranas → Regionas. Jei parinkiklis tuščias arba perdanga niekada nepiešiama, tai aukščiau aprašyta /proc/self/exe problema, o ne trūkstamas failas — pirmiausia patikrinkite, ar build/resources/bandplans/ egzistuoja.

Etalonas: Linux CI receptas

.github/workflows/build.yml kompiliuoja ubuntu-latest aplinkoje ir yra artimiausias žinomai veikiančiam ne Windows kompiliavimui. Jo priklausomybių sąrašas atitinka taip:

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-devjau yra macOS SDK
libx11-dev, libwayland-dev, libxkbcommon-dev, …nereikia — GLFW naudoja Cocoa
libasound2-devnereikia — PortAudio naudoja CoreAudio
xvfbnereikia grafiniame seanse

Kitu atžvilgiu konfigūravimo ir kompiliavimo komandos identiškos.

Jei jums pavyks

Praneškite mums. Mac leidimas, kurį kažkas iš tikrųjų paleido, vertingesnis už šį puslapį, o pirmasis tai padaręs žmogus pavers „nepatikrinta“ palaikoma platforma. Apie tai praneškite beta programoje arba parašykite adresu [email protected].

Licencija

FoxSDR licencijuojama pagal PolyForm Noncommercial — nemokama nekomerciniam naudojimui, o susikompiliuoti ją sau visiškai atitinka šias sąlygas. Komerciniam naudojimui reikia atskiros licencijos. Įtraukti trečiųjų šalių komponentai išlaiko savo licencijas, išvardytas third_party/THIRD_PARTY.md.