プロジェクト

全般

プロフィール

CMakeでのDEB/RPMパッケージ作成手順

例としてImageCalibrationコンポーネントを使用する

1) テンプレートが生成したCMakeLists.txtを使ったパッケージ作成動作の確認

「tar.Z, sh, tar.gz」の3種類のパッケージが生成される。
「ImageCalibration/PARENT_SCOPE」というパスは存在しないので、これを定義している部分1ヶ所をコメントアウトする必要がある。

  • ImageCalibration/include/ImageCalibration/CMakeLists.txt の修正
    set(hdrs ImageCalibration.h
        PARENT_SCOPE           ←★この行をコメントアウトする
        CalibrationServiceSVC_impl.h
        )
    
  • バイナリ配布物の生成
    $ cd build
    $ cmake ..
    $ make
    $ cpack -C CPackConfig.cmake
    
    • build下に以下のファイルが生成される
      • ImageCalibration-1.0.0.tar.Z
      • ImageCalibration-1.0.0.sh
      • ImageCalibration-1.0.0.tar.gz
    • build/_CPack_Packages下にも出力される
      _CPack_Packages
      └── Linux
          ├── STGZ
          │   ├── ImageCalibration-1.0.0
          │   │   └── components
          │   │       ├── bin
          │   │       │   └── ImageCalibrationComp
          │   │       ├── include
          │   │       │   └── imagecalibration-1
          │   │       │       ├── idl
          │   │       │       │   ├── BasicDataType.idl
          │   │       │       │   ├── CalibrationService.idl
          │   │       │       │   ├── ExtendedDataTypes.idl
          │   │       │       │   └── InterfaceDataTypes.idl
          │   │       │       └── imagecalibration
          │   │       │           ├── CalibrationServiceSVC_impl.h
          │   │       │           ├── ImageCalibration.h
          │   │       │           └── idl
          │   │       │               ├── BasicDataType.hh
          │   │       │               ├── CalibrationService.hh
          │   │       │               ├── ExtendedDataTypes.hh
          │   │       │               └── InterfaceDataTypes.hh
          │   │       ├── lib
          │   │       │   ├── ImageCalibration
          │   │       │   │   └── ImageCalibrationDepends.cmake
          │   │       │   ├── ImageCalibration.so
          │   │       │   └── pkgconfig
          │   │       │       └── imagecalibration.pc
          │   │       └── share
          │   │           └── imagecalibration-1
          │   │               ├── imagecalibration-config-version.cmake
          │   │               └── imagecalibration-config.cmake
          │   └── ImageCalibration-1.0.0.sh
          ├── TGZ
          │   ├── ImageCalibration-1.0.0
          │   │   └── components
          │   │       ├── bin
          │   │       │   └── ImageCalibrationComp
          │   │       ├── include
          │   │       │   └── imagecalibration-1
          │   │       │       ├── idl
          │   │       │       │   ├── BasicDataType.idl
          │   │       │       │   ├── CalibrationService.idl
          │   │       │       │   ├── ExtendedDataTypes.idl
          │   │       │       │   └── InterfaceDataTypes.idl
          │   │       │       └── imagecalibration
          │   │       │           ├── CalibrationServiceSVC_impl.h
          │   │       │           ├── ImageCalibration.h
          │   │       │           └── idl
          │   │       │               ├── BasicDataType.hh
          │   │       │               ├── CalibrationService.hh
          │   │       │               ├── ExtendedDataTypes.hh
          │   │       │               └── InterfaceDataTypes.hh
          │   │       ├── lib
          │   │       │   ├── ImageCalibration
          │   │       │   │   └── ImageCalibrationDepends.cmake
          │   │       │   ├── ImageCalibration.so
          │   │       │   └── pkgconfig
          │   │       │       └── imagecalibration.pc
          │   │       └── share
          │   │           └── imagecalibration-1
          │   │               ├── imagecalibration-config-version.cmake
          │   │               └── imagecalibration-config.cmake
          │   └── ImageCalibration-1.0.0.tar.gz
          └── TZ
              ├── ImageCalibration-1.0.0
              │   └── components
              │       ├── bin
              │       │   └── ImageCalibrationComp
              │       ├── include
              │       │   └── imagecalibration-1
              │       │       ├── idl
              │       │       │   ├── BasicDataType.idl
              │       │       │   ├── CalibrationService.idl
              │       │       │   ├── ExtendedDataTypes.idl
              │       │       │   └── InterfaceDataTypes.idl
              │       │       └── imagecalibration
              │       │           ├── CalibrationServiceSVC_impl.h
              │       │           ├── ImageCalibration.h
              │       │           └── idl
              │       │               ├── BasicDataType.hh
              │       │               ├── CalibrationService.hh
              │       │               ├── ExtendedDataTypes.hh
              │       │               └── InterfaceDataTypes.hh
              │       ├── lib
              │       │   ├── ImageCalibration
              │       │   │   └── ImageCalibrationDepends.cmake
              │       │   ├── ImageCalibration.so
              │       │   └── pkgconfig
              │       │       └── imagecalibration.pc
              │       └── share
              │           └── imagecalibration-1
              │               ├── imagecalibration-config-version.cmake
              │               └── imagecalibration-config.cmake
              └── ImageCalibration-1.0.0.tar.Z
      
      43 directories, 51 files
      
      
  • ソース配布物の生成
    $ cd build
    $ cpack --config CPackSourceConfig.cmake
    

