2012-03-08 9 views
8

FAQによると、CMakeはmake distターゲットを作成せず、CPackを使用してソースパッケージを作成できます。しかし、CPackはソースディレクトリのtarballをパターンに一致しないすべてのファイルで作成します。CPACK_SOURCE_IGNORE_FILES"make dist" CMakeで同等

一方、autotoolsによって生成されるmake distは、ほとんどの場合、コンパイルに必要なソースのみをバンドルしています。

誰かが、CMakeLists.txt(およびその依存関係)で指定されているファイルだけでソースパッケージを作成するスマートな方法を持っていますか?

+0

ない答えが、あなたは、例えば、それを行うには、あなたのVCSを使用することができます[ 'gitのarchive'](http://schacon.github.com/git/git-archive.html)を使います。 – Simon

+0

ヒントありがとう – marcin

+0

2009年のブログ記事がありますが、まだまだ不器用です。http://agateau.com/2009/cmake-and-make-dist/ – usr1234567

答えて

0

私はこれについてしばらく考えていましたが、私はmake distをシミュレートすることはできませんが、これはCMake自身が直接サポートしていることはありません。

問題は、一方の側でCMakeに多くのファイル依存関係を追加することができます(例えば、ライブラリをビルドする前に)。CMakeは生成されたビルド環境自体によって直接チェックされた依存関係を知らない例えば、あらゆるヘッダ依存性)。だからここ

は、ちょうどすべてのCMakeList.txtと任意のビルドターゲットを指定したソースファイルを収集コードです:

function(make_dist_creator _variable _access _value _current_list_file _stack) 
    if (_access STREQUAL "MODIFIED_ACCESS") 
     # Check if we are finished (end of main CMakeLists.txt) 
     if (NOT _current_list_file) 
      get_property(_subdirs GLOBAL PROPERTY MAKE_DIST_DIRECTORIES) 
      list(REMOVE_DUPLICATES _subdirs) 
      foreach(_subdir IN LISTS _subdirs) 
       list(APPEND _make_dist_sources "${_subdir}/CMakeLists.txt") 
       get_property(_targets DIRECTORY "${_subdir}" PROPERTY BUILDSYSTEM_TARGETS) 
       foreach(_target IN LISTS _targets) 
        get_property(_sources TARGET "${_target}" PROPERTY SOURCES) 
        foreach(_source IN LISTS _sources) 
         list(APPEND _make_dist_sources "${_subdir}/${_source}") 
        endforeach() 
       endforeach() 
      endforeach() 

      add_custom_target(
       dist 
       COMMAND "${CMAKE_COMMAND}" -E tar zcvf "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.tar.gz" -- ${_make_dist_sources} 
       COMMENT "Make distribution ${PROJECT_NAME}.tar.gz" 
       WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" 
      ) 
      message("_make_dist_sources = ${_make_dist_sources}") 
     else() 
      # else collect subdirectories in my source dir 
      file(RELATIVE_PATH _dir_rel "${CMAKE_SOURCE_DIR}" "${_value}") 
      if (NOT _dir_rel MATCHES "\.\.") 
       set_property(GLOBAL APPEND PROPERTY MAKE_DIST_DIRECTORIES "${_value}") 
      endif() 
     endif() 
    endif() 
endfunction() 

variable_watch("CMAKE_CURRENT_LIST_DIR" make_dist_creator) 

:使用BUILDSYSTEM_TARGETSプロパティは、私が見る少なくともCMakeのバージョン3.7

を必要とします上記のコードを出発点とし、概念を証明します。必要に応じて図書館、ヘッダーなどを追加することもできますが、おそらく入札を行うにはを調整する必要があります。

開始点として、コメントにはthe link @ usr1234567が記載されています。

参照

関連する問題