2011-11-16 31 views
14

Básicamente quiero lograr este flujo de trabajo:Cómo descargar automáticamente las dependencias C++ de forma cruzada + CMake?

  1. Pedido desde el repositorio de sistema de Windows (o cualquier plataforma para el caso).

  2. Ejecutar alguna herramienta que se pone dependencias, tanto incluye y bibliotecas y los pone en su lugar adecuado (como en "\ Archivos de programa \ Microsoft Visual Studio 10.0 \ VC \ lib y \ Incluye" en las ventanas)

  3. Ejecutar CMake (crea proyectos MSVS en win)

  4. Abra el proyecto MSVS y compílelo.

Y me gustaría tener este flujo de trabajo en la mayoría de las plataformas.

Yo no quiero tener que descargar manualmente las dependencias

cómo hacer esto sin almacenar dependencias en el repositorio? ¿Cuál es la mejor manera de lograr esto?

+1

¿Has encontrado alguna solución a tu problema? He estado buscando algo como npm para construir programas C/C++ con dependencias. –

+0

@hg. no hay un administrador de paquetes multiplataforma para C++ hasta donde yo sé. – JBeurer

Respuesta

19

En CMake puede utilizar file(DOWNLOAD URL PATH) a download a file, combinar esto con comandos personalizados para descargar y descomprimir:

set(MY_URL "http://...") 
set(MY_DOWNLOAD_PATH "path/to/download/to") 
set(MY_EXTRACTED_FILE "path/to/extracted/file") 

if (NOT EXISTS "${MY_DOWNLOAD_PATH}") 
    file(DOWNLOAD "${MY_URL}" "${MY_DOWNLOAD_PATH}") 
endif() 

add_custom_command(
    OUTPUT "${MY_EXTRACTED_FILE}" 
    COMMAND command to unpack 
    DEPENDS "${MY_DOWNLOAD_PATH}") 

Su objetivo debe depender de la salida del comando personalizado, a continuación, al ejecutar CMake el archivo ser descargado, y cuando construyes, extraes y usas.

Todo esto podría incluirse en una macro para que sea más fácil de usar.

También puede consultar el uso del módulo CMake ExternalProject que puede hacer lo que desee.

+0

Pero esta no es una forma de plataforma cruzada para configurar e instalar las dependencias, ni las dependencias se descargan desde un repositorio común – JBeurer

+0

El uso de CMake 'file (DOWNLOAD ...)' o ExternalProject es multiplataforma. Si las dependencias son paquetes, entonces en Windows necesitaría usar 'msiexec' para la instalación del paquete MSI; en Linux, depende de la distribución: en derivados de Red Hat 'yum' o' rpm' con paquetes RPM, en derivados de Debian 'apt' o' dpkg' con paquetes DEB. –

+0

Sí, el comando de descarga es crossplatform, sin embargo, esta no es una forma de plataforma cruzada para INSTALAR dependencias. Cada plataforma generalmente tiene diferentes archivos y paquetes (y por lo tanto enlaces de descarga) para la misma dependencia. Se podría decir que estoy buscando algo como Maven para las dependencias de C++ que encajarían bien con CMake. – JBeurer

-24

La mejor manera de lograr esto es eliminar sus dependencias.

Las dependencias son malas.

Eliminarlos en lugar de depender de ellos.

En serio.

No desea descargarlos manualmente, no desea almacenarlos en su repositorio, sus clientes no desean descargarlos por usted. De hecho, su compilador ni siquiera quiere compilarlos.

Prefiero cambiar a Java para añadir una biblioteca de C++ dependencia ...

Mientras tanto, la sugerencia de revisar el módulo de ExternalProject de CMake es lo más cerca que vas a llegar a un repositorio almacenado no- automatic-dependency-download-configure-build-and-install próximamente con una compilación basada en CMake.

+6

No, no se puede hacer. ¿Cambiar a Java? No. No. No. ¡Por favor, dios NOOOOOOO! – JBeurer

+5

Creo que este es un punto interesante, sin embargo, está redactado como cebo de llama y no tiene en cuenta las necesidades del usuario. – pope

+1

Creo que el humor de un hombre es el "cebo de la llama" de otro hombre ... Y creo que la referencia a ExternalProject, tanto en mi respuesta como en la otra respuesta más votada, es lo más cercano que existe que responde a las necesidades del usuario. No hay ninguna bala mágica aquí, ningún experto para C++. Si el proyecto http://ryppl.org Alguna vez se convierte en realidad, superará ExternalProject. Por ahora, ese es el mejor puntero que tengo. – DLRdave

3

Hunter es un sistema basado en CMake 3 para la administración de dependencias. Funciona bastante bien pero todavía no tiene muchos paquetes. Si los paquetes que necesita aún no son parte del sistema, se pueden agregar de forma bastante sencilla, suponiendo que también estén basados ​​en CMake.

-2

La mejor manera de lograr esto es eliminar sus dependencias.

Las dependencias son malas.

Eliminarlos en lugar de depender de ellos.

En serio

Cuestiones relacionadas