FoxSDR 0.99.39 · オープンベータ
機械翻訳
← FoxSDR に戻る

ソースビルド · 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.cpp
  • 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 を通しておく価値があります。

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 以外で動作が確認されたビルドとしては最も近いものです。その依存関係の一覧は、次のように置き換えられます:

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 を使用)
xvfbGUI セッションでは不要

configure とビルドのコマンドは、それ以外は同じです。

うまく動いたら

ぜひお知らせください。実際に誰かが動かした Mac 版は、このページよりも価値があります。最初にそれを成し遂げた人が、「未検証」をサポート対象のプラットフォームに変えるのです。ベータプログラムでお知らせいただくか、[email protected] までご連絡ください。

ライセンス

FoxSDR は PolyForm Noncommercial です。非商用利用は無料で、自分のためにビルドすることはまさにその範囲内です。商用利用には別途ライセンスが必要です。同梱のサードパーティ製コンポーネントにはそれぞれのライセンスが適用され、third_party/THIRD_PARTY.md に一覧があります。