FoxSDR 0.99.39 · ΑΝΟΙΧΤΗ BETA
Μηχανική μετάφραση
← Πίσω στο FoxSDR

Μεταγλώττιση από πηγαίο κώδικα · Apple silicon και Intel

Μεταγλώττιση σε macOS

Κανείς δεν έχει ολοκληρώσει ακόμη αυτή τη μεταγλώττιση. Το FoxSDR αναπτύσσεται σε Windows και έχει μια εργασία CI για Linux που περνά σε κάθε commit. Το 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, το SoapySDR είναι αυτό που επικοινωνεί με τα SDR USB. Από την 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 χωρίς γραφικό περιβάλλον και ελέγχει μια γνωστή κορυφή φάσματος, οπότε πιάνει ένα build που συνδέεται καθαρά, περνά τις δοκιμές μονάδας του και υπολογίζει λάθος αριθμούς.

Μία δοκιμή ανοίγει πραγματικό παράθυρο. Στο CI του Linux αυτό χρειάζεται Xvfb· σε macOS απλώς τρέξτε τις δοκιμές από μια κανονική συνεδρία γραφικού περιβάλλοντος με συνδεδεμένο χρήστη και θα πρέπει να είναι εντάξει.

Το ένα patch που σχεδόν σίγουρα θα χρειαστείτε

Δύο συναρτήσεις βρίσκουν τον φάκελο του ίδιου του εκτελέσιμου χρησιμοποιώντας το /proc του Linux, το οποίο δεν υπάρχει σε 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, η διαδρομή μένει κενή, και οι δύο καταφεύγουν σε διαδρομή σχετική με τον τρέχοντα φάκελο. Τίποτα δεν καταρρέει — αλλά η εφαρμογή δεν θα βρει τα σχέδια ζωνών ή τα πρόσθετά της, εκτός αν τύχει να την εκκινήσετε από τον φάκελο του build. Η διόρθωση είναι ένας κλάδος __APPLE__ που χρησιμοποιεί το _NSGetExecutablePath, και και τα δύο αρχεία έχουν ήδη τη δομή #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 η αναφορά στέλνεται από τον ίδιο αποστολέα HTTPS που χρησιμοποιεί το build του Linux, οπότε ένα build για Mac θα πρέπει να αναφέρει όπως το Linux· κανείς δεν το έχει ελέγξει ακόμη σε Mac.
  • Το παράθυρο κρατά τη γραμμή τίτλου του. Το src/gui/win_frame.cpp υλοποιεί το παράθυρο χωρίς πλαίσιο μέσω των WM_NCCALCSIZE και WM_NCHITTEST· ολόκληρο το σώμα του βρίσκεται μέσα σε #ifdef _WIN32, οπότε αλλού μεταγλωττίζεται σε τίποτα και το παράθυρο απλώς φαίνεται κανονικό. Μόνο αισθητικό.

Κανένα από αυτά δεν εμποδίζει τη λειτουργία του δέκτη.

Σχέδια ζωνών

Το 0.81.0 περιλαμβάνει εννέα σχέδια ζωνών — παγκόσμιο, τις τρεις περιοχές της ITU, και Ηνωμένο Βασίλειο, ΗΠΑ, Καναδά, Ιαπωνία και Αυστραλία. Το CMake τα τοποθετεί δίπλα στο μεταγλωττισμένο εκτελέσιμο σε κάθε πλατφόρμα, οπότε μετά από ένα build θα πρέπει να έχετε:

build/resources/bandplans/*.json

Επιλέξτε την περιοχή σας στην εφαρμογή στο Εμφάνιση → Περιοχή. Αν ο επιλογέας είναι κενός ή το επίπεδο δεν σχεδιάζεται ποτέ, αυτό είναι το παραπάνω πρόβλημα του /proc/self/exe και όχι αρχείο που λείπει — ελέγξτε πρώτα ότι υπάρχει το build/resources/bandplans/.

Αναφορά: η συνταγή CI του Linux

Το .github/workflows/build.yml μεταγλωττίζει σε ubuntu-latest και είναι ό,τι πιο κοντινό υπάρχει σε γνωστό λειτουργικό build εκτός 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-devυπάρχει ήδη στο SDK του macOS
libx11-dev, libwayland-dev, libxkbcommon-dev, …δεν χρειάζεται — το GLFW χρησιμοποιεί Cocoa
libasound2-devδεν χρειάζεται — το PortAudio χρησιμοποιεί CoreAudio
xvfbδεν χρειάζεται σε συνεδρία γραφικού περιβάλλοντος

Οι εντολές διαμόρφωσης και μεταγλώττισης είναι κατά τα άλλα ίδιες.

Αν το κάνετε να λειτουργήσει

Πείτε μας. Ένα build για Mac που το έχει πραγματικά τρέξει κάποιος αξίζει περισσότερο από αυτή τη σελίδα, και ο πρώτος που θα το κάνει μετατρέπει το «ανεπαλήθευτο» σε υποστηριζόμενη πλατφόρμα. Το πρόγραμμα beta είναι το μέρος για να το πείτε, ή γράψτε στο [email protected].

Άδεια χρήσης

Το FoxSDR διατίθεται με την άδεια PolyForm Noncommercial — δωρεάν για μη εμπορική χρήση, και η μεταγλώττισή του για δική σας χρήση εμπίπτει ξεκάθαρα σε αυτήν. Η εμπορική χρήση απαιτεί χωριστή άδεια. Τα ενσωματωμένα στοιχεία τρίτων διατηρούν τις δικές τους άδειες, που αναφέρονται στο third_party/THIRD_PARTY.md.