0

私のプロジェクトでは、cmake を使用してビルド システムを構築します。ExternalProject_add を使用して外部プロジェクト (ここではたとえば zeromq を使用) をビルドし、コンパイルされたバイナリを RPM パッケージにパックする必要がありますが、生成された RPM が必要です。以下のように、「PROVIDES」情報を修正して、提供するライブラリを示します。

libzmq.so.5()(64bit)
zeromq = 4.1.2-1.el7
zeromq(x86-64) = 4.1.2-1.el7

しかし、どういうわけか、CPACK_RPM_PACKAGE_AUTOPROV を 1 に設定すると、ビルドされた RPM にはまだ正しい「PROVIDES」情報がありません。提供されたライブラリ情報なしで、以下の「PROVIDES」情報を取得します。

zeromq = 4.1.2-1
zeromq(x86-64) = 4.1.2-1

このためのCMakeLists.txt(いくつかの重要なコンテンツ)は

cmake_minimum_required (VERSION 3.4.0 FATAL_ERROR)    
set(COMP zeromq)
set(CompVersion 4.1.2)
set(CompURL http://download.zeromq.org/zeromq-${CompVersion}.tar.gz)
set(CompMD5 159c0c56a895472f02668e692d122685)

project(${COMP}  VERSION ${CompVersion})
include(ExternalProject)

ExternalProject_add(${COMP}
  PREFIX            ${COMP}
  URL               ${CompURL}
  URL_MD5           ${CompMD5}
  CONFIGURE_COMMAND <SOURCE_DIR>/configure --without-libsodium --prefix=${CMAKE_INSTALL_PREFIX})

install(FILES ${CMAKE_INSTALL_PREFIX}/lib/libzmq.so.5
              ${CMAKE_INSTALL_PREFIX}/lib/libzmq.so
              ${CMAKE_INSTALL_PREFIX}/lib/libzmq.so.5.0.0
        DESTINATION lib64)

string(REPLACE "." ";" VERSION_LIST ${PROJECT_VERSION})
list(LENGTH VERSION_LIST VERSION_LIST_LENGTH)
list(GET VERSION_LIST 0 CPACK_PACKAGE_VERSION_MAJOR)
list(GET VERSION_LIST 1 CPACK_PACKAGE_VERSION_MINOR)
if(VERSION_LIST_LENGTH GREATER 2)
  list(GET VERSION_LIST 2 CPACK_PACKAGE_VERSION_PATCH)
endif()


set(CPACK_GENERATOR "RPM")
set(CPACK_PACKAGE_VENDOR "Test")
set(CPACK_RPM_PACKAGE_GROUP "3rd-party-software")
set(CPACK_RPM_PACKAGE_AUTOPROV 1)
set(CPACK_RPM_PACKAGE_AUTOREQ 0)

set(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION
  /usr/lib
  /usr/lib64)
set(CPACK_RPM_COMPONENT_INSTALL OFF)

include(CPack)

この「CPACK_RPM_PACKAGE_AUTOPROV」オプションが有効にならない理由を誰かが知っていますか? RPM でこれらの「PROVIDES」情報を自動生成するにはどうすればよいですか? お時間をいただきありがとうございます。ヒントを提供していただければ幸いです。

4

2 に答える 2

0

install(PROGRAMS代わりに使用すると、ファイルの rpm でinstall(FILES正しく生成されます (少なくとも cmake 3.13 では)。ドキュメントに従って:provides.so

PROGRAMS フォームは、インストールされたファイルの既定のアクセス許可に OWNER_EXECUTE、GROUP_EXECUTE、および WORLD_EXECUTE も含まれることを除いて、FILES フォームと同じです。このフォームは、シェル スクリプトなど、ターゲットではないプログラムをインストールするためのものです。

共有ライブラリにも適していることがドキュメントに追加される可能性があります。

に固執したい場合はCPACK_RPM_PACKAGE_PROVIDES、変数がコンマ区切りのリストでなければならないことに注意してください。

(おそらく、ドキュメントへの別の追加の可能性があります)。

于 2018-12-18T12:29:32.747 に答える
0

CPACK_RPM_PACKAGE_AUTOPROV変数、その説明による:

パッケージによって提供される共有ライブラリの自動リストを有効 (1、はい) または無効 (0、いいえ) にするために使用できます。

によって作成されたターゲットにのみ影響しadd_library(SHARED)ます。

CMake も CPack も、拡張子からファイルの種類を推測しようとはしません。そのため、手動でインストールされたファイル ( 経由install(FILES)) は影響を受けません。

特定のファイルを PROVIDES リストに追加するには、変数CPACK_RPM_PACKAGE_PROVIDESを使用します。

RPM の依存関係を設定するために使用できます (提供します)。RPM ファイルの提供されたパッケージ リストは、次のように出力できます。

rpm -qp -- file.rpm を提供します

于 2016-03-25T07:06:11.353 に答える