前回までのあらすじ
前回、IBM i (AS/400) で Google Gen AI SDK を pip install しようとして pydantic-core の Rust ビルドができず、結局 REST API を直接呼び出して IBM i から Gemini を使うようにしていました。
その後 IBM Open SDK for Rust on AIX 1.92.0 を見つけたので、IBM i 7.6 PASE で再度 Google Gen AI SDK を試してみたいと思います。
依存関係おさらい
やったこと
1. AIX Toolbox の rpm で Rust SDK をインストール
BASE=https://public.dhe.ibm.com/aix/freeSoftware/aixtoolbox/RPMS/ppc-7.3/rust
mkdir -p /tmp/rustrpm
cd /tmp/rustrpm
curl -O $BASE/rust1.92-1.92.0-1.aix7.3.ppc.rpm
curl -O $BASE/rust1.92-std-static-1.92.0-1.aix7.3.ppc.rpm
curl -O $BASE/rust1.92-community-license-1.92.0-1.aix7.3.ppc.rpm
curl -O $BASE/cargo1.92-1.92.0-1.aix7.3.ppc.rpm
curl -O $BASE/rust-1.92.0-1.aix7.3.ppc.rpm
curl -O $BASE/cargo-1.92.0-1.aix7.3.ppc.rpm
rpm -ivh --nodeps --ignoreos *.rpm
公式手順は Fix Central + rustndi ですが、Fix Pack 単体では完結せず GA tarball が必要です。しかし Fix Pack 1 リリース後は Fix Central から GA リンクが消えていて入手不可。そこで AIX Toolbox に rpm 直置きがあったのでこちらから取得しました。
2. IBM Open XL C/C++ Runtime から libunwind / libc++ / libc++abi を抜いて配置
Fix Central から IBM_OPEN_XL_CPP_RUNTIME_17.1.4.0_AIX.tar.Z を入手。
cd /tmp/xl
zcat IBM_OPEN_XL_CPP_RUNTIME_17.1.4.0_AIX.tar.Z | tar -xvf -
restore -xqf libunwind.rte
restore -xqf libc++.rte
restore -xqf libc++abi.rte
mkdir -p /opt/freeware/lib/openxl
cp usr/lpp/xlC/lib/libunwind.a /opt/freeware/lib/openxl/
cp usr/lpp/xlC/lib/libc++.a /opt/freeware/lib/openxl/
cp usr/lpp/xlC/lib/libc++abi.a /opt/freeware/lib/openxl/
rustc / cargo は libunwind.a(libunwind.so.1) と libc++.a(shr2_64.o) を要求するが、AIX 7.3 では IBM Open XL C/C++ Runtime 経由で入っているこのパッケージが、IBM i 7.6 PASE のデフォルトには入っていないので、入手したファイルから展開しました。
PASE標準の libc++.a を上書きしたくないので別ディレクトリに展開しています
3. PASE の OpenSSL 3 を cargo が期待する形式に再パッケージ
mkdir -p /tmp/ssl-extract && cd /tmp/ssl-extract
ar -X64 -x /QOpenSys/pkgs/lib/libssl.so.3
mv shr_64.o libssl.so.3
ar -X64 -rv libssl.a libssl.so.3
cp libssl.a /opt/freeware/lib/openxl/
mkdir -p /tmp/crypto-extract && cd /tmp/crypto-extract
ar -X64 -x /QOpenSys/pkgs/lib/libcrypto.so.3
mv shr_64.o libcrypto.so.3
ar -X64 -rv libcrypto.a libcrypto.so.3
cp libcrypto.a /opt/freeware/lib/openxl/
cargo が期待するのは libssl.a アーカイブの中の libssl.so.3(OpenSSL 3.x)メンバーですが、PASE 標準の libssl.a には 1.0 系までしか入っていなかったです。
そのため yum で導入された /QOpenSys/pkgs/lib/libssl.so.3 が 3.x なので、これを libssl.a として再アーカイブしました。crypto でも同じ事をしています。
4. wrapper script の LIBPATH を書き換え
for f in rustc rustdoc cargo; do
cp /opt/freeware/lib/RustSDK/1.92/bin/$f /opt/freeware/lib/RustSDK/1.92/bin/$f.bak
sed 's|export LIBPATH=/usr/lpp/xlC/lib|export LIBPATH=/opt/freeware/lib/openxl:/usr/lpp/xlC/lib|' \
/opt/freeware/lib/RustSDK/1.92/bin/$f.bak > /opt/freeware/lib/RustSDK/1.92/bin/$f
done
先ほど作成した /opt/freeware/lib/openxl/ に置いた新しい libc++ / libssl / libcrypto を PASE標準より優先して読ませたいので、LIBPATH の先頭に追加します。
5. Hello, world!
$ rustc --version
rustc 1.92.0 (e74881c9b 2026-03-10) (IBM Open SDK for Rust on AIX 1.92.0.1)
$ cargo new hello && cd hello && cargo build && ./target/debug/hello
Hello, world!
ここまでやってやっと Rust 単体が動くようになりました。
6. pydantic-core のビルドを試す → これ以上はむり
pip install pydantic
ここで pydantic-core の Rust ビルドが始まり、build.rs の段階に行きましたが、以下で失敗します
error: failed to run custom build command for `anyhow v1.0.102`
Failed to clean up /.../out/probe: Not a directory (os error 20)
- probe ディレクトリを作る
- rustc を走らせる
-
fs::remove_dir_allで片付ける
という流れですが、この3の remove_dir_all が PASE では AIX と挙動が違って ENOTDIR を返してきて失敗します。
anyhow1個なら build.rs を上書きパッチで突破できますが
ANYHOW=~/.cargo/registry/src/github.com-*/anyhow-1.0.102
cat > $ANYHOW/build.rs <<'EOF'
fn main() { println!("cargo:rerun-if-changed=src/nightly.rs"); }
EOF
ですが、pydantic-core の依存 crate は数十個あって、それぞれが build.rs を持っています。全部にパッチを当て続けるのは現実的じゃないので、ここで諦めました😢
結論
Rust 単体は動くようになりました。でも Python SDK 系の pip install は無理でした。なのでIBM iでGeminiを使う場合は REST API を直接コールするか、RustがIBM i標準になるまで待つのが正解だとおもいました。残念