wiki:SpecCharCode

Version 1 (modified by kazutaka, 16 years ago) (diff)

--

Spec の文字コードについて

VineSeed (5.0) からシステムデフォルトの文字コードが EUC-JP から UTF-8 に変更になっています。
このため、Seed と Plus/4.0 向けに同じアプリケーションのパッケージを put する場合、従来であれば release +1 してリビルドするだけ問題ありませんでしたが、文字コードの変更により、単にリビルドしただけでは spec に書かれた日本語のタイトルや説明が文字化けを起こしていまいます。

対応策について Seed ML で議論した結果、以下の方針で対応することとしました。

  • Vine Plus/4.0 向けの spec は EUC-JP で記述する
  • Vine Seed (5.0) 向けの spec は UTF-8 で記述する
  • 同一のアプリケーションを Plus 4.0/Seed の双方に put する場合は、それぞれの文字コードに合わせて spec ファイルの文字コードを変換した上で、パッケージを作成する

ただし、毎回手作業で文字コードをチェックしたり変換したりするのは大変なので、以下のマクロを ~/.rpmmacros に記述しておくことで、文字コードのチェックと変換を自動的に行えます。

%__spec_prep_pre    %{__check_speccharcode}\
                    %{___build_pre}

%__spec_install_pre %{__check_speccharcode}\
                    %{___build_pre}

%__check_speccharcode \
SPEC_FILE=$(ps -p $PPID -o args | awk '{for (i=1;i<=NF;i++) { if ($i ~
/\.spec/) print $i}}')\
CHAR_CODE=$(nkf -g $SPEC_FILE | cut -d" " -f1)\
if [ "$CHAR_CODE" != 'ASCII' -a $CHAR_CODE != "$(locale charmap)" ] ; then\
  NKF_OPT=$(echo "$(locale charmap)" | sed "s/UTF-8/-w/" | sed
"s/EUC-JP/-e/")\
  mv %{_specdir}/$SPEC_FILE %{_specdir}/$SPEC_FILE.$CHAR_CODE\
  nkf "$NKF_OPT" %{_specdir}/$SPEC_FILE.$CHAR_CODE > %{_specdir}/$SPEC_FILE\
  echo "ERROR: Current locale and character code of spec file is not same."\
  echo "       Spec file is already converted. Just re-run the command
again."\
  exit 1\
fi\

このマクロを記述した状態で、例えば UTF-8 な Seed 環境で EUC-JP で書かれた spec を元にパッケージを作成しようとすると、以下のようにエラーになります。

$ rpm -bp hoge.spec 
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.9337
ERROR: Current locale and character code of spec file is not same.
       Spec file is already converted. Just re-run the command again.
エラー: /var/tmp/rpm-tmp.9337 の不正な終了ステータス (%prep)


RPM ビルドエラー:
    /var/tmp/rpm-tmp.9337 の不正な終了ステータス (%prep)

この状態で既に spec ファイルの文字コードは UTF-8 に変換されているので、同じコマンドを再度実行するだけで、作業を続けられます。(元のファイルもファイル名の末尾に .EUC-JP 付きで保存されています)

注意点としては、

  • src.rpm の rebuild には対応できていません
    もし rebuild が必要な場合は、一旦 rpm -U hoge.src.rpm してから rpm -bb hoge.spec してください。
  • %prep も %install もしないパッケージはチェックできません
    まれに %prep も %install もしないパッケージがありますが、この場合は上記マクロを入れていてもチェックできないので、注意が必要です。

があります。