FoxSDR 0.99.39 · BETA ABERTA
Tradução automática
← Voltar ao FoxSDR

Compilação a partir do código-fonte · Apple silicon e Intel

Compilar em macOS

Ninguém concluiu ainda esta compilação. O FoxSDR é desenvolvido em Windows e tem uma tarefa de CI em Linux que passa em cada commit. O macOS nunca foi tentado. Tudo nesta página deriva dos ficheiros de compilação reais e dessa receita de Linux que funciona — mas a compilação propriamente dita não está verificada. Conte com deparar-se com algo que esta página não menciona, e diga-nos quando isso acontecer.

A parte difícil já está feita. O projeto compila e passa todo o seu conjunto de testes em Linux na CI, por isso o caminho de código não Windows é genuinamente exercitado e não apenas teórico. O que se segue é a diferença entre esse caminho e um Mac.

O que é preciso

Tudo exceto o SoapySDR e o OpenSSL está incluído no repositório em third_party/: GLFW 3.4, Dear ImGui, PortAudio, pffft, nlohmann/json, tweetnacl e cpp-httplib são todos compilados a partir do código-fonte dentro da árvore. O GLFW e o PortAudio incluídos têm suporte próprio real para macOS — Cocoa e CoreAudio — por isso não devem precisar de nada da sua parte.

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

CMake 3.20 ou mais recente. O projeto é C++20 com CMAKE_CXX_STANDARD_REQUIRED ON, por isso um Xcode antigo falha na configuração em vez de falhar misteriosamente mais tarde.

Num Mac, é o SoapySDR que fala com os rádios USB. Desde a versão 0.91.0, o FoxSDR inclui os seus próprios controladores para as famílias RTL-SDR, HackRF, Airspy, Mirics e RX888, mas o respetivo transporte USB só existe para Windows (WinUSB) e Linux (usbfs): em macOS, essa camada é compilada como um esboço que não encontra nada, por isso todos os recetores USB chegam através do SoapySDR::Device::enumerate(), e os módulos SoapySDR que instalar são o que ele pode usar. brew install soapyrtlsdr, soapyairspy, soapyhackrf e assim por diante, conforme o seu hardware. O FoxSDR funciona perfeitamente sem nenhum deles, com o gerador de sinais incorporado ou a reprodução de ficheiros 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 é a única opção de que o Linux não precisa. O macOS vem com o LibreSSL em vez do OpenSSL, e o Homebrew mantém deliberadamente o openssl@3 fora do caminho de pesquisa predefinido, por isso o find_package(OpenSSL REQUIRED) não o encontra sozinho. O OpenSSL é usado para as primitivas de resumo das palavras-passe e para o cliente HTTPS do catálogo de plugins; o Windows usa o CNG e o WinHTTP em vez dele, e é por isso que aí não é uma dependência.

Depois:

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

Execute --selftest antes de concluir que algo funciona. Faz correr a cadeia DSP real sem interface gráfica e verifica um pico de espetro conhecido, por isso apanha uma compilação que liga sem erros, passa os testes unitários e calcula números errados.

Um dos testes abre uma janela real. Na CI de Linux isso precisa do Xvfb; em macOS basta correr os testes a partir de uma sessão gráfica normal com sessão iniciada, e deverá correr bem.

A correção de que quase de certeza vai precisar

Duas funções encontram o diretório do próprio executável através do /proc do Linux, que não existe em macOS:

  • src/core/band_plan.cpp, em BandPlan::defaultDir()
  • src/core/plugin_host.cpp, por volta da linha 888

Ambas fazem:

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

Em macOS isso falha, ec fica definido, o caminho fica vazio e ambas recorrem a um caminho relativo ao diretório atual. Não há nenhuma falha — mas a aplicação não vai encontrar os planos de bandas nem os plugins, a menos que por acaso a lance a partir do diretório de compilação. A solução é um ramo __APPLE__ que use _NSGetExecutablePath, e ambos os ficheiros já têm a estrutura #ifdef onde o encaixar:

#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

com #include <mach-o/dyld.h> e #include <climits> junto dos outros cabeçalhos de plataforma. _NSGetExecutablePath pode devolver um caminho com ligações simbólicas e .., e é por isso que vale a pena passá-lo por fs::canonical.

Há um teste para a primeira — test_band_plan verifica que defaultDir() termina em bandplans e nunca é um ficheiro simples — por isso recebe um sinal num caso ou noutro.

O que não vai funcionar, e não vale a pena perseguir

  • Sem relatórios de falha. O gestor de falhas assenta no dbghelp e só existe em Windows.
  • O relatório de utilização não foi testado. Fora do Windows, o relatório é enviado pelo mesmo emissor HTTPS que a versão Linux usa, por isso uma compilação para Mac deverá comunicar como a de Linux; ainda ninguém o verificou num Mac.
  • A janela mantém a barra de título. O src/gui/win_frame.cpp implementa a janela sem moldura através de WM_NCCALCSIZE e WM_NCHITTEST; todo o seu corpo está dentro de #ifdef _WIN32, por isso noutras plataformas compila para nada e a janela tem simplesmente um aspeto normal. Apenas estético.

Nada disto impede o recetor de funcionar.

Planos de bandas

A versão 0.81.0 inclui nove planos de bandas — mundial, as três regiões da UIT e o Reino Unido, os EUA, o Canadá, o Japão e a Austrália. O CMake coloca-os junto do binário compilado em todas as plataformas, por isso, depois de uma compilação, deverá ter:

build/resources/bandplans/*.json

Escolha a sua região na aplicação em Visualização → Região. Se o seletor estiver vazio ou a camada nunca for desenhada, trata-se do problema de /proc/self/exe acima e não de um ficheiro em falta — verifique primeiro se build/resources/bandplans/ existe.

Referência: a receita de CI do Linux

.github/workflows/build.yml compila em ubuntu-latest e é o que há de mais próximo de uma compilação não Windows comprovadamente funcional. A sua lista de dependências traduz-se assim:

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-devjá incluído no SDK do macOS
libx11-dev, libwayland-dev, libxkbcommon-dev, …não é necessário — o GLFW usa o Cocoa
libasound2-devnão é necessário — o PortAudio usa o CoreAudio
xvfbnão é necessário numa sessão gráfica

Os comandos de configuração e de compilação são, de resto, idênticos.

Se conseguir pô-lo a funcionar

Diga-nos. Uma compilação para Mac que alguém tenha efetivamente corrido vale mais do que esta página, e a primeira pessoa a fazê-lo transforma «não verificado» numa plataforma suportada. O programa beta é o sítio para o dizer, ou escreva para [email protected].

Licença

O FoxSDR está sob a licença PolyForm Noncommercial — gratuito para uso não comercial, e compilá-lo para uso próprio cabe perfeitamente nisso. O uso comercial precisa de uma licença separada. Os componentes de terceiros incluídos mantêm as suas próprias licenças, indicadas em third_party/THIRD_PARTY.md.