FoxSDR 0.99.39 · 公開測試版
機器翻譯
← 返回 FoxSDR

原始碼組建 · Apple Silicon 與 Intel

在 macOS 上組建

目前還沒有人完成這個組建。FoxSDR 是在 Windows 上開發的,並有一個在每次 commit 時都能通過的 Linux CI 工作。macOS 則從未嘗試過。本頁的一切都是依據實際的組建檔案與那套可行的 Linux 流程推導而來 — 但組建本身未經驗證。您很可能會遇到本頁沒有提到的問題,遇到時請告訴我們。

最困難的部分已經完成。本專案在 Linux 的 CI 中能夠組建並通過完整的測試套件,因此非 Windows 的程式碼路徑確實經過實際執行,而不只是理論上可行。以下說明的,是那條路徑與 Mac 之間的差異。

您需要的東西

除了 SoapySDR 與 OpenSSL 之外,其他一切都已納入專案,位於 third_party/:GLFW 3.4、Dear ImGui、PortAudio、pffft、nlohmann/json、tweetnacl 與 cpp-httplib 都在原始碼樹中從原始碼組建。納入的 GLFW 與 PortAudio 本身就有真正的 macOS 支援 — Cocoa 與 CoreAudio — 所以應該不需要您做任何事。

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

CMake 3.20 或更新版本。本專案使用 C++20 並搭配 CMAKE_CXX_STANDARD_REQUIRED ON,因此舊版 Xcode 會在設定階段就失敗,而不是在之後莫名其妙地失敗。

在 Mac 上,負責與 USB 無線電溝通的是 SoapySDR。自 0.91.0 起,FoxSDR 內建 RTL-SDR、HackRF、Airspy、Mirics 與 RX888 系列的驅動程式,但它們的 USB 傳輸層只存在於 Windows (WinUSB) 與 Linux (usbfs):在 macOS 上,這一層會組建成一個什麼也找不到的空殼,因此每一個 USB 接收機都會透過 SoapySDR::Device::enumerate() 進來,而您安裝了哪些 SoapySDR 模組,它就能使用哪些。brew install soapyrtlsdr、soapyairspy、soapyhackrf 等等,視您的硬體而定。即使一個都沒有,FoxSDR 也能完全正常運作,只要使用內建的訊號產生器或 I/Q 檔案播放即可。

組建

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 是 Linux 不需要的那一個旗標。macOS 內建的是 LibreSSL 而不是 OpenSSL,而 Homebrew 刻意將 openssl@3 排除在預設搜尋路徑之外,因此 find_package(OpenSSL REQUIRED) 無法自行找到它。OpenSSL 用於密碼摘要的基本運算,以及外掛程式目錄的 HTTPS 用戶端;Windows 則改用 CNG 與 WinHTTP,所以在那裡它不是相依元件。

接著:

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

在斷定任何東西能運作之前,請先執行 --selftest。它會在無頭模式下驅動真實的 DSP 鏈路,並驗證已知的頻譜峰值,因此能抓出那種連結沒問題、單元測試也通過,但算出錯誤數字的組建。

有一項測試會開啟真正的視窗。在 Linux CI 上這需要 Xvfb;在 macOS 上,只要從一般已登入的圖形介面工作階段執行測試,應該就沒有問題。

您幾乎一定會需要的那一個修補

有兩個函式使用 Linux 的 /proc 來尋找執行檔所在的目錄,而 macOS 上並沒有這個東西:

  • src/core/band_plan.cpp,位於 BandPlan::defaultDir()
  • src/core/plugin_host.cpp,約在第 888 行

兩者的做法都是:

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

在 macOS 上這會失敗,ec 會被設定,路徑維持空白,兩者都會退回使用相對於目前目錄的路徑。不會當機 — 但除非您剛好從組建目錄啟動,否則應用程式會找不到它的頻段規劃或外掛程式。修正方法是加入一個使用 _NSGetExecutablePath 的 __APPLE__ 分支,而這兩個檔案都已經有可以掛上它的 #ifdef 結構:

#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

並在其他平台標頭旁加入 #include <mach-o/dyld.h> 與 #include <climits>。_NSGetExecutablePath 可能傳回含有符號連結與 .. 的路徑,因此值得再經過 fs::canonical 處理。

第一個函式有對應的測試 — test_band_plan 會驗證 defaultDir() 以 bandplans 結尾,而且絕不是一般檔案 — 所以無論成功與否,您都會得到明確的訊號。

哪些功能無法運作,也不值得追查

  • 沒有當機報告。當機處理程式建立在 dbghelp 之上,僅限 Windows。
  • 使用情況報告尚未經過測試。在 Windows 以外,報告由 Linux 組建所用的同一個 HTTPS 傳送程式送出,因此 Mac 組建應該會像 Linux 一樣回報;但目前還沒有人在 Mac 上檢查過。
  • 視窗會保留標題列。src/gui/win_frame.cpp 透過 WM_NCCALCSIZE 與 WM_NCHITTEST 實作無邊框視窗;它的整個主體都位於 #ifdef _WIN32 之內,因此在其他平台上會編譯成空無一物,視窗看起來就是一般的樣子。只影響外觀。

以上沒有任何一項會讓接收機無法運作。

頻段規劃

0.81.0 內建九套頻段規劃 — 全球、三個 ITU 區域,以及英國、美國、加拿大、日本與澳洲。CMake 在每個平台上都會把它們放到組建出的執行檔旁,因此組建完成後,您應該會有:

build/resources/bandplans/*.json

在應用程式的顯示 → 地區中選擇您的地區。如果選擇器是空的,或圖層始終沒有畫出來,那是上述的 /proc/self/exe 問題,而不是缺少檔案 — 請先檢查 build/resources/bandplans/ 是否存在。

參考:Linux CI 組建流程

.github/workflows/build.yml 在 ubuntu-latest 上組建,是最接近已知可行的非 Windows 組建。它的相依元件清單對應如下:

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-devmacOS SDK 中已內建
libx11-dev, libwayland-dev, libxkbcommon-dev, …不需要 — GLFW 使用 Cocoa
libasound2-dev不需要 — PortAudio 使用 CoreAudio
xvfb在圖形介面工作階段中不需要

設定與組建指令在其他方面完全相同。

如果您成功了

請告訴我們。一個真的有人執行過的 Mac 組建,比這一頁更有價值,而第一個做到的人,會讓「未經驗證」變成受支援的平台。請到 Beta 測試計畫告訴我們,或寫信至 [email protected]。

授權條款

FoxSDR 採用 PolyForm Noncommercial 授權 — 非商業用途免費,而自行組建它完全在此範圍之內。商業用途需要另外取得授權。納入專案的第三方元件保留各自的授權,列於 third_party/THIRD_PARTY.md。