Kompilacja ze źródeł · Apple silicon i Intel
Kompilacja na macOS
Nikt jeszcze nie ukończył tej kompilacji. FoxSDR jest rozwijany na Windows i ma zadanie Linux CI, które przechodzi przy każdym commicie. Na macOS nigdy tego nie próbowano. Wszystko na tej stronie wyprowadzono z faktycznych plików kompilacji i działającego przepisu dla Linux – ale sama kompilacja jest niezweryfikowana. Spodziewaj się czegoś, o czym ta strona nie wspomina, i daj nam znać, gdy na to trafisz.
Najtrudniejsza część jest już zrobiona. Projekt kompiluje się i przechodzi pełen zestaw testów na Linux w CI, więc ścieżka kodu spoza Windows jest faktycznie sprawdzana, a nie teoretyczna. To, co następuje, to różnica między tą ścieżką a Makiem.
Czego potrzebujesz
Wszystko poza SoapySDR i OpenSSL jest dołączone w third_party/: GLFW 3.4, Dear ImGui, PortAudio, pffft, nlohmann/json, tweetnacl i cpp-httplib kompilują się ze źródeł w drzewie projektu. Dołączone GLFW i PortAudio mają własną, prawdziwą obsługę macOS – Cocoa i CoreAudio – więc nie powinny niczego od Ciebie wymagać.
xcode-select --install # Apple Clang, needs C++20
brew install cmake ninja soapysdr openssl@3
CMake 3.20 lub nowszy. Projekt jest w C++20 z CMAKE_CXX_STANDARD_REQUIRED ON, więc stary Xcode zawiedzie już na etapie konfiguracji, a nie w tajemniczy sposób później.
Na Macu z radiami USB rozmawia SoapySDR. Od wersji 0.91.0 FoxSDR ma własne sterowniki dla rodzin RTL-SDR, HackRF, Airspy, Mirics i RX888, ale ich warstwa transportu USB istnieje tylko dla Windows (WinUSB) i Linux (usbfs): na macOS ta warstwa kompiluje się jako zaślepka, która niczego nie znajduje, więc każdy odbiornik USB przychodzi przez SoapySDR::Device::enumerate(), a to, czego może używać, zależy od zainstalowanych modułów SoapySDR. brew install soapyrtlsdr, soapyairspy, soapyhackrf i tak dalej, stosownie do Twojego sprzętu. FoxSDR działa doskonale bez żadnego z nich, korzystając z wbudowanego generatora sygnału lub odtwarzania pliku I/Q.
Kompilacja
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 to jedyna flaga, której Linux nie potrzebuje. macOS dostarcza LibreSSL zamiast OpenSSL, a Homebrew celowo trzyma openssl@3 poza domyślną ścieżką wyszukiwania, więc find_package(OpenSSL REQUIRED) sam go nie znajdzie. OpenSSL jest używany do prymitywów skrótu haseł i do klienta HTTPS katalogu wtyczek; Windows używa zamiast tego CNG i WinHTTP, dlatego tam nie jest zależnością.
Następnie:
ctest --test-dir build --output-on-failure
./build/cascade --selftest
Uruchom --selftest, zanim uznasz, że cokolwiek działa. Przepuszcza prawdziwy łańcuch DSP bez interfejsu i sprawdza znany szczyt widma, więc wyłapie kompilację, która linkuje się bez błędów, przechodzi testy jednostkowe, a mimo to liczy złe wartości.
Jeden test otwiera prawdziwe okno. W Linux CI wymaga to Xvfb; na macOS po prostu uruchom testy z normalnej, zalogowanej sesji graficznej i powinno być w porządku.
Jedna łatka, której niemal na pewno będziesz potrzebować
Dwie funkcje znajdują własny katalog pliku wykonywalnego za pomocą linuksowego /proc, który na macOS nie istnieje:
src/core/band_plan.cpp, wBandPlan::defaultDir()src/core/plugin_host.cpp, w okolicach wiersza 888
Obie robią:
const fs::path link = fs::read_symlink("/proc/self/exe", ec);
Na macOS to zawodzi, ustawiane jest ec, ścieżka pozostaje pusta, a obie funkcje przechodzą na ścieżkę względną wobec bieżącego katalogu. Nic się nie wysypuje – ale aplikacja nie znajdzie swoich planów pasm ani wtyczek, chyba że akurat uruchomisz ją z katalogu kompilacji. Poprawka to gałąź __APPLE__ używająca _NSGetExecutablePath, a oba pliki mają już strukturę #ifdef, do której można ją dopiąć:
#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
z #include <mach-o/dyld.h> i #include <climits> obok innych nagłówków platformy. _NSGetExecutablePath może zwrócić ścieżkę zawierającą dowiązania symboliczne i .., dlatego warto przepuścić ją przez fs::canonical.
Pierwsza z nich ma test – test_band_plan sprawdza, że defaultDir() kończy się na bandplans i nigdy nie jest zwykłym plikiem – więc w obu przypadkach dostaniesz sygnał.
Co nie zadziała i nie warto się tym zajmować
- Brak raportów o awariach. Obsługa awarii jest zbudowana na dbghelp i działa tylko na Windows.
- Raporty użycia nie są przetestowane. Poza Windows raport wysyła ten sam nadawca HTTPS, którego używa kompilacja dla Linux, więc kompilacja na Maca powinna raportować tak jak Linux; nikt jeszcze nie sprawdził tego na Macu.
- Okno zachowuje pasek tytułu.
src/gui/win_frame.cppimplementuje okno bez ramki przezWM_NCCALCSIZEiWM_NCHITTEST; cała jego treść jest wewnątrz#ifdef _WIN32, więc gdzie indziej kompiluje się do niczego, a okno po prostu wygląda zwyczajnie. To wyłącznie kosmetyka.
Nic z tego nie przeszkadza w działaniu odbiornika.
Plany pasm
0.81.0 dostarcza dziewięć planów pasm – światowy, trzy regiony ITU oraz Wielką Brytanię, USA, Kanadę, Japonię i Australię. CMake umieszcza je obok skompilowanego pliku binarnego na każdej platformie, więc po kompilacji powinieneś mieć:
build/resources/bandplans/*.json
Wybierz swój region w aplikacji w Ekran → Region. Jeśli lista wyboru jest pusta albo nakładka się nie rysuje, to jest to opisany wyżej problem z /proc/self/exe, a nie brakujący plik – najpierw sprawdź, czy build/resources/bandplans/ istnieje.
Punkt odniesienia: przepis Linux CI
.github/workflows/build.yml kompiluje się na ubuntu-latest i jest najbliższym odpowiednikiem sprawdzonej kompilacji spoza Windows. Jego lista zależności przekłada się tak:
| 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 | już w macOS SDK |
libx11-dev, libwayland-dev, libxkbcommon-dev, … | niepotrzebne – GLFW używa Cocoa |
libasound2-dev | niepotrzebne – PortAudio używa CoreAudio |
xvfb | niepotrzebne w sesji graficznej |
Poza tym polecenia konfiguracji i kompilacji są identyczne.
Jeśli uda Ci się to uruchomić
Daj nam znać. Kompilacja na Maca, którą ktoś faktycznie uruchomił, jest warta więcej niż ta strona, a pierwsza osoba, która to zrobi, zamieni „niezweryfikowane” w obsługiwaną platformę. Miejscem, by o tym powiedzieć, jest program beta, albo napisz na [email protected].
Licencja
FoxSDR jest objęty licencją PolyForm Noncommercial – bezpłatną do użytku niekomercyjnego, a samodzielna kompilacja na własny użytek mieści się w niej w pełni. Użycie komercyjne wymaga osobnej licencji. Dołączone komponenty zewnętrzne zachowują własne licencje, wymienione w third_party/THIRD_PARTY.md.