FoxSDR 0.99.39 · BETA CÔNG KHAI
Bản dịch máy
← Quay lại FoxSDR

Dựng từ mã nguồn · Apple silicon và Intel

Dựng trên macOS

Chưa ai hoàn thành bản dựng này. FoxSDR được phát triển trên Windows và có một tác vụ CI trên Linux đạt ở mọi commit. macOS chưa bao giờ được thử. Mọi thứ trên trang này được suy ra từ các tệp dựng thật và công thức Linux đang hoạt động đó — nhưng bản thân bản dựng chưa được kiểm chứng. Hãy chuẩn bị gặp những điều trang này không nhắc tới, và vui lòng báo cho chúng tôi khi bạn gặp.

Phần khó đã được làm xong. Dự án dựng được và đạt toàn bộ bộ kiểm thử trên Linux trong CI, nên nhánh mã không dành cho Windows thực sự được chạy chứ không chỉ trên lý thuyết. Những gì dưới đây là sự khác biệt giữa nhánh đó và một máy Mac.

Những gì bạn cần

Mọi thứ trừ SoapySDR và OpenSSL đều được đưa kèm trong third_party/: GLFW 3.4, Dear ImGui, PortAudio, pffft, nlohmann/json, tweetnacl và cpp-httplib đều được dựng từ mã nguồn ngay trong cây mã. GLFW và PortAudio đưa kèm có hỗ trợ macOS thật của riêng chúng — Cocoa và CoreAudio — nên chúng sẽ không cần gì từ bạn.

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

CMake 3.20 trở lên. Dự án dùng C++20 với CMAKE_CXX_STANDARD_REQUIRED ON, nên một Xcode cũ sẽ thất bại ngay ở bước cấu hình thay vì thất bại bí ẩn về sau.

Trên máy Mac, SoapySDR là thứ giao tiếp với radio USB. Từ 0.91.0, FoxSDR có driver riêng cho các dòng RTL-SDR, HackRF, Airspy, Mirics và RX888, nhưng tầng truyền USB của chúng chỉ tồn tại cho Windows (WinUSB) và Linux (usbfs): trên macOS tầng đó được dựng thành một bản giả không tìm thấy gì, nên mọi máy thu USB đều đi qua SoapySDR::Device::enumerate() và những mô-đun SoapySDR nào bạn cài là những gì nó dùng được. brew install soapyrtlsdr, soapyairspy, soapyhackrf và tương tự, tùy phần cứng của bạn. FoxSDR vẫn chạy hoàn toàn bình thường khi không có mô-đun nào, bằng bộ tạo tín hiệu tích hợp hoặc phát lại tệp I/Q.

Dựng

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 là cờ duy nhất mà Linux không cần. macOS đi kèm LibreSSL thay vì OpenSSL, và Homebrew cố ý giữ openssl@3 ngoài đường dẫn tìm kiếm mặc định, nên find_package(OpenSSL REQUIRED) sẽ không tự tìm thấy nó. OpenSSL được dùng cho các hàm nguyên thủy băm mật khẩu và cho HTTPS client của danh mục plugin; Windows dùng CNG và WinHTTP thay thế, đó là lý do nó không phải là một phụ thuộc ở đó.

Sau đó:

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

Hãy chạy --selftest trước khi kết luận bất cứ điều gì hoạt động. Nó chạy chuỗi DSP thật mà không cần giao diện và kiểm tra một đỉnh phổ đã biết, nên nó bắt được một bản dựng liên kết trơn tru, đạt các kiểm thử đơn vị, nhưng tính ra những con số sai.

Một bài kiểm thử mở một cửa sổ thật. Trên CI Linux, việc đó cần Xvfb; trên macOS chỉ cần chạy các bài kiểm thử từ một phiên giao diện đồ họa đã đăng nhập bình thường và mọi thứ sẽ ổn.

Bản vá gần như chắc chắn bạn sẽ cần

Hai hàm tìm thư mục chứa chính tệp thực thi bằng /proc của Linux, vốn không tồn tại trên macOS:

  • src/core/band_plan.cpp, trong BandPlan::defaultDir()
  • src/core/plugin_host.cpp, quanh dòng 888

Cả hai đều làm:

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

