2012-03-08 17 views
8

Zgodnie z FAQ, CMake nie tworzy docelowego obiektu make dist, a pakiet źródłowy można utworzyć za pomocą CPack. Ale CPack tworzy właśnie plik z katalogu źródłowego ze wszystkimi plikami, które nie pasują do wzorców w CPACK_SOURCE_IGNORE_FILES."Wykonaj dist" odpowiednik w CMake

Z drugiej strony make dist generowany przez autotools pakuje tylko te pliki, o których wie, głównie źródła potrzebne do kompilacji.

Ktoś ma inteligentny sposób tworzenia pakietu źródłowego z plikami tylko określonymi w CMakeLists.txt (i jego zależnościach)?

+0

nie odpowiedź, ale można korzystać z VCS to zrobić, na przykład [ 'git archive'] (http://schacon.github.com /git/git-archive.html) jeśli używasz git. – Simon

+0

dzięki za podpowiedź – marcin

+0

Istnieje blog z 2009 roku, ale nadal trochę niezgrabny: http://agateau.com/2009/cmake-and-make-dist/ – usr1234567

Odpowiedz

0

Myślałem o tym od dłuższego czasu i nie będę udawać, że mogę zasymulować kodowanie make dist bez tego bezpośrednio wspieranego przez CMake.

Problem polega na tym, że można dodać wiele zależności plików przy pomocy CMake z jednej strony (np. Do wstępnego budowania bibliotek), az drugiej strony CMake nie wie o zależnościach bezpośrednio sprawdzanych przez wygenerowane środowisko kompilacji (np. wszelkie zależności nagłówka).

Więc tutaj jest kod, który właśnie zbiera wszystkie CMakeList.txt i pliki źródłowe podane z jakichkolwiek celów produkcji:

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) 

Uwaga: użyto BUILDSYSTEM_TARGETS nieruchomość potrzebuje przynajmniej CUpewnij wersji 3.7

widzę powyższy kod jako punkt wyjścia i potwierdzenie koncepcji. Możesz dodawać biblioteki, nagłówki itp. Na podstawie potrzeb, ale prawdopodobnie powinieneś po prostu zmienić numer , aby wykonać licytację.

Jako punkt wyjścia patrz np. the link @ usr1234567 zawarte w komentarzach.

Referencje