Compilation depuis les sources · Apple silicon et Intel
Compiler sous macOS
Personne n'a encore mené cette compilation à terme. FoxSDR est développé sous Windows et dispose d'une tâche de CI Linux qui réussit à chaque commit. macOS n'a jamais été tenté. Tout ce qui figure sur cette page est déduit des vrais fichiers de compilation et de cette recette Linux qui fonctionne — mais la compilation elle-même est non vérifiée. Attendez-vous à tomber sur quelque chose que cette page ne mentionne pas, et dites-le-nous quand cela arrive.
Le plus dur est déjà fait. Le projet se compile et passe toute sa suite de tests sous Linux en CI, si bien que le chemin de code non-Windows est réellement exercé et non théorique. Ce qui suit, c'est la différence entre ce chemin et un Mac.
Ce qu'il vous faut
Tout, sauf SoapySDR et OpenSSL, est intégré au dépôt dans third_party/ : GLFW 3.4, Dear ImGui, PortAudio, pffft, nlohmann/json, tweetnacl et cpp-httplib se compilent tous depuis les sources dans l'arborescence. Les versions intégrées de GLFW et de PortAudio ont une vraie prise en charge de macOS — Cocoa et CoreAudio — elles ne devraient donc rien vous demander.
xcode-select --install # Apple Clang, needs C++20
brew install cmake ninja soapysdr openssl@3
CMake 3.20 ou plus récent. Le projet est en C++20 avec CMAKE_CXX_STANDARD_REQUIRED ON, si bien qu'un Xcode trop ancien échoue dès la configuration plutôt que mystérieusement plus tard.
Sur un Mac, c'est SoapySDR qui parle aux radios USB. Depuis la 0.91.0, FoxSDR embarque ses propres pilotes pour les familles RTL-SDR, HackRF, Airspy, Mirics et RX888, mais leur transport USB n'existe que pour Windows (WinUSB) et Linux (usbfs) : sous macOS, cette couche se compile en une ébauche qui ne trouve rien, si bien que tout récepteur USB passe par SoapySDR::Device::enumerate() et que ce sont les modules SoapySDR que vous installez qui déterminent ce qu'il peut utiliser. brew install soapyrtlsdr, soapyairspy, soapyhackrf et ainsi de suite, selon votre matériel. FoxSDR fonctionne parfaitement sans aucun d'eux, avec le générateur de signal intégré ou la lecture de fichiers I/Q.
Compilation
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 est l'unique option dont Linux n'a pas besoin. macOS fournit LibreSSL plutôt qu'OpenSSL, et Homebrew garde délibérément openssl@3 hors du chemin de recherche par défaut, donc find_package(OpenSSL REQUIRED) ne le trouvera pas tout seul. OpenSSL sert aux primitives d'empreinte des mots de passe et au client HTTPS du catalogue des plugins ; Windows utilise CNG et WinHTTP à la place, ce qui explique qu'il n'y soit pas une dépendance.
Ensuite :
ctest --test-dir build --output-on-failure
./build/cascade --selftest
Lancez --selftest avant de conclure que quoi que ce soit fonctionne. Il fait tourner la vraie chaîne DSP sans interface et vérifie un pic de spectre connu, si bien qu'il détecte une compilation qui se lie proprement, passe ses tests unitaires, et calcule des chiffres faux.
Un test ouvre une vraie fenêtre. Sur la CI Linux, il faut Xvfb ; sous macOS, lancez simplement les tests depuis une session graphique normale ouverte et tout devrait bien se passer.
L'unique correctif dont vous aurez presque certainement besoin
Deux fonctions trouvent le répertoire de l'exécutable lui-même en utilisant /proc de Linux, qui n'existe pas sous macOS :
src/core/band_plan.cpp, dansBandPlan::defaultDir()src/core/plugin_host.cpp, vers la ligne 888
Les deux font :
const fs::path link = fs::read_symlink("/proc/self/exe", ec);
Sous macOS, cela échoue, ec est positionné, le chemin reste vide, et les deux se rabattent sur un chemin relatif au répertoire courant. Rien ne plante — mais l'application ne trouvera ni ses plans de bandes ni ses plugins, sauf si vous la lancez justement depuis le répertoire de compilation. La solution est une branche __APPLE__ utilisant _NSGetExecutablePath, et les deux fichiers ont déjà la structure #ifdef où l'accrocher :
#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
avec #include <mach-o/dyld.h> et #include <climits> à côté des autres en-têtes propres à chaque plate-forme. _NSGetExecutablePath peut renvoyer un chemin contenant des liens symboliques et .., c'est pourquoi il vaut la peine de le faire passer par fs::canonical.
Il existe un test pour la première — test_band_plan vérifie que defaultDir() se termine par bandplans et n'est jamais un simple fichier — vous avez donc un signal dans un sens comme dans l'autre.
Ce qui ne fonctionnera pas, et ne vaut pas la peine d'être poursuivi
- Pas de rapports de plantage. Le gestionnaire de plantages repose sur dbghelp et ne fonctionne que sous Windows.
- Rapports d'utilisation non testés. Hors de Windows, le rapport est envoyé par le même outil d'envoi HTTPS que celui de la version Linux, donc une compilation Mac devrait transmettre comme le fait Linux ; personne ne l'a encore vérifié sur un Mac.
- La fenêtre garde sa barre de titre.
src/gui/win_frame.cppimplémente la fenêtre sans cadre viaWM_NCCALCSIZEetWM_NCHITTEST; tout son corps se trouve à l'intérieur de#ifdef _WIN32, si bien qu'il se compile en rien ailleurs et que la fenêtre a simplement l'air normale. Purement cosmétique.
Rien de tout cela n'empêche le récepteur de fonctionner.
Plans de bandes
La 0.81.0 fournit neuf plans de bandes — monde, les trois régions UIT, et Royaume-Uni, États-Unis, Canada, Japon et Australie. CMake les place à côté du binaire compilé sur toutes les plates-formes, donc après une compilation vous devriez avoir :
build/resources/bandplans/*.json
Choisissez votre région dans l'application sous Affichage → Région. Si le sélecteur est vide ou si le calque ne s'affiche jamais, c'est le problème /proc/self/exe décrit plus haut plutôt qu'un fichier manquant — vérifiez d'abord que build/resources/bandplans/ existe.
Référence : la recette de CI Linux
.github/workflows/build.yml compile sur ubuntu-latest et est ce qui se rapproche le plus d'une compilation non-Windows qui fonctionne à coup sûr. Sa liste de dépendances se transpose ainsi :
| 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 | déjà dans le SDK macOS |
libx11-dev, libwayland-dev, libxkbcommon-dev, … | inutile — GLFW utilise Cocoa |
libasound2-dev | inutile — PortAudio utilise CoreAudio |
xvfb | inutile dans une session graphique |
Les commandes de configuration et de compilation sont par ailleurs identiques.
Si vous arrivez à le faire fonctionner
Dites-le-nous. Une compilation Mac que quelqu'un a réellement lancée vaut plus que cette page, et la première personne à y parvenir fait passer « non vérifié » au statut de plate-forme prise en charge. Le programme bêta est l'endroit où le dire, ou écrivez à [email protected].
Licence
FoxSDR est sous PolyForm Noncommercial — gratuit pour un usage non commercial, et le compiler pour vous-même en relève pleinement. L'usage commercial nécessite une licence distincte. Les composants tiers intégrés conservent leurs propres licences, listées dans third_party/THIRD_PARTY.md.