Trên macOS việc đó thất bại, ec được đặt, đường dẫn vẫn trống, và cả hai lùi về một đường dẫn tương đối so với thư mục hiện tại. Không có gì bị sập — nhưng ứng dụng sẽ không tìm thấy quy hoạch băng tần hay plugin của nó trừ khi bạn tình cờ khởi chạy nó từ thư mục dựng. Cách sửa là một nhánh __APPLE__ dùng _NSGetExecutablePath, và cả hai tệp đều đã có cấu trúc #ifdef để gắn nó vào:

#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

cùng với #include <mach-o/dyld.h> và #include <climits> bên cạnh các header nền tảng khác. _NSGetExecutablePath có thể trả về một đường dẫn chứa liên kết tượng trưng và .., đó là lý do nên cho nó chạy qua fs::canonical.

Có một bài kiểm thử cho hàm thứ nhất — test_band_plan kiểm tra rằng defaultDir() kết thúc bằng bandplans và không bao giờ là một tệp thường — nên bạn nhận được tín hiệu theo cả hai hướng.

Những gì sẽ không hoạt động, và không đáng để theo đuổi

  • Không có báo cáo sự cố. Trình xử lý sự cố được xây dựng trên dbghelp và chỉ có trên Windows.
  • Báo cáo sử dụng chưa được kiểm thử. Ngoài Windows, báo cáo được gửi bằng cùng bộ gửi HTTPS mà bản dựng Linux dùng, nên bản dựng Mac lẽ ra sẽ báo cáo giống như Linux; nhưng chưa ai kiểm tra điều này trên Mac.
  • Cửa sổ vẫn giữ thanh tiêu đề. src/gui/win_frame.cpp triển khai cửa sổ không viền thông qua WM_NCCALCSIZE và WM_NCHITTEST; toàn bộ thân của nó nằm trong #ifdef _WIN32, nên ở nơi khác nó được biên dịch thành rỗng và cửa sổ đơn giản trông bình thường. Chỉ ảnh hưởng về hình thức.

Không điều nào trong số này ngăn máy thu hoạt động.

Quy hoạch băng tần

0.81.0 đi kèm chín quy hoạch băng tần — thế giới, ba khu vực ITU, và Anh, Mỹ, Canada, Nhật Bản và Úc. CMake đặt chúng cạnh tệp nhị phân đã dựng trên mọi nền tảng, nên sau khi dựng bạn sẽ có:

build/resources/bandplans/*.json

Chọn khu vực của bạn trong ứng dụng ở Hiển thị → Khu vực. Nếu bộ chọn trống hoặc lớp phủ không bao giờ được vẽ, đó là vấn đề /proc/self/exe ở trên chứ không phải thiếu tệp — hãy kiểm tra build/resources/bandplans/ có tồn tại trước đã.

Tham khảo: công thức CI trên Linux

.github/workflows/build.yml dựng trên ubuntu-latest và là thứ gần nhất với một bản dựng không phải Windows đã biết là tốt. Danh sách phụ thuộc của nó chuyển đổi như sau:

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-devđã có sẵn trong macOS SDK
libx11-dev, libwayland-dev, libxkbcommon-dev, …không cần — GLFW dùng Cocoa
libasound2-devkhông cần — PortAudio dùng CoreAudio
xvfbkhông cần trong một phiên giao diện đồ họa

Ngoài ra các lệnh cấu hình và dựng giống hệt nhau.

Nếu bạn làm cho nó chạy được

Hãy báo cho chúng tôi. Một bản dựng Mac mà ai đó đã thực sự chạy đáng giá hơn trang này, và người đầu tiên làm được sẽ biến “chưa được kiểm chứng” thành một nền tảng được hỗ trợ. Chương trình beta là nơi để nói điều đó, hoặc viết thư tới [email protected].

Giấy phép

FoxSDR theo giấy phép PolyForm Noncommercial — miễn phí cho mục đích phi thương mại, và tự dựng nó cho riêng mình hoàn toàn nằm trong phạm vi đó. Sử dụng thương mại cần giấy phép riêng. Các thành phần bên thứ ba đưa kèm giữ nguyên giấy phép của chúng, được liệt kê trong third_party/THIRD_PARTY.md.