2) debパッケージ作成動作の確認

1)に対して、debパッケージが生成されるように修正する。

  • ImageCalibration/CMakeLists.txt の修正
    • ジェネレータでDEBを指定する
    • MAINTAINER情報を設定する
      • debパッケージの場合、CPACK_PACKAGE_CONTACT or CPACK_DEBIAN_PACKAGE_MAINTAINER の指定が必須
      • ここでは PROJECT_MAINTAINER という変数名で定義し、cmake/cpack_options.cmake.in で設定する
        set(LINUX_PACKAGE_GENERATOR "DEB")                          ←*1
        set(PROJECT_MAINTAINER "Noriaki Ando <n-ando@aist.go.jp>")  ←*2
        
  • ImageCalibration/cmake/cpack_options.cmake.in の修正
    • Windows環境用のパッケージ生成定義しかないので、Linux用の設定を追加する
      <修正前>
      ENDIF (WIN32)
              ↓
      <修正後>
      ELSE(WIN32)
          set(CPACK_GENERATOR @LINUX_PACKAGE_GENERATOR@)  ←*1
          set(CPACK_PACKAGE_CONTACT @PROJECT_MAINTAINER@) ←*2 
      ENDIF (WIN32)
      

パッケージを生成する。この設定で、これで「ImageCalibration-1.0.0.deb」が生成される。

$ cd build
$ cmake ..
$ make package

または、cmakeの後に

$ make
$ cpack -C CPackConfig.cmake

としてもよい

パッケージの内容を確認する

$ dpkg -x ImageCalibration-1.0.0.deb .
$ ls
ImageCalibration-1.0.0.deb usr
$ tree usr
usr
└── components
    ├── bin
    │   └── ImageCalibrationComp
    ├── include
    │   └── imagecalibration-1
    │       ├── idl
    │       │   ├── BasicDataType.idl
    │       │   ├── CalibrationService.idl
    │       │   ├── ExtendedDataTypes.idl
    │       │   └── InterfaceDataTypes.idl
    │       └── imagecalibration
    │           ├── CalibrationServiceSVC_impl.h
    │           ├── ImageCalibration.h
    │           └── idl
    │               ├── BasicDataType.hh
    │               ├── CalibrationService.hh
    │               ├── ExtendedDataTypes.hh
    │               └── InterfaceDataTypes.hh
    ├── lib
    │   ├── ImageCalibration
    │   │   ├── ImageCalibrationDepends-noconfig.cmake
    │   │   └── ImageCalibrationDepends.cmake
    │   ├── ImageCalibration.so
    │   └── pkgconfig
    │       └── imagecalibration.pc
    └── share
        └── imagecalibration-1
            ├── imagecalibration-config-version.cmake
            └── imagecalibration-config.cmake

