ソースビルド · Apple シリコンと Intel
macOS でのビルド
このビルドを最後までやり遂げた人は、まだいません。FoxSDR は Windows で開発されており、コミットごとに合格する 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 以降。プロジェクトは CMAKE_CXX_STANDARD_REQUIRED ON 付きの C++20 なので、古い Xcode では、あとになって原因不明で失敗するのではなく、configure の段階で失敗します。
Mac では、USB の SDR と通信するのは 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 など、お手持ちのハードウェアに合わせてインストールしてください。これらが 1 つもなくても、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 には OpenSSL ではなく LibreSSL が付属し、Homebrew は意図的に openssl@3 を既定の検索パスから外しているので、find_package(OpenSSL REQUIRED) は自力ではそれを見つけられません。OpenSSL はパスワードダイジェストのプリミティブと、プラグインカタログの HTTPS クライアントに使われます。Windows では代わりに CNG と WinHTTP を使うため、そこでは依存関係になりません。
次に:
ctest --test-dir build --output-on-failure
./build/cascade --selftest
何かが動くと結論づける前に、--selftest を実行してください。これは実際の DSP チェーンをヘッドレスで動かし、既知のスペクトラムピークを検証します。そのため、きれいにリンクでき、単体テストにも合格するのに、間違った数値を計算するビルドを見つけられます。
1 つのテストは実際のウィンドウを開きます。Linux の CI では Xvfb が必要ですが、macOS では通常のログイン済み GUI セッションからテストを実行すれば問題ないはずです。
ほぼ確実に必要になるパッチ
2 つの関数が、Linux の /proc を使って実行ファイル自身のディレクトリを探しています。これは macOS には存在しません:
BandPlan::defaultDir()内のsrc/core/band_plan.cppsrc/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 を通しておく価値があります。
1 つ目にはテストがあります。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 には 9 つのバンドプランが付属しています。全世界、ITU の 3 つの地域、そして英国、米国、カナダ、日本、オーストラリアです。CMake はどのプラットフォームでも、ビルドしたバイナリの隣にそれらを配置するので、ビルド後には次のようになっているはずです:
build/resources/bandplans/*.json
アプリの画面 → 地域で地域を選んでください。選択肢が空だったり、オーバーレイが描かれなかったりする場合は、ファイルがないのではなく、上で説明した /proc/self/exe の問題です。まず build/resources/bandplans/ が存在するかを確認してください。
参考:Linux CI の手順
.github/workflows/build.yml は ubuntu-latest 上でビルドされ、Windows 以外で動作が確認されたビルドとしては最も近いものです。その依存関係の一覧は、次のように置き換えられます:
| 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 | macOS SDK にすでに含まれています |
libx11-dev, libwayland-dev, libxkbcommon-dev, … | 不要 (GLFW は Cocoa を使用) |
libasound2-dev | 不要 (PortAudio は CoreAudio を使用) |
xvfb | GUI セッションでは不要 |
configure とビルドのコマンドは、それ以外は同じです。
うまく動いたら
ぜひお知らせください。実際に誰かが動かした Mac 版は、このページよりも価値があります。最初にそれを成し遂げた人が、「未検証」をサポート対象のプラットフォームに変えるのです。ベータプログラムでお知らせいただくか、[email protected] までご連絡ください。
ライセンス
FoxSDR は PolyForm Noncommercial です。非商用利用は無料で、自分のためにビルドすることはまさにその範囲内です。商用利用には別途ライセンスが必要です。同梱のサードパーティ製コンポーネントにはそれぞれのライセンスが適用され、third_party/THIRD_PARTY.md に一覧があります。