Build dal sorgente · Apple silicon e Intel
Compilare su macOS
Nessuno ha ancora portato a termine questa build. FoxSDR è sviluppato su Windows e ha un job di CI Linux che passa a ogni commit. Su macOS non è mai stata tentata. Tutto ciò che è in questa pagina è derivato dai file di build reali e da quella procedura Linux funzionante — ma la build in sé non è verificata. Aspettati di incontrare qualcosa che questa pagina non menziona, e per favore diccelo quando succede.
La parte difficile è già fatta. Il progetto si compila e supera l'intera suite di test su Linux nella CI, quindi il percorso del codice non Windows viene davvero esercitato e non è solo teorico. Ciò che segue è la differenza tra quel percorso e un Mac.
Cosa ti serve
Tutto tranne SoapySDR e OpenSSL è incluso nel sorgente in third_party/: GLFW 3.4, Dear ImGui, PortAudio, pffft, nlohmann/json, tweetnacl e cpp-httplib si compilano tutti dal sorgente all'interno dell'albero. GLFW e PortAudio inclusi hanno un vero supporto macOS proprio — Cocoa e CoreAudio — quindi non dovrebbero richiederti nulla.
xcode-select --install # Apple Clang, needs C++20
brew install cmake ninja soapysdr openssl@3
CMake 3.20 o successivo. Il progetto è in C++20 con CMAKE_CXX_STANDARD_REQUIRED ON, quindi un Xcode vecchio fallisce in fase di configurazione invece che misteriosamente più tardi.
Su un Mac, è SoapySDR a parlare con le radio USB. Dalla 0.91.0 FoxSDR ha i propri driver per le famiglie RTL-SDR, HackRF, Airspy, Mirics e RX888, ma il loro trasporto USB esiste solo per Windows (WinUSB) e Linux (usbfs): su macOS quello strato si compila come uno stub che non trova nulla, quindi ogni ricevitore USB arriva tramite SoapySDR::Device::enumerate() e i moduli SoapySDR che installi sono ciò che può usare. brew install soapyrtlsdr, soapyairspy, soapyhackrf e così via, secondo il tuo hardware. FoxSDR funziona perfettamente anche senza nessuno di essi, usando il generatore di segnale integrato o la riproduzione di file I/Q.
Build
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 è l'unico flag che su Linux non serve. macOS include LibreSSL invece di OpenSSL, e Homebrew tiene di proposito openssl@3 fuori dal percorso di ricerca predefinito, quindi find_package(OpenSSL REQUIRED) non lo troverà da solo. OpenSSL è usato per le primitive di digest delle password e per il client HTTPS del catalogo dei plugin; Windows usa invece CNG e WinHTTP, ed è per questo che lì non è una dipendenza.
Poi:
ctest --test-dir build --output-on-failure
./build/cascade --selftest
Esegui --selftest prima di concludere che qualcosa funziona. Fa girare la vera catena DSP senza interfaccia grafica e verifica un picco di spettro noto, quindi intercetta una build che si collega senza errori, supera i test unitari e calcola numeri sbagliati.
Un test apre una finestra vera. Nella CI Linux serve Xvfb; su macOS basta eseguire i test da una normale sessione grafica con accesso effettuato e dovrebbe andare bene.
L'unica patch che quasi certamente ti servirà
Due funzioni trovano la cartella dell'eseguibile stesso usando /proc di Linux, che su macOS non esiste:
src/core/band_plan.cpp, inBandPlan::defaultDir()src/core/plugin_host.cpp, intorno alla riga 888
Entrambe fanno:
const fs::path link = fs::read_symlink("/proc/self/exe", ec);
Su macOS questa chiamata fallisce, ec viene impostato, il percorso resta vuoto ed entrambe ripiegano su un percorso relativo alla cartella corrente. Nulla va in crash — ma l'app non troverà i suoi piani delle bande né i suoi plugin a meno che tu non la avvii dalla cartella di build. La correzione è un ramo __APPLE__ che usa _NSGetExecutablePath, ed entrambi i file hanno già la struttura #ifdef a cui agganciarlo:
#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
con #include <mach-o/dyld.h> e #include <climits> insieme agli altri header di piattaforma. _NSGetExecutablePath può restituire un percorso che contiene link simbolici e .., ed è per questo che vale la pena passarlo attraverso fs::canonical.
C'è un test per la prima — test_band_plan verifica che defaultDir() termini con bandplans e non sia mai un semplice file — quindi hai un segnale in entrambi i casi.
Cosa non funzionerà, e non vale la pena inseguire
- Nessun rapporto di crash. Il gestore dei crash è basato su dbghelp ed è solo per Windows.
- I rapporti di utilizzo non sono testati. Fuori da Windows il rapporto viene inviato dallo stesso mittente HTTPS usato dalla build Linux, quindi una build per Mac dovrebbe riportare come fa Linux; nessuno l'ha ancora verificato su un Mac.
- La finestra mantiene la barra del titolo.
src/gui/win_frame.cppimplementa la finestra senza cornice tramiteWM_NCCALCSIZEeWM_NCHITTEST; tutto il suo corpo sta dentro#ifdef _WIN32, quindi altrove si compila in nulla e la finestra appare semplicemente normale. Solo una questione estetica.
Nessuna di queste cose impedisce al ricevitore di funzionare.
Piani delle bande
0.81.0 include nove piani delle bande — mondo, le tre regioni ITU, e Regno Unito, Stati Uniti, Canada, Giappone e Australia. CMake li colloca accanto al binario compilato su ogni piattaforma, quindi dopo una build dovresti avere:
build/resources/bandplans/*.json
Scegli la tua regione nell'app in Display → Regione. Se il selettore è vuoto o la sovrapposizione non viene mai disegnata, è il problema di /proc/self/exe descritto sopra e non un file mancante — controlla prima che build/resources/bandplans/ esista.
Riferimento: la procedura della CI Linux
.github/workflows/build.yml compila su ubuntu-latest ed è la cosa più vicina a una build non Windows notoriamente funzionante. Il suo elenco di dipendenze si traduce così:
| 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 | già nell'SDK di macOS |
libx11-dev, libwayland-dev, libxkbcommon-dev, … | non serve — GLFW usa Cocoa |
libasound2-dev | non serve — PortAudio usa CoreAudio |
xvfb | non serve in una sessione grafica |
Per il resto i comandi di configurazione e di build sono identici.
Se riesci a farlo funzionare
Diccelo. Una build per Mac che qualcuno ha davvero eseguito vale più di questa pagina, e la prima persona che ci riesce trasforma «non verificato» in una piattaforma supportata. Il programma beta è il posto dove dirlo, oppure scrivi a [email protected].
Licenza
FoxSDR è PolyForm Noncommercial — gratuito per l'uso non commerciale, e compilarlo per te rientra pienamente in questo. L'uso commerciale richiede una licenza separata. I componenti di terze parti inclusi mantengono le proprie licenze, elencate in third_party/THIRD_PARTY.md.