Files
docview/docs/LINUX-DEVELOPMENT-PACKAGE.md
2026-09-21 13:41:40 +09:00

123 lines
8.7 KiB
Markdown

# Linux開発版のローカルパッケージ
この手順は、現在の **Arch Linux x86_64・Qt 6.11.2** 環境向けの開発版を
tar.gzにまとめる。公開・アップロード・署名は行わない。Ubuntu 24.04、Windows、
任意Linuxでの互換性やクリーンインストールの合格を意味しない。
## 形式と対象範囲
| 候補 | この段階での判断 |
|---|---|
| tar.gz + システム依存 | ローカル開発版に採用。展開先を移して検証でき、元に戻す操作も明確。配布先のパッケージ管理やABIを変更しない |
| Ubuntu向けdeb | 初期対象の製品版候補。Ubuntu上で依存解決・インストール/削除の検証が必要なため未採用 |
| AppImage等のランタイム同梱方式 | Qt/WebEngine/GPU・sandbox・ライセンス集合を含む別検証が必要。今回の開発版には採用しない |
製品版の初期対象ごとの形式決定は未完了。Windowsの既存配置コードをこの判断で変更しない。
同梱するランタイムは本体、PDF/アーカイブワーカー、固定版の独立PDFium共有ライブラリ。
Qt、WebEngine helper/資源/翻訳/QML/plugin、libqpdf、libzip、libseccomp、
Fontconfig等はシステムから読み込む。Qt共有ライブラリとpluginの配置は別の依存条件である。
[QtのLinux配布資料](https://doc.qt.io/qt-6/linux-deployment.html)
toml++はシステムパッケージのヘッダーから実行ファイルへ組み込むため、
実行時だけのシステム依存とは区別する。MIT本文は同梱済みである。
実際の含有範囲とローカルビルド由来は[依存物の証跡台帳](DEPENDENCY-PROVENANCE.md)を参照する。
`third-party/dependency-manifest.json`に実際のArchパッケージ版、共有ライブラリや
Qt資源のハッシュ、実行ファイルが要求するGLIBC/GLIBCXX/CXXABIのsymbol versionを記録する。
Archのrolling-release ABIに依存し、単に同じCPUやQtのmajor版であれば動くという主張はしない。
X11/Wayland、IME、GPU driver、フォント、Landlock ABI 3以上とseccompが別途必要。
隔離できない環境ではワーカーを起動せず、sandboxを無効にして実行しない。
## 生成
Python 3.11以上、CMake、Archのpacmanデータベース、`ldd`、`readelf`、
`/usr/lib/qt6/bin/qtpaths`とビルド済み実行ファイルを必要とする。
自分でビルドした信頼できる実行ファイルだけを入力にする。
初回は[READMEのビルド手順](../README.md#ビルドと起動)に従い、依存物と固定版PDFiumを準備する。
```sh
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build
python3 tools/package_linux_development.py --build-dir build --output build/package-local
```
Pythonが見つかったLinuxビルドには`linux-development-package` targetも登録する。
その既定出力先は`build/linux-development-package`で、必要ならCMakeの
`DOCVIEW_LINUX_PACKAGE_OUTPUT`で変更する。`BUILD_TESTING`時は軽量の`linux_package`試験も登録する。
生成スクリプトは一時領域に`cmake --install`し、実依存を調査して告知を収集する。
既に存在する出力アーカイブは上書きしない。別の出力ディレクトリーを指定して再生成する。
既存の新規install treeを使う場合は`--build-dir`の代わりに`--prefix`を指定できる。
利用者の設定・履歴・文書や、system library/fontの実体はパッケージに含めない。
LinuxのinstallにはPDFium providerの15告知に加えて、固定ソースから補った
libc++/libc++abiの2告知と出典metadataを含める。版・commit・ライブラリー・告知の
ハッシュをconfigure時とpackage生成時に照合する。PDFiumを更新した場合は再調査が必要。
追加の根拠は[PDFiumのソース対応記録](PDFIUM-SOURCE-CORRESPONDENCE.md)を参照する。
Linux packagerはさらに、QtWebEngineの実DataPack内13資源から得た7種類の完全な告知本文と
出典metadataを収録する。固定Qt版・Arch package版・DataPackのpath/hash・本文のsize/hashを
現在のsystem inventoryへ照合し、不明な版・variantや欠落・改変は新たなレビューまで拒否する。
本文とmetadataだけをコピーし、QtのruntimeとDataPackはsystem依存のままとする。
これは全Chromium告知の完成ではない。根拠と比較範囲は
[資源内告知の抽出記録](../tests/results/source-correspondence/qt-embedded-notices/README.md)にある。
- `docview-0.1.0-arch-x86_64-development.tar.gz`: ローカル開発版。
- 同名`.json`: アーカイブSHA-256、圧縮後サイズ、展開後ファイルサイズ合計、
ファイル数、本体/workerハッシュ、含めていないsystem runtime候補の合計サイズ。
- アーカイブ内`share/doc/docview/package-manifest.json`: 全payloadの相対パス・mode・
サイズ・SHA-256。自己ハッシュは含めない。
- 同`third-party/`: 依存版/出典/対応ソースの収集状況・NOTICE・収集したlicense本文。
順序、uid/gid、所有者名、mode、mtimeとgzip headerを固定する。
`SOURCE_DATE_EPOCH`は未指定時0。必要なら`--epoch`で指定できる。
同じinstall内容・ホスト依存/告知・スクリプト・Python/zlib・epochから同じバイト列を得る。
コンパイラーや実行ファイル自体の再現可能ビルドを証明する手順ではない。
生成時に展開して全hashを確認し、その展開物から再圧縮したhashが一致することも要求する。
## 展開、起動、削除
```sh
mkdir -p /tmp/docview-local-check
tar -xzf build/package-local/docview-0.1.0-arch-x86_64-development.tar.gz -C /tmp/docview-local-check
/tmp/docview-local-check/docview-0.1.0-arch-x86_64-development/bin/docview /absolute/path/to/book.pdf
```
PDFiumの検索先はworkerからの相対RPATHを使う。`LD_LIBRARY_PATH`の追加は不要。
実行すると通常は利用者のXDG設定・履歴を使う。試験は次の専用スクリプトで行い、
一時XDG領域へ隔離する。
試験結果を区別するため、`--output`には毎回新しいディレクトリーを指定する。
```sh
python3 tests/test_linux_package.py -v
xvfb-run -a -s '-screen 0 1100x760x24' \
env QT_QPA_PLATFORM=xcb QT_QUICK_BACKEND=software QTWEBENGINE_CHROMIUM_FLAGS=--disable-gpu \
python3 tests/smoke_linux_package.py \
--archive build/package-local/docview-0.1.0-arch-x86_64-development.tar.gz \
--output tests/results/linux-development-package/new-run
```
後者は全payloadを検証して空の一時ディレクトリーへ展開し、6条件の本番GUI smokeを実行する。
元のinstall pathと異なる位置からPDF/HTML/ZIP/EPUBを開く。Chromiumとworkerのsandboxは有効。
成功時も失敗時も一時展開先を回収する。同一開発機での検証なのでclean-OS試験ではない。
同じ出力先を再利用した場合も、開始時に前回の`results.json`と`package-smoke.json`を除去する。
途中失敗では成功集計を残さず、古い画像だけでは当該実行の成功を示さない。
この配置はpackage managerやsystem directoryに登録しない。不要になった展開ディレクトリーを
削除すれば実行ファイルの配置を取り除ける。通常起動で保存した設定・履歴は別に残る。
原本文書を削除対象に含めない。
## 告知と未完了事項
DocView自身の公開ライセンスは未指定。第三者のlicense本文やpackage labelsを収録しても、
DocViewのライセンスを選択したことにはならない。主要4つのArch recipeとpatch、PDFium
providerと固定依存ソースの対応は[別の調査記録](../tests/results/source-correspondence/README.md)に
保存した。各依存の対応ソース一式・完全なbuild materialはパッケージに含めず、Qt WebEngineの
build固有の全Chromium告知も未取得。今回の7本文は有限の部分告知集として記録し、
`completeChromiumNotices = false`を維持する。manifestの`source.status = not-collected`は
パッケージ側の完全なソース収集が未完了であることを表す。ソースURLだけを履行済みの証拠にしない。
今回計測する圧縮サイズはWebEngine込みの自己完結した配布サイズではない。
system runtime候補の合計は必要ディスク量の参考であり、共有・既存install・任意追加providerを
含むため、追加インストール容量や製品配布サイズと同一視しない。
G-DISTRIBUTION/T-S05の正式合格には、対象OSの実配布・依存/告知/対応ソース整理が引き続き必要。