Skip to content

Commit cf6c0eb

Browse files
committed
merge release/2.4.2 into main
2 parents 40ff801 + ee30498 commit cf6c0eb

50 files changed

Lines changed: 712 additions & 146 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/packaging-ci.yml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ jobs:
2626
- name: Validate packaging helper scripts
2727
run: |
2828
bash -n scripts/package-debian-source.sh
29+
bash -n scripts/package-alpine-apkbuild.sh
30+
bash -n scripts/package-fedora-srpm.sh
2931
bash -n scripts/package-rpm-srpm.sh
3032
bash -n scripts/publish-aur.sh
3133
bash -n scripts/publish-homebrew.sh
@@ -75,6 +77,32 @@ jobs:
7577
- name: Build SRPM
7678
run: make package-rpm-srpm
7779

80+
fedora-srpm:
81+
runs-on: ubuntu-24.04
82+
name: Fedora SRPM
83+
env:
84+
CMAKE_BUILD_PARALLEL_LEVEL: 1
85+
steps:
86+
- uses: actions/checkout@v5
87+
with:
88+
fetch-depth: 0
89+
90+
- name: Build SRPM inside Fedora
91+
run: make package-fedora-srpm
92+
93+
alpine-apkbuild:
94+
runs-on: ubuntu-24.04
95+
name: Alpine APKBUILD
96+
env:
97+
CMAKE_BUILD_PARALLEL_LEVEL: 1
98+
steps:
99+
- uses: actions/checkout@v5
100+
with:
101+
fetch-depth: 0
102+
103+
- name: Build package inside Alpine
104+
run: make package-alpine-apkbuild
105+
78106
nix:
79107
runs-on: ubuntu-24.04
80108
name: Nix Flake

.github/workflows/publish-debian-source.yml

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ on:
55
tags:
66
- "*.*.*"
77
workflow_dispatch:
8+
inputs:
9+
debian_revision:
10+
description: "Debian revision for the source upload"
11+
required: false
12+
default: "1"
813

914
permissions:
1015
contents: read
@@ -55,7 +60,9 @@ jobs:
5560
- name: Build Debian source package
5661
run: ./scripts/package-debian-source.sh "${{ steps.meta.outputs.version }}"
5762
env:
58-
DEBIAN_DISTRIBUTION: unstable
63+
DEBIAN_DISTRIBUTION: ${{ vars.PPA_UBUNTU_SERIES || 'noble' }}
64+
DEBIAN_REVISION: ${{ github.event.inputs.debian_revision || '1' }}
65+
DEBIAN_PPA_TARGET: ${{ vars.PPA_TARGET || 'ppa:0state/icey' }}
5966

6067
- uses: actions/upload-artifact@v4
6168
with:
@@ -76,9 +83,11 @@ jobs:
7683
env:
7784
PPA_GPG_PRIVATE_KEY: ${{ secrets.PPA_GPG_PRIVATE_KEY }}
7885
PPA_PUBLISH_ENABLED: ${{ vars.PPA_PUBLISH_ENABLED }}
86+
PPA_UBUNTU_SERIES: ${{ vars.PPA_UBUNTU_SERIES || 'noble' }}
7987
run: |
8088
if [[ "${PPA_PUBLISH_ENABLED:-false}" == "true" && -n "${PPA_GPG_PRIVATE_KEY:-}" ]]; then
8189
echo "publish=true" >> "$GITHUB_OUTPUT"
90+
echo "Publishing Ubuntu series: ${PPA_UBUNTU_SERIES:-noble}"
8291
else
8392
echo "publish=false" >> "$GITHUB_OUTPUT"
8493
echo "Skipping PPA publish: set PPA_PUBLISH_ENABLED=true after the Launchpad account is ready and PPA_GPG_PRIVATE_KEY is configured."
@@ -130,4 +139,4 @@ jobs:
130139
echo "No Debian source changes file found to upload" >&2
131140
exit 1
132141
fi
133-
./scripts/publish-ppa.sh "$changes_file" "${PPA_TARGET:-ppa:0state/icey}"
142+
bash ./scripts/publish-ppa.sh "$changes_file" "${PPA_TARGET:-ppa:0state/icey}"

