2014/05/23

checkinstall で rpm パッケージの作成がエラーになる場合

rpm パッケージを手軽に作成するために checkinstall は非常に便利だが、 現行の checkinstall にはインストール対象となるソフトウェアに ファイルに対するシンボリックリンクが含まれると rpm パッケージが作成できなくなる不具合がある様だ。

この不具合は checkinstall が rpm パッケージ用の spec ファイルを生成する際に、 ターゲットとなるオブジェクトがディレクトリかシンボリックリンクなら 無条件にディレクトリと仮定して %dir と出力しているために発生している。 そのために、例えばインストール時に libhoge.so.X.Ylibhoge.so にシンボリックリンクする様なソフトウェアの rpm パッケージを作成しようとするとエラーとなってしまう。

そこでターゲットなるオブジェクトがシンボリックリンクの場合、 リンク先を確認してディレクトリだった場合のみ %dir を出力する様にするパッチを作成した。

*** /usr/sbin/checkinstall~ 2014-05-21 12:29:30.000000000 +0900
--- /usr/sbin/checkinstall  2014-05-23 23:51:09.131081380 +0900
***************
*** 2428,2434 ****
  # Prepare directories to be included in the .spec file
  mv ${TMP_DIR}/newfiles ${TMP_DIR}/newfiles.tmp
  cat ${TMP_DIR}/newfiles.tmp | while read line; do
!    [ -d "${BUILD_DIR}/${line}" -o -L "${BUILD_DIR}/${line}" ] && echo -n "%dir " >> ${TMP_DIR}/newfiles
     echo "\"/${line}\"" >> ${TMP_DIR}/newfiles
  done
  
--- 2428,2435 ----
  # Prepare directories to be included in the .spec file
  mv ${TMP_DIR}/newfiles ${TMP_DIR}/newfiles.tmp
  cat ${TMP_DIR}/newfiles.tmp | while read line; do
!    [ -d "${BUILD_DIR}/${line}" ] && echo -n "%dir " >> ${TMP_DIR}/newfiles
!    [ -L "${BUILD_DIR}/${line} -a -d `ls -l ${BUILD_DIR}/${line} | awk '$0=$NF'` ] && echo -n "%dir" >> ${TMP_DIR}/newfiles
     echo "\"/${line}\"" >> ${TMP_DIR}/newfiles
  done
    

/usr/sbin/checkinstall にこのパッチを適用する事で シンボリックリンク先がディレクトリの場合のみ %dir を出力する様に変更される。
シンボリックリンクがネストしている場合は正しく動作しないので あくまでも暫定的なパッチだが、 取りあえず rpm パッケージを作成した場合にはそれなりに有用だと思う。
一応 checkinstall の配布元の bugzilla にはパッチを添えて報告してある。

ちなみに checkinstall で rpm の作成がエラーになる場合は 殆どが自動生成された spec ファイルが問題な場合なので、 --review-spec オプションを指定して checkinstall を実行する事で、 rpm パッケージの作成処理を実行する前に 自動生成された spec ファイルを編集できるので問題を回避できる事が多い。

# checkinstall --review-spec</i> 
    


Copyright © Mitzyuki IMAIZUMI 2008,2009. All rights reserved.