Bouwen vanaf broncode · Apple silicon en Intel
Bouwen op macOS
Niemand heeft deze build al afgerond. FoxSDR wordt ontwikkeld op Windows en heeft een Linux-CI-job die bij elke commit slaagt. Op macOS is het nog nooit geprobeerd. Alles op deze pagina is afgeleid van de echte buildbestanden en dat werkende Linux-recept — maar de build zelf is niet geverifieerd. Reken erop dat je tegen iets aanloopt wat deze pagina niet noemt, en laat het ons weten als dat gebeurt.
Het moeilijke deel is al gedaan. Het project bouwt en doorstaat zijn volledige testsuite op Linux in CI, dus het niet-Windows-codepad wordt echt uitgevoerd en is niet alleen theoretisch. Wat volgt, is het verschil tussen dat pad en een Mac.
Wat je nodig hebt
Alles behalve SoapySDR en OpenSSL is meegeleverd in third_party/: GLFW 3.4, Dear ImGui, PortAudio, pffft, nlohmann/json, tweetnacl en cpp-httplib worden allemaal vanaf de broncode in de boom gebouwd. De meegeleverde GLFW en PortAudio hebben zelf echte macOS-ondersteuning — Cocoa en CoreAudio — dus ze zouden niets van je nodig moeten hebben.
xcode-select --install # Apple Clang, needs C++20
brew install cmake ninja soapysdr openssl@3
CMake 3.20 of nieuwer. Het project is C++20 met CMAKE_CXX_STANDARD_REQUIRED ON, dus een oude Xcode faalt al bij het configureren in plaats van op mysterieuze wijze later.
Op een Mac is SoapySDR wat met USB-radio's praat. Sinds 0.91.0 heeft FoxSDR eigen drivers voor de families RTL-SDR, HackRF, Airspy, Mirics en RX888, maar hun USB-transport bestaat alleen voor Windows (WinUSB) en Linux (usbfs): op macOS wordt die laag gebouwd als stub die niets vindt, dus elke USB-ontvanger komt binnen via SoapySDR::Device::enumerate(), en de SoapySDR-modules die je installeert, zijn wat hij kan gebruiken. brew install soapyrtlsdr, soapyairspy, soapyhackrf enzovoort, afhankelijk van je hardware. FoxSDR draait prima zonder een van die modules, met de ingebouwde signaalgenerator of het afspelen van I/Q-bestanden.
Bouwen
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 is de ene vlag die Linux niet nodig heeft. macOS levert LibreSSL in plaats van OpenSSL, en Homebrew houdt openssl@3 bewust buiten het standaardzoekpad, dus find_package(OpenSSL REQUIRED) vindt het niet vanzelf. OpenSSL wordt gebruikt voor de digestprimitieven van de wachtwoorden en voor de HTTPS-client van de plug-incatalogus; Windows gebruikt in plaats daarvan CNG en WinHTTP, en daarom is het daar geen afhankelijkheid.
Daarna:
ctest --test-dir build --output-on-failure
./build/cascade --selftest
Draai --selftest voordat je concludeert dat iets werkt. Die stuurt de echte DSP-keten headless aan en controleert een bekende piek in het spectrum, dus hij betrapt een build die netjes linkt, zijn unittests doorstaat en toch verkeerde getallen berekent.
Eén test opent een echt venster. Op Linux-CI is daar Xvfb voor nodig; op macOS draai je de tests gewoon vanuit een normale, ingelogde grafische sessie, en dan zou het goed moeten gaan.
De ene patch die je vrijwel zeker nodig hebt
Twee functies vinden de eigen map van het uitvoerbare bestand via /proc van Linux, dat op macOS niet bestaat:
src/core/band_plan.cpp, inBandPlan::defaultDir()src/core/plugin_host.cpp, rond regel 888
Beide doen:
const fs::path link = fs::read_symlink("/proc/self/exe", ec);
Op macOS mislukt dat, wordt ec gezet, blijft het pad leeg, en vallen beide terug op een pad relatief aan de huidige map. Er crasht niets — maar de app vindt zijn bandplannen en plug-ins niet, tenzij je hem toevallig vanuit de buildmap start. De oplossing is een __APPLE__-tak met _NSGetExecutablePath, en beide bestanden hebben al de #ifdef-structuur om die aan op te hangen:
#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
met #include <mach-o/dyld.h> en #include <climits> naast de andere platformheaders. _NSGetExecutablePath kan een pad teruggeven met symlinks en .., en daarom is het de moeite waard het door fs::canonical te halen.
Er is een test voor de eerste — test_band_plan controleert dat defaultDir() eindigt op bandplans en nooit een gewoon bestand is — dus je krijgt hoe dan ook een signaal.
Wat niet werkt, en niet de moeite waard is om na te jagen
- Geen crashrapporten. De crashhandler is gebouwd op dbghelp en werkt alleen op Windows.
- Gebruiksrapportage is niet getest. Buiten Windows wordt het rapport verstuurd door dezelfde HTTPS-verzender die de Linux-build gebruikt, dus een Mac-build zou moeten rapporteren zoals Linux dat doet; niemand heeft het nog op een Mac gecontroleerd.
- Het venster houdt zijn titelbalk.
src/gui/win_frame.cppimplementeert het randloze venster viaWM_NCCALCSIZEenWM_NCHITTEST; de hele inhoud staat binnen#ifdef _WIN32, dus elders compileert het tot niets en ziet het venster er gewoon normaal uit. Alleen cosmetisch.
Geen van deze dingen houdt de ontvanger tegen.
Bandplannen
0.81.0 levert negen bandplannen mee — wereld, de drie ITU-regio's, en het VK, de VS, Canada, Japan en Australië. CMake zet ze op elk platform naast het gebouwde binaire bestand, dus na een build zou je dit moeten hebben:
build/resources/bandplans/*.json
Kies je regio in de app onder Weergave → Regio. Als de keuzelijst leeg is of de laag nooit wordt getekend, is dat het /proc/self/exe-probleem hierboven en geen ontbrekend bestand — controleer eerst of build/resources/bandplans/ bestaat.
Referentie: het Linux-CI-recept
.github/workflows/build.yml bouwt op ubuntu-latest en komt het dichtst bij een bekend werkende niet-Windows-build. De lijst met afhankelijkheden vertaalt zich zo:
| 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 | zit al in de macOS-SDK |
libx11-dev, libwayland-dev, libxkbcommon-dev, … | niet nodig — GLFW gebruikt Cocoa |
libasound2-dev | niet nodig — PortAudio gebruikt CoreAudio |
xvfb | niet nodig in een grafische sessie |
De configure- en buildcommando's zijn verder identiek.
Als je het werkend krijgt
Laat het ons weten. Een Mac-build die iemand echt heeft gedraaid, is meer waard dan deze pagina, en wie dat als eerste lukt, maakt van “niet geverifieerd” een ondersteund platform. Het bètaprogramma is de plek om dat te melden, of schrijf naar [email protected].
Licentie
FoxSDR valt onder PolyForm Noncommercial — gratis voor niet-commercieel gebruik, en het voor jezelf bouwen valt daar volledig onder. Voor commercieel gebruik is een aparte licentie nodig. De meegeleverde componenten van derden behouden hun eigen licenties, vermeld in third_party/THIRD_PARTY.md.