FoxSDR 0.99.39 · OTWARTA BETA
Tłumaczenie maszynowe
← Powrót do FoxSDR

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, w BandPlan::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.cpp implementuje okno bez ramki przez WM_NCCALCSIZE i WM_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:

LinuxmacOS
build-essentialXcode Command Line Tools
cmake ninja-buildbrew install cmake ninja
libsoapysdr-devbrew install soapysdr
libssl-devbrew install openssl@3 + OPENSSL_ROOT_DIR
libgl1-mesa-devjuż w macOS SDK
libx11-dev, libwayland-dev, libxkbcommon-dev, …niepotrzebne – GLFW używa Cocoa
libasound2-devniepotrzebne – PortAudio używa CoreAudio
xvfbniepotrzebne 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.