12 directories, 17 files

3) debパッケージに含まれるファイルを整理する

パッケージには実行ファイルとライブラリファイルのみの構成にする。ImageCalibration-1.1.0.deb

usr
└── share
    └── openrtm-1.1
        └── components
            └── c++
                └── opencv-rtcs
                    ├── ImageCalibration.so
                    └── ImageCalibrationComp

上記の構成にするため、以下の修正を行う。

  • ImageCalibration/CMakeLists.txt の修正
    • インストール先を指定
      else(WIN32)
        set(OPENRTM_SHARE_PREFIX "share/openrtm-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}")
        set(INSTALL_PREFIX "${OPENRTM_SHARE_PREFIX}/components/${PROJECT_TYPE}")
      
  • ImageCalibration/cmake/CMakeLists.txt の修正
    • 不要な部分をコメントアウト(2ヶ所)
      #install(FILES ${pkg_conf_file}
      #    DESTINATION ${LIB_INSTALL_DIR}/pkgconfig/ COMPONENT component)
      
      #install(FILES ${cmake_mods} DESTINATION ${SHARE_INSTALL_DIR} COMPONENT library)
      
  • ImageCalibration/idl/CMakeLists.txt の修正
    • 不要な部分をコメントアウト(2ヶ所)
      #install(FILES ${idls} DESTINATION ${INC_INSTALL_DIR}/idl
      #    COMPONENT idl)
      
      #install(FILES ${idl_headers}
      #    DESTINATION ${INC_INSTALL_DIR}/${PROJECT_NAME_LOWER}/idl
      #    COMPONENT headers)
      
  • ImageCalibration/include/ImageCalibration/CMakeLists.txt の修正
    • 不要な部分をコメントアウト
      #install(FILES ${hdrs} DESTINATION ${INC_INSTALL_DIR}/${PROJECT_NAME_LOWER}
      #    COMPONENT library)
      
  • ImageCalibration/src/CMakeLists.txt の修正
    • BIN_INSTALL_DIR、LIB_INSTALL_DIR を INSTALL_PREFIX へ変更する
      #install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}Comp
      #    EXPORT ${PROJECT_NAME}
      #    RUNTIME DESTINATION ${BIN_INSTALL_DIR} COMPONENT component
      #    LIBRARY DESTINATION ${LIB_INSTALL_DIR} COMPONENT component
      #    ARCHIVE DESTINATION ${LIB_INSTALL_DIR} COMPONENT component)
      #install(EXPORT ${PROJECT_NAME}
      #    DESTINATION ${LIB_INSTALL_DIR}/${PROJECT_NAME}
      #    FILE ${PROJECT_NAME}Depends.cmake)
      install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}Comp
          EXPORT ${PROJECT_NAME}
          RUNTIME DESTINATION ${INSTALL_PREFIX} COMPONENT component
          LIBRARY DESTINATION ${INSTALL_PREFIX} COMPONENT component
          ARCHIVE DESTINATION ${INSTALL_PREFIX} COMPONENT component)
      

4)RPMパッケージを作成する

3)のDEBパッケージの設定で以下の1行を変更するだけ。 ImageCalibration-1.1.0.rpm

  • ImageCalibration/CMakeLists.txt の修正
    set(LINUX_PACKAGE_GENERATOR "RPM")
    
  • パッケージの内容を確認する
    $ rpm2cpio ImageCalibration-1.1.0.rpm | cpio -id
    $ ls
    ImageCalibration-1.1.0.rpm  usr
    $ tree usr
    usr
    └── share
        └── openrtm-1.1
            └── components
                └── c++
                    └── opencv-rtcs
                        ├── ImageCalibration.so
                        └── ImageCalibrationComp