2012-03-08 13 views
8

Según FAQ, CMake no crea un destino make dist y el paquete de origen se puede crear utilizando CPack. Pero CPack solo hace un archivo tar del directorio fuente con todos los archivos que no coinciden con los patrones en CPACK_SOURCE_IGNORE_FILES.equivalente "make dist" en CMake

Por otro lado, make dist generado por autotools agrupa solo los archivos que conoce, en su mayoría fuentes necesarias para la compilación.

Cualquiera tiene una forma inteligente de crear un paquete fuente con solo los archivos que se especifican en CMakeLists.txt (y sus dependencias)?

+0

No es una respuesta pero se puede usar sus VCS para hacer eso, por ejemplo [ 'git archive'] (http://schacon.github.com /git/git-archive.html) si está usando git. – Simon

+0

gracias por una pista – marcin

+0

Hay una publicación de blog de 2009, pero todavía algo torpe: http://agateau.com/2009/cmake-and-make-dist/ – usr1234567

Respuesta

0

He estado pensando en esto por un tiempo y no voy a pretender que puedo simular un make dist sin tener esto directamente compatible con CMake.

El problema es que puede agregar muchas dependencias de archivos con CMake por un lado (por ejemplo, precompilar bibliotecas) y por otro lado CMake no conoce las dependencias directamente controladas por el entorno de compilación generado (por ejemplo, cualquier dependencia de encabezado).

Así que aquí es un código que simplemente recoge todos CMakeList.txt y archivos de origen dados con cualquier tipos de generación:

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) 

Nota: La utilizado BUILDSYSTEM_TARGETS propiedad necesita al menos la versión CMake 3.7

veo el código anterior como punto de partida y prueba de concepto. Puede agregar bibliotecas, encabezados, etc. en función de las necesidades, pero probablemente debería modificar para realizar su oferta.

Como punto de partida, ver p. Ej. the link @ usr1234567 proporcionado en los comentarios.

Referencias