FoxSDR 0.99.39 · BETA OBERTA
Traducció automàtica
← Torna a FoxSDR

Compilació des del codi font · Apple silicon i Intel

Compilar a macOS

Ningú no ha acabat encara aquesta compilació. FoxSDR es desenvolupa a Windows i té una tasca de CI de Linux que se supera a cada commit. Mai no s'ha intentat a macOS. Tot el que hi ha en aquesta pàgina es deriva dels fitxers de compilació reals i d'aquesta recepta de Linux que funciona — però la compilació en si no està verificada. Espereu trobar-vos alguna cosa que aquesta pàgina no esmenta, i si us plau, digueu-nos-ho quan passi.

La part difícil ja està feta. El projecte es compila i supera tot el seu joc de proves a Linux a la CI, així que el camí de codi que no és de Windows s'exercita de debò i no és teòric. El que segueix és la diferència entre aquest camí i un Mac.

El que us cal

Tot excepte SoapySDR i OpenSSL està inclòs a third_party/: GLFW 3.4, Dear ImGui, PortAudio, pffft, nlohmann/json, tweetnacl i cpp-httplib es compilen tots des del codi font dins l'arbre. Les còpies incloses de GLFW i PortAudio tenen compatibilitat real amb macOS — Cocoa i CoreAudio — així que no us haurien de demanar res.

xcode-select --install                      # Apple Clang, needs C++20
brew install cmake ninja soapysdr openssl@3

CMake 3.20 o posterior. El projecte és C++20 amb CMAKE_CXX_STANDARD_REQUIRED ON, de manera que un Xcode antic falla en la configuració i no misteriosament més tard.

En un Mac, SoapySDR és el que parla amb les ràdios USB. Des de la 0.91.0, FoxSDR porta els seus propis controladors per a les famílies RTL-SDR, HackRF, Airspy, Mirics i RX888, però el seu transport USB només existeix per a Windows (WinUSB) i Linux (usbfs): a macOS aquesta capa es compila com un esborrany buit que no troba res, així que tots els receptors USB arriben mitjançant SoapySDR::Device::enumerate(), i els mòduls de SoapySDR que instal·leu són els que pot fer servir. brew install soapyrtlsdr, soapyairspy, soapyhackrf, etc., segons el vostre maquinari. FoxSDR funciona perfectament sense cap d'ells, amb el generador de senyals integrat o la reproducció de fitxers I/Q.

Compilació

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 és l'únic indicador que Linux no necessita. macOS inclou LibreSSL en lloc d'OpenSSL, i Homebrew manté openssl@3 fora del camí de cerca per defecte expressament, així que find_package(OpenSSL REQUIRED) no el trobarà pel seu compte. OpenSSL s'utilitza per a les primitives de resum de contrasenyes i per al client HTTPS del catàleg de connectors; Windows fa servir CNG i WinHTTP, i per això allà no és una dependència.

Després:

ctest --test-dir build --output-on-failure
./build/cascade --selftest

Executeu --selftest abans de concloure que res funciona. Fa córrer la cadena DSP real sense interfície i comprova un pic d'espectre conegut, així que detecta una compilació que s'enllaça correctament, supera les proves unitàries i calcula números erronis.

Una prova obre una finestra real. A la CI de Linux això necessita Xvfb; a macOS, executeu les proves des d'una sessió gràfica normal amb l'usuari iniciat i no hi hauria d'haver problema.

L'únic pedaç que gairebé segur que us caldrà

Dues funcions troben el directori del mateix executable amb el /proc de Linux, que no existeix a macOS:

  • src/core/band_plan.cpp, a BandPlan::defaultDir()
  • src/core/plugin_host.cpp, cap a la línia 888

Totes dues fan:

const fs::path link = fs::read_symlink("/proc/self/exe", ec);

A macOS això falla, s'estableix ec, el camí queda buit i totes dues recorren a un camí relatiu al directori actual. No es penja res — però l'aplicació no trobarà els seus plans de bandes ni els seus connectors tret que l'executeu precisament des del directori de compilació. La solució és una branca __APPLE__ que faci servir _NSGetExecutablePath, i tots dos fitxers ja tenen l'estructura #ifdef per afegir-la:

#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

amb #include <mach-o/dyld.h> i #include <climits> al costat de les altres capçaleres de plataforma. _NSGetExecutablePath pot retornar un camí que contingui enllaços simbòlics i .., i per això val la pena passar-lo per fs::canonical.

Hi ha una prova per a la primera — test_band_plan comprova que defaultDir() acaba en bandplans i que mai no és un fitxer normal — així que tindreu un senyal en qualsevol cas.

El que no funcionarà, i no val la pena perseguir

  • Sense informes de fallades. El gestor de fallades es basa en dbghelp i només és per a Windows.
  • Els informes d'ús no s'han provat. Fora de Windows, l'informe l'envia el mateix emissor HTTPS que fa servir la compilació Linux, així que una compilació per a Mac hauria d'informar igual que la de Linux; ningú no ho ha comprovat encara en un Mac.
  • La finestra manté la barra de títol. src/gui/win_frame.cpp implementa la finestra sense marc mitjançant WM_NCCALCSIZE i WM_NCHITTEST; tot el seu cos és dins de #ifdef _WIN32, així que en altres plataformes no es compila res i la finestra simplement té un aspecte normal. Només és estètic.

Cap d'aquestes coses impedeix que el receptor funcioni.

Plans de bandes

0.81.0 inclou nou plans de bandes — el mundial, les tres regions de la UIT, i els del Regne Unit, els EUA, el Canadà, el Japó i Austràlia. CMake els col·loca al costat del binari compilat a totes les plataformes, així que després d'una compilació hauríeu de tenir:

build/resources/bandplans/*.json

Trieu la vostra regió a l'aplicació, a Pantalla → Regió. Si el selector és buit o la capa no es dibuixa mai, es tracta del problema de /proc/self/exe descrit més amunt i no d'un fitxer que falta — comproveu primer que existeix build/resources/bandplans/.

Referència: la recepta de la CI de Linux

.github/workflows/build.yml es compila a ubuntu-latest i és el més semblant a una compilació coneguda que funciona fora de Windows. La seva llista de dependències es tradueix així:

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-devja inclòs a l'SDK de macOS
libx11-dev, libwayland-dev, libxkbcommon-dev, …no cal — GLFW fa servir Cocoa
libasound2-devno cal — PortAudio fa servir CoreAudio
xvfbno cal en una sessió gràfica

Per la resta, les ordres de configuració i compilació són idèntiques.

Si aconseguiu que funcioni

Digueu-nos-ho. Una compilació per a Mac que algú hagi executat de debò val més que aquesta pàgina, i la primera persona que ho aconsegueixi convertirà «no verificada» en una plataforma compatible. El programa de beta és on cal dir-ho, o escriviu a [email protected].

Llicència

FoxSDR és PolyForm Noncommercial — gratuït per a ús no comercial, i compilar-lo per a vós mateix hi entra de ple. L'ús comercial requereix una llicència separada. Els components de tercers inclosos mantenen les seves pròpies llicències, que es llisten a third_party/THIRD_PARTY.md.