diff options
| author | CoprDistGit <infra@openeuler.org> | 2026-10-30 02:44:34 +0000 |
|---|---|---|
| committer | CoprDistGit <infra@openeuler.org> | 2026-10-30 02:44:34 +0000 |
| commit | 57aa0bb81eae54442c472be152e50bbf54a17ac7 (patch) | |
| tree | 66a262c00bdce94512bf7f6ebb70766477555874 /opencode.spec | |
| parent | 1b684a24cd76ca7aecefc62dec71a344b9f40c6d (diff) | |
automatic import of opencode
Diffstat (limited to 'opencode.spec')
| -rw-r--r-- | opencode.spec | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/opencode.spec b/opencode.spec new file mode 100644 index 0000000..7cd554a --- /dev/null +++ b/opencode.spec @@ -0,0 +1,233 @@ +# Source build of opencode 1.19.5 for openEuler 24.03 LTS SP4 (x86_64). +# +# Adapted from the openEuler EUR reference SRPM (user_76c6f026/oed-opencode-2509, +# opencode-1.19.5-1), which itself was rebuilt from the 24.03 LTS SP4 source +# build. The EUR upload endpoint rejects SRPMs of a few MB, so the reference +# spec fetched the upstream archive in %prep from a reachable GitHub proxy. +# This COPR build ships the archive in the SRPM instead (Source0) and %prep +# prefers it, so the build does not depend on a proxy being reachable. Node.js +# and Bun come from Huawei Cloud mirrors and the npm dependency tree from the +# Huawei npm mirror. The models.dev snapshot is small enough to ship compressed +# in the SRPM (Source1), keeping the build off the models.dev network API. +# +# The upstream source is pruned to the CLI + embedded Web UI workspace closure +# (console/stats/desktop/docs/web/storybook/slack/identity/containers/cli/ +# sdk-next/function removed). The ghostty-web dependency, which upstream pins +# to a GitHub commit, is switched to the published 0.3.0 npm package so the +# build does not need GitHub access. +# +# topdir: opencode-1.19.5 + +# Bun's single-file output embeds the version metadata in ELF sections; any +# strip (find-debuginfo/brp-strip) removes them and makes `opencode --version` +# fall back to the Bun runtime default, so both are disabled. +%global debug_package %{nil} +%global __strip /bin/true + +%global node_version 24.18.0 +%global node_sha256 55aa7153f9d88f28d765fcdad5ae6945b5c0f98a36881703817e4c450fa76742 +%global bun_version 1.4.4 +%global bun_sha256 93ca5a2abe45f3bcac6dd55baff8bb06c4ac824b70f89650b54e5c8b80dbef18 + +%global src_proxy https://ghfast.top/https://github.com/anomalyco/opencode/archive/refs/tags/v1.19.5.tar.gz + +Name: opencode +Version: 1.19.5 +Release: 1%{?dist} +Summary: The open source coding agent + +License: MIT +URL: https://github.com/anomalyco/opencode +# Source0 carries the upstream tarball (opencode-1.19.5/ top-level dir). +Source0: opencode-1.19.5.tar.gz +Source1: models-api.json.xz + +# The build downloads x86_64 Node.js/Bun binaries and produces a linux-x64 +# Bun single-file executable; only x86_64 builds are supported. +ExclusiveArch: x86_64 +BuildRequires: bash +BuildRequires: ca-certificates +BuildRequires: chrpath +BuildRequires: coreutils +BuildRequires: cpio +BuildRequires: curl +BuildRequires: findutils +BuildRequires: gcc +BuildRequires: gcc-c++ +BuildRequires: git +BuildRequires: glibc-devel +BuildRequires: grep +BuildRequires: gzip +BuildRequires: make +BuildRequires: patch +BuildRequires: python3 +BuildRequires: sed +BuildRequires: tar +BuildRequires: unzip +BuildRequires: which +BuildRequires: xz +BuildRequires: zip +Requires: glibc + +%description +opencode is an AI-powered development tool that runs coding agents in the +terminal. This package is compiled from the upstream TypeScript source using +Bun, and includes the embedded Web UI. It requires only glibc at runtime; +Node.js and Bun are not needed after installation. + +%prep +cd %{_builddir} +# The upstream archive ships inside the SRPM as Source0, so %prep needs no +# network access. A network fetch of the ~70 MB source from a GitHub proxy +# stalled during an earlier build and burned the whole build wall clock, so +# the in-SRPM archive is used first; the proxies remain only as a fallback +# for the zero-byte placeholder case. +src_ok=0 +if [ -s "%{SOURCE0}" ] && \ + tar -tzf "%{SOURCE0}" 2>/dev/null | grep -q '^opencode-1.19.5/'; then + echo "Using source archive shipped in the SRPM: %{SOURCE0}" + cp -f "%{SOURCE0}" src.tar.gz + src_ok=1 +fi +if [ "${src_ok}" != "1" ]; then + for url in \ + "%{src_proxy}" \ + "https://gh.llkk.cc/https://github.com/anomalyco/opencode/archive/refs/tags/v1.19.5.tar.gz" \ + "https://gh-proxy.com/https://github.com/anomalyco/opencode/archive/refs/tags/v1.19.5.tar.gz"; do + echo "Fetching source from ${url}" + if curl --fail --location --retry 2 --connect-timeout 30 --max-time 900 \ + --output src.tar.gz "${url}"; then + if tar -tzf src.tar.gz 2>/dev/null | grep -q '^opencode-1.19.5/'; then + src_ok=1 + break + fi + fi + rm -f src.tar.gz + done +fi +if [ "${src_ok}" != "1" ]; then + echo "ERROR: no source mirror was reachable" >&2 + exit 1 +fi +tar -xzf src.tar.gz +cd opencode-1.19.5 + +# The in-SRPM archive is re-packed from the upstream git clone; drop any VCS +# metadata so the build tree matches the upstream tag archive layout. +rm -rf .git + +# Keep only the CLI + embedded-Web-UI workspace closure. +rm -rf packages/console packages/stats packages/enterprise packages/desktop \ + packages/docs packages/web packages/storybook packages/slack \ + packages/identity packages/containers packages/cli packages/sdk-next \ + packages/function + +# Tests, docs, and marketing assets are not build inputs. +rm -rf packages/*/test packages/*/tests packages/*/e2e packages/*/test-browser \ + packages/*/bench packages/*/storybook packages/*/docs packages/*/examples \ + packages/*/example packages/*/__tests__ packages/*/README* \ + packages/*/*/test packages/*/*/tests packages/*/*/e2e \ + packages/*/*/README* sdks github nix infra specs .github README* \ + AGENTS.md CONTRIBUTING.md STATS.md CONTEXT.md perf screenshot-*.png + +# packages/script (@opencode-ai/script) reads .github/TEAM_MEMBERS at module +# load time (top-level await), so the pruning above must leave that file in +# place; otherwise `bun run script/build.ts` fails with ENOENT. Only release +# tooling consumes the team list, so a stub is enough for the build. +mkdir -p .github +printf '# build stub: team list is only used by upstream release tooling\n' \ + > .github/TEAM_MEMBERS + +python3 - <<'PY' +import json +import os + +path = "package.json" +data = json.load(open(path)) +data["workspaces"]["packages"] = [ + x for x in data["workspaces"]["packages"] + if x not in ("packages/console/*", "packages/stats/*", "packages/slack") + and not (x == "packages/sdk/js" and not os.path.isdir(x)) +] +json.dump(data, open(path, "w"), indent=2) +open(path, "a").write("\n") + +path = "packages/app/package.json" +data = json.load(open(path)) +data["dependencies"]["ghostty-web"] = "0.3.0" +json.dump(data, open(path, "w"), indent=2) +open(path, "a").write("\n") +PY + +xz -dc %{SOURCE1} > models-api.json + +%build +cd opencode-1.19.5 +export HOME="%{_builddir}/%{name}-%{version}/.home" +mkdir -p "$HOME" + +# Node.js 24.18.0 (the chroot only ships 20.x; upstream needs >= 22). +curl --fail --location --retry 3 --connect-timeout 30 \ + --output node.tar.xz \ + "https://mirrors.huaweicloud.com/nodejs/v%{node_version}/node-v%{node_version}-linux-x64.tar.xz" +echo '%{node_sha256} node.tar.xz' | sha256sum -c - +mkdir -p "$HOME/node" +tar -xJf node.tar.xz -C "$HOME/node" --strip-components=1 +export PATH="$HOME/node/bin:$PATH" +node --version +npm --version + +# Bun 1.4.4 from the npm platform package +curl --fail --location --retry 3 --connect-timeout 30 \ + --output bun.tgz \ + "https://mirrors.huaweicloud.com/repository/npm/@oven/bun-linux-x64/-/bun-linux-x64-%{bun_version}.tgz" +echo '%{bun_sha256} bun.tgz' | sha256sum -c - +mkdir -p "$HOME/bun" +tar -xzf bun.tgz -C "$HOME/bun" --strip-components=1 +export PATH="$HOME/bun/bin:$PATH" +bun --version + +export npm_config_registry="https://mirrors.huaweicloud.com/repository/npm/" +export NPM_CONFIG_REGISTRY="$npm_config_registry" +export BUN_CONFIG_REGISTRY="$npm_config_registry" +export npm_config_prefix="$HOME/npm-global" +export NPM_CONFIG_PREFIX="$npm_config_prefix" +mkdir -p "$npm_config_prefix" +export PATH="$npm_config_prefix/bin:$PATH" +npm install -g node-gyp +node-gyp --version + +export BUN_INSTALL_CACHE_DIR="$HOME/bun-cache" +export BUN_CONFIG_DISABLE_ANALYTICS=1 +export MODELS_DEV_API_JSON="$PWD/models-api.json" +export OPENCODE_VERSION="%{version}" +export OPENCODE_CHANNEL="prod" +export USE_HARD_LINKS=false +export HUSKY=0 + +bun install +bun run --cwd packages/core fix-node-pty || : +cd packages/opencode +bun run script/build.ts --single + +%install +cd opencode-1.19.5 +install -Dpm 0755 packages/opencode/dist/opencode-linux-x64/bin/opencode %{buildroot}%{_bindir}/opencode +install -Dpm 0644 LICENSE %{buildroot}%{_licensedir}/%{name}/LICENSE + +%check +%{buildroot}%{_bindir}/opencode --version | grep -qx '%{version}' + +%files +%license %{_licensedir}/%{name}/LICENSE +%{_bindir}/opencode + +%changelog +* Fri Oct 30 2026 user_76c6f026 <user_76c6f026@eur.openeuler.cn> - 1.19.5-1 +- Build opencode 1.19.5 from source for openEuler 24.03 LTS SP4 x86_64 +- Adapt EUR reference spec (25.09) to the 24.03 LTS SP4 chroot +- Carry the upstream source archive in the SRPM (no build-time GitHub proxy) +- Provision Node.js 24.18.0 / Bun 1.4.4 from Huawei Cloud mirrors (sha256 + verified) and resolve the npm tree from the Huawei npm mirror +- Ship the models.dev snapshot as Source1 instead of fetching it at build + time; switch ghostty-web to the published 0.3.0 package |
