2

私はCMakeを使用して、次のレイアウトでプロジェクトを管理しています。

ProjectA/
  include
  doc
  test
ProjectB
  include
  doc
  test

CPackを使用して、次のレイアウトでtar.gz ソースアーカイブをパッケージ化したいと思います。

include/
ProjectA/
  doc
  test
ProjectB/
  doc
  test

ここで、新しいトップレベルのインクルードにはすべてのインクルードファイルが含まれています。

を介してCMakeスクリプトを実行してこれを達成しようとしましたCPACK_INSTALL_SCRIPTが、このスクリプトはファイルが作成される前に実行されます。その効果を得るためにどこでCPackに接続できますか?

また、それはinstall何をするかに影響を与えないようですが、に影響を与えます。残念ながら、ライブラリのビルドとパッケージ化も行いますが、これは私が望んでいないことです。純粋なソース配布alaが必要です。make package_sourcemake packagemake packagemake dist

4

3 に答える 3

4

両方からinstall(DIRECTORY include DESTINATION include)ヘッダーを呼び出して、同じディレクトリにインストールできます。これにより、CPackはそれらを生成されたパッケージにまとめて配置します。ProjectAProjectB

アップデート

さて、私はCPACK_INSTALL_SCRIPT変数でこれを行うことができました。

次のスクリプトを作成しました。

set(CMAKE_SOURCE_DIR @CMAKE_SOURCE_DIR@)

execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/A/ ${CMAKE_SOURCE_DIR})
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/B/ ${CMAKE_SOURCE_DIR})
execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_SOURCE_DIR}/A)
execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_SOURCE_DIR}/B)

CMakeLists.txt私はそれに実際の値を入力しましたCMAKE_SOURCE_DIR

configure_file(CPackScript.cmake CPackScript.cmake @ONLY)

最後に、追加set(CPACK_INSTALL_SCRIPT ${CMAKE_BINARY_DIR}/CPackScript.cmake)して出来上がりです!生成されたパッケージには、とのinclude両方からのヘッダーを持つdirが含まれるようになりましたが、とdirsは存在しません。A/B/A/B/

于 2012-12-22T19:15:00.390 に答える
3

別の可能なアプローチは、TGZアーカイブの生成のためにCPackを完全にバイパスし、アーカイブを生成するCMakeカスタムターゲットを使用することです。

project (MyProject)

set (DIST_TEMP_DIR "${CMAKE_BINARY_DIR}/dist")
make_directory(${DIST_TEMP_DIR})

add_custom_target(dist 
    COMMAND ${CMAKE_COMMAND} -E remove_directory "${DIST_TEMP_DIR}/${PROJECT_NAME}/"
    COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/ProjectA/include" "${DIST_TEMP_DIR}/${PROJECT_NAME}/include"
    COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/ProjectA/test" "${DIST_TEMP_DIR}/${PROJECT_NAME}/ProjectA/test"
    COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/ProjectA/doc" "${DIST_TEMP_DIR}/${PROJECT_NAME}/ProjectB/doc"
    COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/ProjectB/include" "${DIST_TEMP_DIR}/${PROJECT_NAME}/include"
    COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/ProjectB/doc" "${DIST_TEMP_DIR}/${PROJECT_NAME}/ProjectA/doc"
    COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/ProjectB/test" "${DIST_TEMP_DIR}/${PROJECT_NAME}/ProjectB/test"
    COMMAND ${CMAKE_COMMAND} -E tar cvz "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.tar.gz"  "${DIST_TEMP_DIR}/${PROJECT_NAME}/"
    COMMENT "Building ${PROJECT_NAME}.tar.gz"
    WORKING_DIRECTORY "${DIST_TEMP_DIR}"
)

カスタムターゲットdistは、最初に、複数のコマンドを使用してコマンドモードでCMakeを呼び出すことにより、ビルドフォルダー内の一時ディレクトリにアーカイブの目的の構造を設定しcopy_directoryます。次に、コマンドモードサブコマンドtar.gzを使用してアーカイブを生成します。tar

