Build aus dem Quellcode · Apple Silicon und Intel
Build unter macOS
Noch niemand hat diesen Build fertiggestellt. FoxSDR wird unter Windows entwickelt und hat einen Linux-CI-Job, der bei jedem Commit besteht. macOS wurde noch nie versucht. Alles auf dieser Seite ist aus den tatsächlichen Build-Dateien und dem funktionierenden Linux-Rezept abgeleitet — aber der Build selbst ist unverifiziert. Rechnen Sie damit, auf etwas zu stoßen, das diese Seite nicht erwähnt, und sagen Sie uns bitte Bescheid, wenn es so weit ist.
Der schwierige Teil ist schon erledigt. Das Projekt baut und besteht seine vollständige Testsuite unter Linux in der CI, der Nicht-Windows-Codepfad wird also tatsächlich durchlaufen und ist nicht nur theoretisch. Was folgt, ist der Unterschied zwischen diesem Pfad und einem Mac.
Was Sie brauchen
Alles außer SoapySDR und OpenSSL ist in third_party/ mitgeliefert: GLFW 3.4, Dear ImGui, PortAudio, pffft, nlohmann/json, tweetnacl und cpp-httplib werden alle im Quellbaum aus dem Quellcode gebaut. Das mitgelieferte GLFW und PortAudio haben eigene, echte macOS-Unterstützung — Cocoa und CoreAudio —, sollten also nichts von Ihnen brauchen.
xcode-select --install # Apple Clang, needs C++20
brew install cmake ninja soapysdr openssl@3
CMake 3.20 oder neuer. Das Projekt ist C++20 mit CMAKE_CXX_STANDARD_REQUIRED ON, daher scheitert ein altes Xcode schon beim Konfigurieren statt später auf rätselhafte Weise.
Auf einem Mac spricht SoapySDR mit den USB-SDRs. Seit 0.91.0 bringt FoxSDR eigene Treiber für die Familien RTL-SDR, HackRF, Airspy, Mirics und RX888 mit, aber deren USB-Transport gibt es nur für Windows (WinUSB) und Linux (usbfs): Unter macOS wird diese Schicht als Stub gebaut, der nichts findet, daher kommt jeder USB-Empfänger über SoapySDR::Device::enumerate(), und die SoapySDR-Module, die Sie installieren, bestimmen, was es verwenden kann. brew install soapyrtlsdr, soapyairspy, soapyhackrf und so weiter, je nach Ihrer Hardware. FoxSDR läuft auch ganz ohne sie einwandfrei, mit dem eingebauten Signalgenerator oder der Wiedergabe von I/Q-Dateien.
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 ist das eine Flag, das Linux nicht braucht. macOS liefert LibreSSL statt OpenSSL, und Homebrew hält openssl@3 absichtlich aus dem Standardsuchpfad heraus, daher findet find_package(OpenSSL REQUIRED) es nicht von allein. OpenSSL wird für die Primitive des Passwort-Hashes und für den HTTPS-Client des Plugin-Katalogs verwendet; Windows nutzt stattdessen CNG und WinHTTP, weshalb es dort keine Abhängigkeit ist.
Dann:
ctest --test-dir build --output-on-failure
./build/cascade --selftest
Führen Sie --selftest aus, bevor Sie irgendetwas für funktionierend halten. Es treibt die echte DSP-Kette ohne Oberfläche an und prüft eine bekannte Spektrumspitze, erwischt also einen Build, der sauber linkt, seine Unit-Tests besteht und trotzdem falsche Zahlen berechnet.
Ein Test öffnet ein echtes Fenster. In der Linux-CI braucht das Xvfb; unter macOS führen Sie die Tests einfach aus einer normalen, angemeldeten GUI-Sitzung aus, dann sollte es passen.
Der eine Patch, den Sie fast sicher brauchen werden
Zwei Funktionen ermitteln das Verzeichnis der eigenen ausführbaren Datei über /proc von Linux, das es unter macOS nicht gibt:
src/core/band_plan.cpp, inBandPlan::defaultDir()src/core/plugin_host.cpp, etwa Zeile 888
Beide tun Folgendes:
const fs::path link = fs::read_symlink("/proc/self/exe", ec);
Unter macOS schlägt das fehl, ec wird gesetzt, der Pfad bleibt leer, und beide fallen auf einen Pfad relativ zum aktuellen Verzeichnis zurück. Nichts stürzt ab — aber die App findet ihre Bandpläne und Plugins nicht, sofern Sie sie nicht zufällig aus dem Build-Verzeichnis starten. Die Lösung ist ein __APPLE__-Zweig mit _NSGetExecutablePath, und beide Dateien haben bereits die #ifdef-Struktur, in die er sich einhängen lässt:
#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
mit #include <mach-o/dyld.h> und #include <climits> neben den anderen Plattform-Headern. _NSGetExecutablePath kann einen Pfad zurückgeben, der Symlinks und .. enthält, deshalb lohnt es sich, ihn durch fs::canonical zu schicken.
Für die erste gibt es einen Test — test_band_plan prüft, dass defaultDir() auf bandplans endet und nie eine einfache Datei ist —, sodass Sie so oder so ein Signal bekommen.
Was nicht funktionieren wird und die Mühe nicht lohnt
- Keine Absturzberichte. Der Absturzhandler baut auf dbghelp auf und ist nur für Windows.
- Nutzungsberichte sind ungetestet. Außerhalb von Windows wird der Bericht vom selben HTTPS-Sender verschickt, den der Linux-Build verwendet, daher sollte ein Mac-Build genauso melden wie Linux; auf einem Mac hat das noch niemand geprüft.
- Das Fenster behält seine Titelleiste.
src/gui/win_frame.cppimplementiert das rahmenlose Fenster überWM_NCCALCSIZEundWM_NCHITTEST; sein gesamter Rumpf steht innerhalb von#ifdef _WIN32, kompiliert anderswo also zu nichts, und das Fenster sieht einfach normal aus. Rein kosmetisch.
Nichts davon hindert den Empfänger am Funktionieren.
Bandpläne
0.81.0 bringt neun Bandpläne mit — Welt, die drei ITU-Regionen sowie Vereinigtes Königreich, USA, Kanada, Japan und Australien. CMake legt sie auf jeder Plattform neben die gebaute Binärdatei, nach einem Build sollten Sie also Folgendes haben:
build/resources/bandplans/*.json
Wählen Sie Ihre Region in der App unter Anzeige → Region. Ist die Auswahl leer oder wird die Ebene nie gezeichnet, ist das das /proc/self/exe-Problem von oben und keine fehlende Datei — prüfen Sie zuerst, ob build/resources/bandplans/ existiert.
Referenz: das Linux-CI-Rezept
.github/workflows/build.yml baut auf ubuntu-latest und ist das, was einem bekanntermaßen funktionierenden Nicht-Windows-Build am nächsten kommt. Seine Abhängigkeitsliste übersetzt sich so:
| 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 | bereits im macOS-SDK |
libx11-dev, libwayland-dev, libxkbcommon-dev, … | nicht nötig — GLFW nutzt Cocoa |
libasound2-dev | nicht nötig — PortAudio nutzt CoreAudio |
xvfb | in einer GUI-Sitzung nicht nötig |
Konfigurations- und Build-Befehle sind ansonsten identisch.
Wenn Sie es zum Laufen bringen
Sagen Sie es uns. Ein Mac-Build, den jemand tatsächlich ausgeführt hat, ist mehr wert als diese Seite, und die erste Person, der es gelingt, macht aus „unverifiziert“ eine unterstützte Plattform. Das Beta-Programm ist der richtige Ort, um das zu sagen, oder schreiben Sie an [email protected].
Lizenz
FoxSDR steht unter PolyForm Noncommercial — kostenlos für nichtkommerzielle Nutzung, und es für sich selbst zu bauen, fällt eindeutig darunter. Kommerzielle Nutzung erfordert eine separate Lizenz. Die mitgelieferten Komponenten Dritter behalten ihre eigenen Lizenzen, aufgeführt in third_party/THIRD_PARTY.md.