SpicyRPN Release 2.0.0 distribution
Distribute the release-specific source ZIP and compiled manual from spicyrpn.com. The US$1.99 App Store price pays for the integrated, easy-to-install iOS distribution. Original code and documentation use MIT; GMP, MPFR, and MPC are linked under LGPLv3-or-later. See LICENSING.md for the component terms.
Prepare the tools and source package
These instructions validate and archive an app built from the published source ZIP. Download the matching source ZIP, PDF, PDF ZIP, and SHA256SUMS.txt from spicyrpn.com. Keep the downloads together, then verify:
shasum -a 256 -c SHA256SUMS.txt
Use a native Terminal on an Apple-silicon or Intel Mac with a suitable full Xcode installation and its platform SDKs. Install Python 3.9 or later for the bundle verifier. Launch Xcode once to complete setup, select the intended tools, and prepare your signing account, certificates, and profiles. Follow the tool checks in BUILDING.md.
The package already contains the pinned GMP, MPFR, and MPC source archives. Build from a path without spaces, using the supported deployment defaults. Clear earlier library-build overrides before building the unmodified sources:
unset MACOSX_DEPLOYMENT_TARGET IOS_SIM_DEPLOYMENT_TARGET IOS_DEVICE_DEPLOYMENT_TARGET
unset SPICYRPN_MATH_PATCH_DIR
Use Apple's standard EULA, including its open-source modification and reverse-engineering exception. Any custom app terms must preserve the GNU libraries' LGPL permissions. The app's Credits tab explicitly permits library modification and reverse engineering to debug those modifications. The MIT grant for original code and documentation is in the MIT tab.
Prepare this source notice for the App Store description, alongside the app's download information (replace the release number when publishing a later release):
Source code and licenses: SpicyRPN's original code and documentation use the MIT License. GMP, MPFR, and MPC are used under LGPLv3-or-later. The complete source and rebuild package for version 2.0.0 is available at no additional charge at https://spicyrpn.com/ as SpicyRPN-2.0.0-source.zip, including instructions for rebuilding with modified libraries.
Before making the binary available, verify that the listing's directions lead to that exact downloadable package.
Build and validate the packaged sources
From the directory containing the downloads, use a fresh extraction of the ZIP for the release build. The following commands replace the disposable verification directory so that an older extracted file cannot be mixed into this build:
rm -rf /tmp/SpicyRPN-source-check
unzip SpicyRPN-2.0.0-source.zip -d /tmp/SpicyRPN-source-check
cd /tmp/SpicyRPN-source-check/SpicyRPN-2.0.0
shasum -a 256 -c SOURCE-SHA256SUMS.txt
Continue from that extracted source root. Build only the library destinations needed for the release, following BUILDING.md. For Mac:
bash Scripts/build-math-macos-universal.sh --clean
Run the native unit and UI tests on Apple silicon and on a compatible Intel Mac using that same source ZIP. The universal app supports macOS 15.0 and later on compatible models of both architectures. Rosetta testing on Apple silicon is useful additional coverage; retain a native Intel test run. iOS/iPadOS supports 18.0 and later with arm64 libraries; its arm64 Simulator app runs on Apple silicon. Select destinations, configure signing, and complete the tests as described in BUILDING.md before archiving.
Before archiving, recheck that no packaged source was changed during setup or testing. If the check fails, apply the changes to the original sources and create and test a new distribution. Otherwise archive the Mac Release configuration from the extracted sources:
shasum -a 256 -c SOURCE-SHA256SUMS.txt
After the source check succeeds:
xcodebuild archive -project SpicyRPN.xcodeproj -scheme SpicyRPN \
-configuration Release -destination 'generic/platform=macOS' \
-archivePath build/SpicyRPN-macOS.xcarchive \
'ARCHS=arm64 x86_64' ONLY_ACTIVE_ARCH=NO
spicy_mac_app=build/SpicyRPN-macOS.xcarchive/Products/Applications/SpicyRPN.app
python3 Scripts/verify-macos-universal.py "$spicy_mac_app"
The verifier uses Xcode's lipo and vtool to check version 2.0.0/build 1, macOS minimum 15.0, and both architectures in the main executable and bundled Mach-O files. It does not execute the app or validate signing or submission. Validate the signed archive and its privacy report in Xcode/App Store Connect, including the SQLite required-reason API note in UI-Testing.md. Confirm that the privacy manifest is bundled. Use the corresponding device archive checks for the iOS release.
If validation requires a source change, return to the original working source root, apply the change there, and regenerate the complete publication set. Then validate a fresh extraction again. Keep the published ZIP identical to the one used for the successful release build.
Verify license presentation and library rebuilding
On both the Mac and iOS builds, open HELP → Licenses & Acknowledgments. Check Credits, MIT, GPLv3, and LGPLv3; confirm that all full texts load offline, the copyright is correct, and the source link opens the download site. LicenseResourceTests and LicensePresentationUITests cover bundled license availability and navigation without changing the calculation.
In a separate disposable extraction of the same ZIP, follow Rebuilding with modified libraries with a small, reviewed library patch. Verify that the patch is applied before compilation, rebuild the selected libraries, then clean/relink and run the app using a separate developer's signing team and bundle identifiers. Check both the universal Mac build and an iOS device build. Retain the patch, commands, tool versions, and test results with the release validation records. This demonstrates the documented rebuild route using only the published package and separately installed development tools.
Use the original, unchanged extraction for the submitted archive. The modified copy is a rebuild test; its patches and personal signing changes do not belong in the official 2.0.0 archive. The Python build-flow tests exercise patch application with Apple-tool fixtures; actual signing and device execution are checked on a Mac with Xcode.
Retain the validated package
Retain the exact source ZIP, PDF, PDF ZIP, and SHA256SUMS.txt used for validation with the matching distributed app. Make the matching source package available at no additional charge to app recipients. Keep the store source notice and in-app link pointing to the appropriate downloads; retain older packages for their associated binary distributions. The extracted copy's build/ directory contains validation products, not replacement downloads.
What the source ZIP includes
Scripts/release-files.txt is the explicit 2.0.0 inventory. Add new build inputs and their notices before packaging; never add local credentials or generated output. The packager rejects missing files and unlisted additions under the app, tests, project, manual, documentation, or script directories.
The ZIP expands to SpicyRPN-2.0.0/ and includes app/C bridge sources, project settings, resources, tests and fixtures, app/PDF build scripts, manual sources, license texts, and complete pinned GMP/MPFR/MPC source archives. The redundant expanded GMP/MPFR trees are omitted because the recipes extract verified archives. Their upstream notices remain intact inside those archives.
The ZIP excludes version-control internals, per-user Xcode state, credentials, build products, caches, website publishing tools, and generated manual files. No live checkout or version-control tools are required to build it. Xcode and Apple's SDKs are supplied separately. The internal SOURCE-SHA256SUMS.txt records every packaged input; the packager checks the finished ZIP against those inputs before making the output directory available.