FoxSDR 0.99.39 · BETA ABIERTA
Traducción automática
← Volver a FoxSDR

Compilación desde el código fuente · Apple silicon e Intel

Compilar en macOS

Nadie ha terminado todavía esta compilación. FoxSDR se desarrolla en Windows y tiene un trabajo de CI para Linux que se supera en cada commit. En macOS nunca se ha intentado. Todo lo que hay en esta página se deriva de los archivos de compilación reales y de esa receta de Linux que funciona — pero la compilación en sí está sin verificar. Cuenta con toparte con algo que esta página no menciona, y por favor avísanos cuando ocurra.

La parte difícil ya está hecha. El proyecto se compila y supera todo su conjunto de pruebas en Linux en la CI, así que el camino de código que no es Windows se ejercita de verdad y no es solo teórico. Lo que sigue es la diferencia entre ese camino y un Mac.

Lo que necesitas

Todo salvo SoapySDR y OpenSSL está incluido en el propio árbol en third_party/: GLFW 3.4, Dear ImGui, PortAudio, pffft, nlohmann/json, tweetnacl y cpp-httplib se compilan todos desde el código fuente dentro del árbol. GLFW y PortAudio incluidos tienen soporte real propio para macOS — Cocoa y CoreAudio — así que no deberían necesitar nada de ti.

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

CMake 3.20 o posterior. El proyecto es C++20 con CMAKE_CXX_STANDARD_REQUIRED ON, así que un Xcode antiguo falla al configurar en lugar de hacerlo misteriosamente más tarde.

En un Mac, SoapySDR es lo que habla con las radios USB. Desde la 0.91.0, FoxSDR incluye sus propios controladores para las familias RTL-SDR, HackRF, Airspy, Mirics y RX888, pero su transporte USB existe solo para Windows (WinUSB) y Linux (usbfs): en macOS esa capa se compila como un esbozo que no encuentra nada, así que todos los receptores USB llegan a través de SoapySDR::Device::enumerate(), y los módulos de SoapySDR que instales son los que puede usar. brew install soapyrtlsdr, soapyairspy, soapyhackrf, etc., según tu hardware. FoxSDR funciona perfectamente sin ninguno de ellos, usando el generador de señales integrado o la reproducción de archivos I/Q.

Compilar

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 es la única opción que Linux no necesita. macOS trae LibreSSL en lugar de OpenSSL, y Homebrew deja deliberadamente openssl@3 fuera de la ruta de búsqueda predeterminada, así que find_package(OpenSSL REQUIRED) no lo encontrará por sí solo. OpenSSL se usa para las primitivas de resumen de contraseñas y para el cliente HTTPS del catálogo de plugins; Windows usa CNG y WinHTTP en su lugar, y por eso allí no es una dependencia.

Después:

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

Ejecuta --selftest antes de dar nada por bueno. Hace funcionar la cadena DSP real sin interfaz gráfica y comprueba un pico de espectro conocido, así que detecta una compilación que enlaza sin problemas, supera sus pruebas unitarias y calcula números erróneos.

Una prueba abre una ventana real. En la CI de Linux eso necesita Xvfb; en macOS basta con ejecutar las pruebas desde una sesión gráfica normal con usuario iniciado y debería ir bien.

El único parche que casi seguro necesitarás

Dos funciones buscan el directorio del propio ejecutable usando /proc de Linux, que no existe en macOS:

  • src/core/band_plan.cpp, en BandPlan::defaultDir()
  • src/core/plugin_host.cpp, hacia la línea 888

Las dos hacen:

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

En macOS eso falla, se activa ec, la ruta queda vacía y las dos recurren a una ruta relativa al directorio actual. No se bloquea nada — pero la aplicación no encontrará sus planes de bandas ni sus plugins a menos que la lances desde el directorio de compilación. La solución es una rama __APPLE__ que use _NSGetExecutablePath, y los dos archivos ya tienen la estructura #ifdef donde colocarla:

#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

con #include <mach-o/dyld.h> y #include <climits> junto a las demás cabeceras de plataforma. _NSGetExecutablePath puede devolver una ruta que contenga enlaces simbólicos y .., por eso conviene pasarla por fs::canonical.

Hay una prueba para la primera — test_band_plan comprueba que defaultDir() termina en bandplans y que nunca es un archivo normal — así que obtienes una señal en cualquier caso.

Lo que no funcionará, y no merece la pena perseguir

  • Sin informes de fallos. El gestor de fallos se basa en dbghelp y es solo para Windows.
  • Los informes de uso no están probados. Fuera de Windows, el informe lo envía el mismo emisor HTTPS que usa la versión para Linux, así que una compilación para Mac debería informar igual que Linux; nadie lo ha comprobado todavía en un Mac.
  • La ventana conserva su barra de título. src/gui/win_frame.cpp implementa la ventana sin marco mediante WM_NCCALCSIZE y WM_NCHITTEST; todo su cuerpo está dentro de #ifdef _WIN32, así que en otras plataformas se compila como nada y la ventana simplemente tiene un aspecto normal. Solo es estético.

Nada de esto impide que el receptor funcione.

Planes de bandas

0.81.0 trae nueve planes de bandas — mundial, las tres regiones de la UIT, y Reino Unido, EE. UU., Canadá, Japón y Australia. CMake los coloca junto al binario compilado en todas las plataformas, así que después de compilar deberías tener:

build/resources/bandplans/*.json

Elige tu región en la aplicación en Pantalla → Región. Si el selector está vacío o la superposición nunca se dibuja, es el problema de /proc/self/exe de arriba y no un archivo que falte — comprueba primero que existe build/resources/bandplans/.

Referencia: la receta de la CI de Linux

.github/workflows/build.yml se compila en ubuntu-latest y es lo más parecido que hay a una compilación conocida y buena fuera de Windows. Su lista de dependencias se traduce así:

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-devya incluido en el SDK de macOS
libx11-dev, libwayland-dev, libxkbcommon-dev, …no hace falta — GLFW usa Cocoa
libasound2-devno hace falta — PortAudio usa CoreAudio
xvfbno hace falta en una sesión gráfica

Por lo demás, los comandos de configuración y compilación son idénticos.

Si consigues que funcione

Cuéntanoslo. Una compilación para Mac que alguien haya ejecutado de verdad vale más que esta página, y la primera persona que lo consiga convierte “sin verificar” en una plataforma soportada. El programa beta es donde decirlo, o escribe a [email protected].

Licencia

FoxSDR usa la licencia PolyForm Noncommercial — gratis para uso no comercial, y compilarlo para ti entra de lleno en ello. El uso comercial requiere una licencia aparte. Los componentes de terceros incluidos conservan sus propias licencias, enumeradas en third_party/THIRD_PARTY.md.