Build dari sumber · Apple silicon dan Intel
Membangun di macOS
Belum ada yang menyelesaikan build ini. FoxSDR dikembangkan di Windows dan memiliki job CI Linux yang lulus di setiap commit. macOS belum pernah dicoba. Semua yang ada di halaman ini diturunkan dari file build yang sebenarnya dan resep Linux yang berfungsi itu — tetapi build-nya sendiri belum diverifikasi. Bersiaplah menemui sesuatu yang tidak disebutkan halaman ini, dan beri tahu kami jika itu terjadi.
Bagian yang sulit sudah selesai. Proyek ini berhasil dibangun dan lulus seluruh rangkaian tesnya di Linux dalam CI, jadi jalur kode non-Windows benar-benar teruji, bukan sekadar teori. Berikut adalah perbedaan antara jalur itu dan Mac.
Apa yang Anda perlukan
Semuanya kecuali SoapySDR dan OpenSSL sudah di-vendor di third_party/: GLFW 3.4, Dear ImGui, PortAudio, pffft, nlohmann/json, tweetnacl, dan cpp-httplib semuanya dibangun dari sumber di dalam pohon kode. GLFW dan PortAudio yang di-vendor punya dukungan macOS sungguhan sendiri — Cocoa dan CoreAudio — jadi seharusnya tidak memerlukan apa pun dari Anda.
xcode-select --install # Apple Clang, needs C++20
brew install cmake ninja soapysdr openssl@3
CMake 3.20 atau lebih baru. Proyek ini memakai C++20 dengan CMAKE_CXX_STANDARD_REQUIRED ON, jadi Xcode lama akan gagal saat configure, bukan secara misterius belakangan.
Di Mac, SoapySDR-lah yang berbicara dengan radio USB. Sejak 0.91.0 FoxSDR membawa driver sendiri untuk keluarga RTL-SDR, HackRF, Airspy, Mirics, dan RX888, tetapi transport USB-nya hanya ada untuk Windows (WinUSB) dan Linux (usbfs): di macOS lapisan itu dibangun sebagai stub yang tidak menemukan apa pun, sehingga setiap penerima USB masuk melalui SoapySDR::Device::enumerate() dan modul SoapySDR apa pun yang Anda instal adalah yang bisa dipakainya. brew install soapyrtlsdr, soapyairspy, soapyhackrf, dan seterusnya, sesuai perangkat keras Anda. FoxSDR tetap berjalan dengan baik tanpa satu pun dari itu, memakai generator sinyal bawaan atau pemutaran file I/Q.
Build
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 adalah satu-satunya flag yang tidak diperlukan Linux. macOS menyertakan LibreSSL, bukan OpenSSL, dan Homebrew sengaja menjauhkan openssl@3 dari jalur pencarian default, sehingga find_package(OpenSSL REQUIRED) tidak akan menemukannya sendiri. OpenSSL dipakai untuk primitif digest kata sandi dan untuk klien HTTPS katalog plugin; Windows memakai CNG dan WinHTTP sebagai gantinya, itulah sebabnya OpenSSL bukan dependensi di sana.
Lalu:
ctest --test-dir build --output-on-failure
./build/cascade --selftest
Jalankan --selftest sebelum menyimpulkan bahwa apa pun berfungsi. Perintah itu menjalankan rantai DSP sungguhan tanpa tampilan dan memastikan adanya puncak spektrum yang diketahui, sehingga bisa menangkap build yang tertaut dengan bersih, lulus unit test-nya, tetapi menghitung angka yang salah.
Satu tes membuka jendela sungguhan. Di CI Linux itu memerlukan Xvfb; di macOS cukup jalankan tes dari sesi GUI biasa yang sudah login dan seharusnya tidak masalah.
Satu patch yang hampir pasti Anda perlukan
Dua fungsi mencari direktori milik executable itu sendiri memakai /proc milik Linux, yang tidak ada di macOS:
src/core/band_plan.cpp, diBandPlan::defaultDir()src/core/plugin_host.cpp, sekitar baris 888
Keduanya melakukan:
const fs::path link = fs::read_symlink("/proc/self/exe", ec);
Di macOS itu gagal, ec diatur, path-nya tetap kosong, dan keduanya beralih ke path relatif terhadap direktori saat ini. Tidak ada yang crash — tetapi aplikasi tidak akan menemukan band plan atau plugin-nya kecuali Anda kebetulan meluncurkannya dari direktori build. Perbaikannya adalah cabang __APPLE__ yang memakai _NSGetExecutablePath, dan kedua file sudah memiliki struktur #ifdef untuk menempatkannya:
#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
dengan #include <mach-o/dyld.h> dan #include <climits> di samping header platform lainnya. _NSGetExecutablePath bisa mengembalikan path yang berisi symlink dan .., itulah sebabnya ada gunanya melewatkannya melalui fs::canonical.
Ada tes untuk yang pertama — test_band_plan memastikan bahwa defaultDir() berakhir dengan bandplans dan tidak pernah berupa file biasa — sehingga Anda mendapat sinyal apa pun hasilnya.
Apa yang tidak akan berfungsi, dan tidak layak dikejar
- Tidak ada laporan crash. Penangan crash dibangun di atas dbghelp dan hanya untuk Windows.
- Laporan penggunaan belum diuji. Di luar Windows, laporan dikirim oleh pengirim HTTPS yang sama dengan yang dipakai build Linux, jadi build Mac seharusnya melapor seperti Linux; belum ada yang memeriksanya di Mac.
- Jendela tetap memiliki bilah judulnya.
src/gui/win_frame.cppmengimplementasikan jendela tanpa bingkai melaluiWM_NCCALCSIZEdanWM_NCHITTEST; seluruh isinya berada di dalam#ifdef _WIN32, sehingga di platform lain terkompilasi menjadi tidak ada apa-apa dan jendelanya tampak normal saja. Hanya kosmetik.
Tidak satu pun dari ini yang menghentikan penerima bekerja.
Band plan
0.81.0 menyertakan sembilan band plan — dunia, tiga region ITU, serta Inggris, AS, Kanada, Jepang, dan Australia. CMake menempatkannya di samping binary hasil build di setiap platform, jadi setelah build Anda seharusnya memiliki:
build/resources/bandplans/*.json
Pilih wilayah Anda di aplikasi di Tampilan → Wilayah. Jika pemilihnya kosong atau lapisannya tidak pernah tergambar, itu masalah /proc/self/exe di atas, bukan file yang hilang — periksa dulu bahwa build/resources/bandplans/ ada.
Referensi: resep CI Linux
.github/workflows/build.yml dibangun di ubuntu-latest dan merupakan hal terdekat dengan build non-Windows yang diketahui berfungsi. Daftar dependensinya diterjemahkan seperti ini:
| 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 | sudah ada di macOS SDK |
libx11-dev, libwayland-dev, libxkbcommon-dev, … | tidak diperlukan — GLFW memakai Cocoa |
libasound2-dev | tidak diperlukan — PortAudio memakai CoreAudio |
xvfb | tidak diperlukan dalam sesi GUI |
Selain itu, perintah configure dan build-nya identik.
Jika Anda berhasil menjalankannya
Beri tahu kami. Build Mac yang benar-benar pernah dijalankan seseorang lebih berharga daripada halaman ini, dan orang pertama yang melakukannya mengubah "belum diverifikasi" menjadi platform yang didukung. Program beta adalah tempat untuk menyampaikannya, atau tulislah ke [email protected].
Lisensi
FoxSDR memakai lisensi PolyForm Noncommercial — gratis untuk penggunaan nonkomersial, dan membangunnya untuk diri sendiri jelas termasuk di dalamnya. Penggunaan komersial memerlukan lisensi terpisah. Komponen pihak ketiga yang di-vendor tetap memakai lisensinya masing-masing, yang tercantum di third_party/THIRD_PARTY.md.