Ubuntu 26.04 の「Package 'libpcre3-dev' has no installation candidate」
ubuntu-latest は、2026年10月19日から11月19日にかけて Ubuntu 24.04 から 26.04 に移ります(ほかに変わること)。Ubuntu 26.04 には、2つある PCRE の正規表現ライブラリのうち古いほうの PCRE1(pcre3 のパッケージ・版は 8.39)がもうありません。11月4日に Ubuntu のパッケージの一覧を見ると、libpcre3 と libpcre3-dev は 24.04 にはあり、26.04 では「Package not available in this suite」でした。残っているのは PCRE2(libpcre2-dev 10.46)だけです。PCRE1 の最後のリリースは2021年の 8.45 で、もう保守されていないので、待っても直りません。
どう見えるか
apt のステップでは:
E: Unable to locate package libpcre3 E: Package 'libpcre3-dev' has no installation candidate
2つ目の前には「Package libpcre3-dev is not available, but is referred to by another package.」と出ます。何もインストールしていない場合は、まだ PCRE1 を必要とするプログラムやビルドが、あとで自分の言葉で落ちます:
error while loading shared libraries: libpcre.so.3: cannot open shared object file: No such file or directory could not load: libpcre.so(.3|.1|) fatal error: pcre.h: No such file or directory * Missing (or bad) C library: pcre
順に、24.04 以前向けに作られて PCRE1 にリンクしたバイナリ、std/re を使う Nim のプログラム、PCRE1 のヘッダーを読み込む C のコード、cabal や stack でビルドする Haskell のパッケージ pcre-light です。
まだ PCRE1 を必要としているもの
- v1.9.3 より前の
crystal-lang/install-crystalは、どの Crystal の版でもlibpcre3-devをインストールするので、Crystal を入れる前にアクションが止まります(install-crystal #83)。v1.9.3(10月4日)からは Crystal 1.8 以降でlibpcre2-devを入れ、@v1にもこの変更が入っています。1.8 より古い Crystal は PCRE1 を使うので、今もlibpcre3-devを求めます。 - ソースからビルドする nginx:nginx 1.21.5 以降は PCRE2 でビルドする(
checking for PCRE2 library ... found)ので、そのジョブはlibpcre3-devを外せます。OpenResty 1.21.4.x は nginx 1.21.4 が元なので PCRE1 が要ります(apisix-nginx-module #134)。 - Nim:
std/reはプログラムの起動時にlibpcre.so.3を読み込み、PCRE2 では動きません(Nim #26070・未解決)。コンパイルは通り、テストのステップで落ちます。 - Haskell:
pcre-lightはシステムの PCRE1 を使います。LaunchDarkly のサーバー SDK のプルリクエストは、これをregex-pcre-builtinに替えています。PCRE の C のソースをパッケージと一緒にビルドするので、システムのライブラリが要りません(haskell-server-sdk #122)。 libpcre.so.3にリンクしたバイナリ:pioarduino の Linux 向けの cppcheck がその1つです(witchhunt-reader #578)。New Relic の PHP エージェントは PCRE1 にしか対応していないので、26.04 ではソースからビルドできません(newrelic-php-agent #1367)。libpcre3-devを習慣で入れているだけで、何も使っていないワークフローも多くあります。Apache Traffic Server のプルリクエストは、CodeQL のワークフローからこれを外しています(trafficserver #13982)。
直し方1:PCRE2 を入れるか、何も入れない
ソフトウェアが PCRE2 でビルドできるなら、パッケージを替えます:
- run: sudo apt-get update && sudo apt-get install -y libpcre2-dev
24.04 にも libpcre2-dev があるので、同じ行が両方のイメージで動きます。ジョブの中で PCRE を何も使っていないなら、一覧から外します。ブランチで外し、runs-on: ubuntu-26.04 でジョブを動かせば、必要だったかが分かります。
直し方2:ツールを PCRE1 から移す
- Crystal:
crystal-lang/install-crystal@v1(または v1.9.3 以降)と Crystal 1.8 以降。 - nginx:1.21.5 以降。OpenResty 1.21.4.x のビルドは、新しい OpenResty にするか、直し方3にします。
- Nim:
std/reが PCRE2 に対応するまでは、Nim で書かれた正規表現のライブラリ(たとえば regex パッケージ)なら、システムのライブラリが要りません。 - Haskell:regex-pcre-builtin はシステムのライブラリが要らず、regex-pcre2 は
libpcre2-devを使います。 - ほかから持ってくるバイナリ:PCRE2 でビルドしたリリースか、静的にリンクしたもの。
直し方3:そのジョブは 24.04 に残す
jobs:
cppcheck:
runs-on: ubuntu-24.04
steps:
- run: sudo apt-get update && sudo apt-get install -y libpcre3
GitHub が 24.04 のイメージを終えるまでは使えます。26.04 で PCRE 8.45 をソースからビルドすることもできますが、保守の終わったライブラリを持ち込むことになります。
見分け方
- 足りないのが PCRE1 なら、26.04 でバイナリに
lddを使うとlibpcre.so.3 => not foundと出ます。 - 「Set up job」の Runner Image の欄にイメージが出ます。11月19日までは、再実行が 24.04 に当たって通ることがあるので、再実行が緑でも何も確かめたことになりません。
- ほかの名前での「Unable to locate package」は、26.04 で名前が変わった・無くなったパッケージの話です:Ubuntu 26.04 の apt。
ほかの 26.04 の失敗
- Ubuntu 26.04 の rpmbuild:rpm が 6.0.1 なので、
%installがパッケージごとのビルドのディレクトリで動いて Electron Forge の RPM の maker が「cp: cannot stat 'usr/*'」で落ち、_rpmformat 4を渡さなければパッケージは v6 になります。 - Ubuntu 26.04 の「cannot enable executable stack」:glibc 2.43 は、実行可能なスタックを求めるライブラリを
dlopenで読み込まないので、Julia 1.10.0〜1.10.8・conda-forge の TensorFlow 2.19・一部の MEX ファイルが「Invalid argument」で落ちます。patchelf --clear-execstackで印を消します。 - Ubuntu 26.04 の apt:名前が変わった・無くなったパッケージ(
qemu-user-static・gcc-10・clang-format-14など)。 - Ubuntu 26.04 の「cannot open shared object file」:libxml2 は
libxml2.so.16、ICU は 78 なので、24.04 で保存したキャッシュや 24.04 向けのバイナリがlibxml2.so.2やlibicudata.so.74を見つけられません。 - Ubuntu 26.04 の GCC 15 で通らなくなった C と C++ のビルド:既定の gcc が 13 から 15 に上がるので、C は C23 としてコンパイルされ、古い警告の6つがエラーになり、C++ のヘッダーは
<cstdint>を読み込んでくれなくなります。 - Ubuntu 26.04 の /tmp で「disk quota exceeded」:最初の 26.04 のイメージは
/tmpが約 7.9G の tmpfs(ユーザーごとのクォータつき)だったので、/tmpでの大きなビルドが落ちました。TMPDIRを$RUNNER_TEMPにします。 - 「coreutils: unknown program」:基本のコマンドのほとんどが uutils です。
失敗したジョブを IntelliJ IDEA から見るなら
Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べ、いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。
GitHub と GitHub Actions は GitHub, Inc. の商標、Ubuntu は Canonical Ltd. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・Canonical・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:「The ubuntu-latest label will migrate to Ubuntu 26」 · Ubuntu 26.04 の apt · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English