.plans/distribution-blowup.md

Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
# Distribution Blowup Plan
2+
3+
> Get icey into every package manager that matters. Every registry page is a backlink to 0state.com/icey. Every mirror multiplies it.
4+
5+
This plan covers everything outside vcpkg and ConanCenter, which are tracked in [package-managers.md](package-managers.md).
6+
7+
---
8+
9+
## Current State
10+
11+
Packaging is no longer hypothetical. AUR and the dedicated Homebrew tap are live, the standalone Nix flake is validated in CI, and the remaining distro recipes now exist in-tree. Packaging CI now exercises release metadata, Debian source-package generation, RPM SRPM staging, and the repo-root flake build on every mainline push.
12+
13+
| Registry | File exists | Published | Blocker |
14+
|---|---|---|---|
15+
| vcpkg | yes | no | see package-managers.md |
16+
| Conan | yes | no | see package-managers.md |
17+
| Homebrew | yes (`packaging/homebrew/`) | yes (`nilstate/homebrew-icey`) | formula needs ongoing release automation from `icey` |
18+
| Arch AUR | yes (`packaging/arch/`) | yes (`icey`) | keep pkgrel and checksum in sync with retags |
19+
| Debian | yes (`packaging/debian/`) | no | Launchpad / sponsor step still external |
20+
| Nix | yes (`flake.nix`, `packaging/nix/`) | yes (`nix build github:nilstate/icey`) | needs nixpkgs PR |
21+
| Fedora/RPM | yes (`packaging/rpm/`) | no | needs SRPM / Bugzilla review |
22+
| Alpine | yes (`packaging/alpine/`) | no | needs aports PR |
23+
| MacPorts | yes (`packaging/macports/`) | no | needs ports submission |
24+
| Spack | yes (`packaging/spack/`) | no | needs upstream PR |
25+
| conda-forge | yes (`packaging/conda-forge/`) | no | needs staged-recipes feedstock |
26+
27+
---
28+
29+
## Pre-Publish Fixes
30+
31+
Before pushing deeper into curated distro repos, keep these source-package surfaces healthy:
32+
33+
1. **vcpkg portfile** — keep `REF` and `SHA512` pinned to the tagged release
34+
2. **Homebrew formula** — keep `icey.rb` and the live tap formula in sync with the tagged tarball hash
35+
3. **Conan test_package/build/** — keep local build artifacts ignored and out of commits
36+
37+
These are the integrity checks. Everything downstream depends on a clean tagged release with real hashes.
38+
39+
---
40+
41+
## Tier 1: Self-Service, No Gatekeepers
42+
43+
These can ship within days. No review process, no sponsorship needed.
44+
45+
### 1. Arch AUR
46+
47+
Keep the published `icey` package on `aur.archlinux.org` in lockstep with the tagged release.
48+
49+
- create an AUR account if needed
50+
- `git clone ssh://aur@aur.archlinux.org/icey.git`
51+
- copy PKGBUILD and .SRCINFO from `packaging/arch/`
52+
- push
53+
54+
Repology auto-indexes AUR packages. This alone gets icey on repology.org.
55+
56+
### 2. Homebrew Tap
57+
58+
Maintain `nilstate/homebrew-icey` as the public tap.
59+
60+
- keep `icey.rb`, `libdatachannel.rb`, and `icey-server.rb` live in the tap
61+
- users install via `brew tap nilstate/icey && brew install icey`
62+
- keep `icey-server` publication in `icey-cli`; keep `icey` publication in `icey`
63+
64+
### 3. Ubuntu PPA (Launchpad)
65+
66+
Use the existing `packaging/debian/` files.
67+
68+
- create a PPA on launchpad.net under nilstate or 0state
69+
- `debuild -S` and `dput` the source package
70+
- target latest Ubuntu LTS + current release
71+
- PPA pages show up on pkgs.org and launchpad search
72+
- GitHub-side source-package build automation and PPA signing-key secrets are now in place; the remaining blocker is registering the public key with the Launchpad account and doing the first upload
73+
74+
### 4. Nix Flake for icey lib
75+
76+
icey-cli already has a flake. icey now also has a repo-root flake for the library.
77+
78+
- output a nix package with split `out` / `dev` outputs
79+
- publish as a standalone flake: `nix build github:nilstate/icey`
80+
- prerequisite for the nixpkgs PR in tier 2
81+
82+
---
83+
84+
## Tier 2: Curated Registry PRs
85+
86+
These require PRs and review, but massively expand reach.
87+
88+
### 5. Nixpkgs
89+
90+
Submit a PR to `github.com/NixOS/nixpkgs`.
91+
92+
- add `pkgs/development/libraries/icey/default.nix`
93+
- include the nix flake from tier 1 as reference
94+
- nixpkgs has 100K+ packages and active contributors
95+
- once merged, appears on search.nixos.org and repology
96+
97+
### 6. Homebrew Core
98+
99+
After the tap proves stability, submit to homebrew-core.
100+
101+
- must meet [Acceptable Formulae](https://docs.brew.sh/Acceptable-Formulae) criteria
102+
- needs notable usage (GitHub stars, dependents, or known adopters)
103+
- homebrew-core formulas appear on formulae.brew.sh — high-traffic, indexed by search engines
104+
- every bottle mirror (china mirrors, corporate caches) carries the metadata
105+
106+
### 7. vcpkg + ConanCenter
107+
108+
Tracked in [package-managers.md](package-managers.md). Highest priority C++ registries.
109+
110+
---
111+
112+
## Tier 3: Distro Repos
113+
114+
Landing in an official distro repo is the biggest backlink multiplier. Debian alone has 400+ mirrors worldwide.
115+
116+
### 8. Fedora
117+
118+
- write a .spec file (use `cmake/icey_package.cmake` as starting point)
119+
- file a Bugzilla review request with SRPM
120+
- once approved, package lands in Fedora and syncs to EPEL (CentOS/Rocky/RHEL)
121+
- register on release-monitoring.org (Anitya) for automatic new-version tracking
122+
123+
### 9. Alpine
124+
125+
- write an APKBUILD
126+
- submit PR to `gitlab.alpinelinux.org/alpine/aports`
127+
- alpine is the default Docker base image — huge container audience
128+
- alpine package search (pkgs.alpinelinux.org) is well-indexed
129+
130+
### 10. Debian Proper
131+
132+
- file an RFP (Request for Package) bug on wnpp
133+
- find a Debian Developer to sponsor the upload
134+
- once in Debian unstable, it syncs to testing → stable
135+
- auto-syncs to Ubuntu universe, eliminating the need for the PPA long-term
136+
- 400+ mirrors worldwide, each hosting package metadata with homepage URL
137+
- appears on packages.debian.org, packages.ubuntu.com, tracker.debian.org
138+
139+
### 11. openSUSE
140+
141+
- submit to openSUSE Build Service (OBS)
142+
- OBS can cross-build for Fedora, Debian, Ubuntu, Arch, and SUSE from one spec
143+
- appears on software.opensuse.org package search
144+
145+
---
146+
147+
## Tier 4: Niche but High-Value
148+
149+
### 12. MacPorts
150+
151+
- write a Portfile
152+
- submit to `github.com/macports/macports-ports`
153+
- loyal macOS user base separate from Homebrew
154+
- appears on ports.macports.org
155+
156+
### 13. Spack
157+
158+
- write a `package.py` recipe
159+
- submit PR to `github.com/spack/spack`
160+
- HPC and scientific computing audience
161+
- appears on packages.spack.io
162+
163+
### 14. conda-forge
164+
165+
- create a feedstock via `conda-forge/staged-recipes`
166+
- ML and scientific Python users pull C++ deps through conda
167+
- appears on anaconda.org/conda-forge
168+
169+
---
170+
171+
## Backlink Mechanics
172+
173+
Every registry landing creates backlinks from multiple sources:
174+
175+
| Source | How | Volume |
176+
|---|---|---|
177+
| Registry page | homepage field → 0state.com/icey | 1 per registry |
178+
| Repology | auto-aggregates once in 2+ repos | 1 page, updated continuously |
179+
| pkgs.org | indexes Debian/Ubuntu/Fedora/Arch/Alpine | 1 per distro |
180+
| Distro package search | packages.debian.org, packages.ubuntu.com, etc | 1 per distro |
181+
| Mirror networks | Debian: 400+, Ubuntu: 300+, Fedora: 200+ | metadata on every mirror |
182+
| Downstream dependents | any project with `depends: icey` | grows organically |
183+
| Search engines | registry pages rank for "icey c++ install" etc | compounds over time |
184+
185+
### Metadata Consistency
186+
187+
Every packaging file must set the homepage to `https://0state.com/icey`. This is the backlink payload. Verify this in:
188+
189+
- `vcpkg.json``"homepage"`
190+
- `conanfile.py``url` and `homepage`
191+
- Homebrew formula → `homepage`
192+
- PKGBUILD → `url`
193+
- debian/control → `Homepage:`
194+
- .spec → `URL:`
195+
- APKBUILD → `url`
196+
- nix derivation → `meta.homepage`
197+
- Spack package.py → `homepage`
198+
- conda-forge meta.yaml → `home:`
199+
- MacPorts Portfile → `homepage`
200+
201+
---
202+
203+
## Execution Order
204+
205+
1. fix existing packaging files (SHA256, version pins, gitignore)
206+
2. push AUR (immediate, unblocks repology)
207+
3. create homebrew tap (immediate)
208+
4. create Ubuntu PPA (immediate)
209+
5. write nix flake for icey lib
210+
6. submit vcpkg + conan PRs (see package-managers.md)
211+
7. submit nixpkgs PR
212+
8. write fedora .spec, submit review
213+
9. write alpine APKBUILD, submit PR
214+
10. file debian RFP
215+
11. openSUSE OBS submission
216+
12. macports, spack, conda-forge
217+
218+
---
219+
220+
## Definition of Done
221+
222+
- icey installable from at least 6 public registries
223+
- 0state.com/icey as homepage in every package metadata file
224+
- icey appears on repology.org with version parity across registries
225+
- `brew install`, `apt install`, `pacman -S`, `nix build`, `vcpkg install`, `conan install` all work

CHANGELOG.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,28 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
66

77
## [Unreleased]
88

9+
## [2.4.2] - 2026-04-04
10+
11+
### Fixed
12+
13+
- Package-manager builds now accept the shared `libuv::uv` target exported by `vcpkg` and other system package layouts
14+
- Windows consumers no longer rely on backported export/linkage fixes for `Timeout`, `PacketFactory`, `Transaction`, and the base `uv` wrapper templates
15+
- FFmpeg-backed builds now propagate discovered library search directories so Windows link steps can resolve `avcodec.lib` and related FFmpeg libraries
16+
17+
## [2.4.1] - 2026-03-30
18+
19+
### Changed
20+
21+
- Release tooling now treats Conan like the rest of the package-manager surfaces:
22+
- `make release` seeds `packaging/conan/conandata.yml`
23+
- `make release-finalize` pins the tagged archive hash and runs the final consistency check
24+
- The documented release flow is now explicit about the post-tag finalize step instead of suggesting a pre-tag `release-check` that could only fail on placeholder hashes
25+
26+
### Fixed
27+
28+
- Alpine system-package builds now accept the shared `llhttp` targets exported by Alpine's `llhttp-dev` package instead of hard-linking `llhttp_static`
29+
- The local Conan recipe now builds from immutable tagged GitHub archives instead of exporting a live checkout into the package
30+
931
## [2.4.0] - 2026-03-27
1032

1133
### Added

Makefile

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
.PHONY: docs docs-install docs-xml docs-api-md docs-site docs-check docs-dev docs-docker clean-docs package-conan package-vcpkg package-arch package-homebrew package-debian-source package-nix package-rpm-srpm release release-check release-pin release-pin-vcpkg release-pin-arch release-pin-homebrew release-pin-alpine release-pin-macports release-pin-spack release-pin-conda
1+
.PHONY: docs docs-install docs-xml docs-api-md docs-site docs-check docs-dev docs-docker clean-docs package-conan package-vcpkg package-arch package-homebrew package-debian-source package-nix package-rpm-srpm package-fedora-srpm package-alpine-apkbuild release release-check release-pin release-finalize release-pin-conan release-pin-vcpkg release-pin-arch release-pin-homebrew release-pin-alpine release-pin-macports release-pin-spack release-pin-conda
22

33
DOCS_NPM = npm --prefix docs
44
DOCS_RUN = $(DOCS_NPM) run
@@ -83,6 +83,14 @@ package-nix:
8383
package-rpm-srpm:
8484
ICEY_RPM_STAGE_DIR="$(ICEY_RPM_STAGE_DIR)" RPMBUILD="$(RPMBUILD)" ./scripts/package-rpm-srpm.sh
8585

86+
## Validate the RPM SRPM flow inside a Fedora container
87+
package-fedora-srpm:
88+
CMAKE_BUILD_PARALLEL_LEVEL="$(CMAKE_BUILD_PARALLEL_LEVEL)" ./scripts/package-fedora-srpm.sh
89+
90+
## Validate the Alpine APKBUILD inside an Alpine container
91+
package-alpine-apkbuild:
92+
CMAKE_BUILD_PARALLEL_LEVEL="$(CMAKE_BUILD_PARALLEL_LEVEL)" ./scripts/package-alpine-apkbuild.sh
93+
8694
## Sync release metadata for VERSION, package recipes, and FetchContent examples
8795
release:
8896
@if [ -z "$(VERSION)" ]; then echo "usage: make release VERSION=2.4.0" >&2; exit 1; fi
@@ -93,7 +101,15 @@ release-check:
93101
@if [ -n "$(VERSION)" ]; then ./scripts/release-check.sh "$(VERSION)"; else ./scripts/release-check.sh; fi
94102

95103
## Pin release archive hashes for all package-manager recipes
96-
release-pin: release-pin-vcpkg release-pin-arch release-pin-homebrew release-pin-alpine release-pin-macports release-pin-spack release-pin-conda
104+
release-pin: release-pin-conan release-pin-vcpkg release-pin-arch release-pin-homebrew release-pin-alpine release-pin-macports release-pin-spack release-pin-conda
105+
106+
## After pushing a git tag, pin archive hashes and verify the release metadata
107+
release-finalize: release-pin release-check
108+
109+
## After pushing a git tag, pin the Conan source URL and sha256
110+
release-pin-conan:
111+
@if [ -z "$(VERSION)" ]; then echo "usage: make release-pin-conan VERSION=2.4.0" >&2; exit 1; fi
112+
./scripts/release-pin-conan.sh "$(VERSION)"
97113

98114
## After pushing a git tag, pin the vcpkg fallback archive ref and sha512
99115
release-pin-vcpkg:

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ ctest --test-dir build --output-on-failure
195195
include(FetchContent)
196196
FetchContent_Declare(icey
197197
GIT_REPOSITORY https://github.com/nilstate/icey.git
198-
GIT_TAG 2.4.0
198+
GIT_TAG 2.4.2
199199
)
200200
FetchContent_MakeAvailable(icey)
201201
target_link_libraries(myapp PRIVATE icey::base icey::net icey::http)

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.4.0
1+
2.4.2

0 commit comments

Comments
 (0)