소스 빌드 · Apple 실리콘 및 Intel
macOS에서 빌드하기
아직 이 빌드를 끝까지 해낸 사람은 없습니다. FoxSDR는 Windows에서 개발되며, 모든 커밋에서 통과하는 Linux CI 작업이 있습니다. macOS는 시도된 적이 없습니다. 이 페이지의 모든 내용은 실제 빌드 파일과 동작하는 Linux 레시피에서 도출했지만 — 빌드 자체는 검증되지 않았습니다. 이 페이지에 없는 문제를 만날 것으로 예상하시고, 그럴 때는 꼭 알려 주세요.
어려운 부분은 이미 끝났습니다. 프로젝트는 CI의 Linux에서 빌드되고 전체 테스트 스위트를 통과하므로, 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)"
Linux에는 필요 없는 유일한 플래그가 OPENSSL_ROOT_DIR입니다. 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 체인을 화면 없이 구동하고 알려진 스펙트럼 피크를 검사하므로, 링크도 깔끔하게 되고 단위 테스트도 통과하지만 잘못된 숫자를 계산하는 빌드를 잡아냅니다.
테스트 하나는 실제 창을 엽니다. Linux CI에서는 Xvfb가 필요하지만, macOS에서는 평소처럼 로그인한 GUI 세션에서 테스트를 실행하면 문제없을 것입니다.
거의 확실히 필요할 패치 하나
두 함수가 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가 아닌 빌드 중에서는 정상 동작이 확인된 것에 가장 가깝습니다. 그 의존성 목록은 다음과 같이 대응됩니다:
| 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 세션에서는 필요 없음 |
구성 및 빌드 명령은 그 외에는 동일합니다.
빌드에 성공했다면
알려 주세요. 누군가 실제로 실행해 본 Mac 빌드는 이 페이지보다 값지며, 처음 해내는 사람이 "검증되지 않음"을 지원 플랫폼으로 바꿉니다. 베타 프로그램에서 알려 주시거나 [email protected] 주소로 연락해 주세요.
라이선스
FoxSDR는 PolyForm Noncommercial 라이선스입니다 — 비상업적 용도로는 무료이며, 직접 쓰려고 빌드하는 것은 분명히 그 범위 안에 있습니다. 상업적 사용에는 별도의 라이선스가 필요합니다. 포함된 서드파티 구성 요소는 각자의 라이선스를 유지하며, third_party/THIRD_PARTY.md에 나열되어 있습니다.