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, faileBandPlan::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ą perWM_NCCALCSIZEirWM_NCHITTEST; visas jo turinys yra#ifdef _WIN32viduje, 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:
| 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 | jau yra macOS SDK |
libx11-dev, libwayland-dev, libxkbcommon-dev, … | nereikia — GLFW naudoja Cocoa |
libasound2-dev | nereikia — PortAudio naudoja CoreAudio |
xvfb | nereikia 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.