于 2012-12-28T14:11:56.827 に答える
2

正確に何が機能していないのかわかりません。

これは、WindowsのZIPジェネレーターで私にとってうまくいくものです。これがTGZでも機能するかどうかを確認するために、Linuxマシンを見つけようとします(編集:機能します):

ディレクトリ構造:

CMakeLists.txt
ProjectA/
    doc
        foo.txt
    include
        foo.h
    test
        foo.test
ProjectB/
    doc
        bar.txt
    include
        bar.h
    test
        bar.test

ProjectA/CMakeLists.txt

project( ProjectA )

INSTALL( DIRECTORY include DESTINATION . )
INSTALL( DIRECTORY doc DESTINATION ${PROJECT_NAME}/ )
INSTALL( DIRECTORY test DESTINATION ${PROJECT_NAME}/ )

ProjectB/CMakeLists.txt

project( ProjectB )

INSTALL( DIRECTORY include DESTINATION . )
INSTALL( DIRECTORY doc DESTINATION ${PROJECT_NAME}/ )
INSTALL( DIRECTORY test DESTINATION ${PROJECT_NAME}/ )

CMakeLists.txt:

project( MyProject )

ADD_SUBDIRECTORY(ProjectA)
ADD_SUBDIRECTORY(ProjectB)

INCLUDE(CPack)

パッケージを作成すると、

MyProject-0.1.1-win32.zip
    MyProject-0.1.1-win32
        include
            bar.h
            foo.h
        ProjectA
            doc
                foo.txt
            test
                foo.test
        ProjectB
            doc
                bar.txt
            test
                bar.test

それはあなたが意図したものですか?

ソース パッケージ

ソース パッケージの作成では、CPack はデフォルトでインストール コマンドを無視し、 で指定されたすべてのディレクトリをインストール/コピーしますCPACK_SOURCE_INSTALLED_DIRECTORIES。この変数には、ソース ディレクトリと宛先ディレクトリのペアが含まれます。"${CMAKE_SOURCE_DIR};/"手動で設定しない場合はデフォルトです。正確には、これらのディレクトリをグロブし、CPACK_SOURCE_IGNORE_FILESデフォルトですべての主要な VCS ブックキーピング ファイルが設定されているすべてのファイルを無視します (CPackSourceConfig.cmake例を参照)。

次のことができます。

CMakeLists.txt

project( MyProject )

SET( PROJECTS ProjectA ProjectB )

SET(CPACK_SOURCE_INSTALLED_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR};/") 
FOREACH( p ${PROJECTS} ) 
    ADD_SUBDIRECTORY( ${p} )
    LIST( APPEND CPACK_SOURCE_INSTALLED_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR/${p}/include include )
ENDFOREACH()


INCLUDE(CPack)

またはCPACK_SOURCE_INSTALLED_DIRECTORIES、それぞれのプロジェクト ファイルに操作を追加します。

ただし: これにより、インクルード ディレクトリが最上位のインクルード ディレクトリにインストールされますが、グロビングのためにプロジェクト ディレクトリ内に別のコピーが作成されます。おそらく、docとディレクトリ用に追加のディレクトリ ペアを作成し、コマンドtestでの の初期化をスキップできます。これを行う場合、プロジェクト固有の CMake ファイルをインストール/コピーする方法を見つける必要があります。CPACK_SOURCE_INSTALLED_DIRECTORIESSET

大きな警告ProjectA: プロジェクト ローカルのインクルード ディレクトリをProjectB参照する場合(たとえばINCLUDE_DIRECTORIES(...)、CMake コードを壊して、ソースのインストールを (部分的に) 役に立たなくすることになります。そのため、最上位のインクルード ディレクトリの考えを再考することをお勧めします。

于 2012-12-27T10:06:58.777 に答える