Bygge från källkod · Apple silicon och Intel
Bygga på macOS
Ingen har slutfört det här bygget än. FoxSDR utvecklas på Windows och har ett Linux CI-jobb som går igenom vid varje commit. macOS har aldrig prövats. Allt på den här sidan är härlett från de faktiska byggfilerna och det fungerande Linux-receptet – men själva bygget är overifierat. Räkna med att stöta på något som den här sidan inte nämner, och berätta gärna för oss när du gör det.
Den svåra delen är redan gjord. Projektet byggs och klarar hela sin testsvit på Linux i CI, så kodvägen för andra system än Windows körs på riktigt och är inte teoretisk. Det som följer är skillnaden mellan den vägen och en Mac.
Vad du behöver
Allt utom SoapySDR och OpenSSL ingår i third_party/: GLFW 3.4, Dear ImGui, PortAudio, pffft, nlohmann/json, tweetnacl och cpp-httplib byggs alla från källkod i trädet. De medföljande GLFW och PortAudio har eget fullvärdigt stöd för macOS – Cocoa och CoreAudio – så de bör inte behöva något från dig.
xcode-select --install # Apple Clang, needs C++20
brew install cmake ninja soapysdr openssl@3
CMake 3.20 eller nyare. Projektet är C++20 med CMAKE_CXX_STANDARD_REQUIRED ON, så en gammal Xcode fallerar vid konfigureringen i stället för mystiskt senare.
På en Mac är det SoapySDR som talar med USB-radioapparater. Sedan 0.91.0 har FoxSDR egna drivrutiner för familjerna RTL-SDR, HackRF, Airspy, Mirics och RX888, men deras USB-transport finns bara för Windows (WinUSB) och Linux (usbfs): på macOS byggs det lagret som en stub som inte hittar något, så varje USB-mottagare kommer in via SoapySDR::Device::enumerate(), och de SoapySDR-moduler du installerar är de den kan använda. brew install soapyrtlsdr, soapyairspy, soapyhackrf och så vidare, efter din hårdvara. FoxSDR fungerar alldeles utmärkt utan någon av dem, med den inbyggda signalgeneratorn eller uppspelning av I/Q-filer.
Bygg
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 är den enda flagga som Linux inte behöver. macOS levereras med LibreSSL i stället för OpenSSL, och Homebrew håller medvetet openssl@3 utanför standardsökvägen, så find_package(OpenSSL REQUIRED) hittar den inte på egen hand. OpenSSL används för primitiverna för lösenordssummor och för tilläggskatalogens HTTPS-klient; Windows använder CNG och WinHTTP i stället, och därför är det inte ett beroende där.
Sedan:
ctest --test-dir build --output-on-failure
./build/cascade --selftest
Kör --selftest innan du drar slutsatsen att något fungerar. Det driver den riktiga DSP-kedjan utan gränssnitt och kontrollerar en känd spektrumtopp, så det fångar ett bygge som länkar rent, klarar sina enhetstester och räknar fram fel siffror.
Ett test öppnar ett riktigt fönster. I Linux CI kräver det Xvfb; på macOS kör du bara testerna från en vanlig inloggad grafisk session, så bör det gå bra.
Den enda patch du nästan säkert kommer att behöva
Två funktioner hittar den körbara filens egen mapp med hjälp av Linux /proc, som inte finns på macOS:
src/core/band_plan.cpp, iBandPlan::defaultDir()src/core/plugin_host.cpp, runt rad 888
Båda gör:
const fs::path link = fs::read_symlink("/proc/self/exe", ec);
På macOS misslyckas det, ec sätts, sökvägen förblir tom och båda faller tillbaka på en sökväg relativ till den aktuella mappen. Ingenting kraschar – men appen hittar inte sina bandplaner eller sina tillägg om du inte råkar starta den från byggmappen. Lösningen är en __APPLE__-gren som använder _NSGetExecutablePath, och båda filerna har redan #ifdef-strukturen att hänga den på:
#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
med #include <mach-o/dyld.h> och #include <climits> bredvid de andra plattformshuvudena. _NSGetExecutablePath kan returnera en sökväg som innehåller symboliska länkar och .., och därför är det värt att köra den genom fs::canonical.
Det finns ett test för den första – test_band_plan kontrollerar att defaultDir() slutar på bandplans och aldrig är en vanlig fil – så du får en signal i vilket fall som helst.
Vad som inte kommer att fungera, och inte är värt att jaga
- Inga kraschrapporter. Kraschhanteraren bygger på dbghelp och finns bara för Windows.
- Användningsrapporteringen är otestad. Utanför Windows skickas rapporten av samma HTTPS-avsändare som Linux-bygget använder, så ett Mac-bygge bör rapportera som Linux gör; ingen har kontrollerat det på en Mac ännu.
- Fönstret behåller sin titelrad.
src/gui/win_frame.cppimplementerar det ramlösa fönstret medWM_NCCALCSIZEochWM_NCHITTEST; hela dess kropp ligger inom#ifdef _WIN32, så den kompileras till ingenting på andra håll och fönstret ser helt enkelt normalt ut. Enbart kosmetiskt.
Inget av detta hindrar mottagaren från att fungera.
Bandplaner
0.81.0 levereras med nio bandplaner – världen, de tre ITU-regionerna samt Storbritannien, USA, Kanada, Japan och Australien. CMake placerar dem bredvid den byggda binären på varje plattform, så efter ett bygge bör du ha:
build/resources/bandplans/*.json
Välj din region i appen under Visning → Region. Om väljaren är tom eller lagret aldrig ritas är det /proc/self/exe-problemet ovan snarare än en saknad fil – kontrollera först att build/resources/bandplans/ finns.
Referens: Linux CI-receptet
.github/workflows/build.yml bygger på ubuntu-latest och är det närmaste vi har ett känt fungerande bygge för annat än Windows. Dess beroendelista översätts så här:
| 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 | finns redan i macOS SDK |
libx11-dev, libwayland-dev, libxkbcommon-dev, … | behövs inte – GLFW använder Cocoa |
libasound2-dev | behövs inte – PortAudio använder CoreAudio |
xvfb | behövs inte i en grafisk session |
Kommandona för konfigurering och bygge är i övrigt identiska.
Om du får det att fungera
Berätta för oss. Ett Mac-bygge som någon faktiskt har kört är värt mer än den här sidan, och den första som gör det förvandlar ”overifierad” till en plattform som stöds. Betaprogrammet är stället att säga det, eller skriv till [email protected].
Licens
FoxSDR är PolyForm Noncommercial – gratis för icke-kommersiell användning, och att bygga det för eget bruk ligger helt inom det. Kommersiell användning kräver en separat licens. De medföljande tredjepartskomponenterna behåller sina egna licenser, som anges i third_party/THIRD_PARTY.md.