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, emBandPlan::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.cppimplementa a janela sem moldura através deWM_NCCALCSIZEeWM_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:
| 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 | já incluído no SDK do macOS |
libx11-dev, libwayland-dev, libxkbcommon-dev, … | não é necessário — o GLFW usa o Cocoa |
libasound2-dev | não é necessário — o PortAudio usa o CoreAudio |
xvfb | nã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.