descarga - cmake vs make
¿Cuál es el equivalente de CMake de ''configure--prefix=DIR && make all install''? (6)
La forma en que construyo proyectos CMake multiplataforma es la siguiente:
/project-root> mkdir build
/project-root> cd build
/project-root/build> cmake -G "<generator>" -DCMAKE_INSTALL_PREFIX=stage ..
/project-root/build> cmake --build . --target=install --config=Release
- Las dos primeras líneas crean el directorio de compilación fuera de la fuente
- La tercera línea genera el sistema de compilación especificando dónde colocar el resultado de la instalación (que siempre
./project-root/build/stage
en./project-root/build/stage
- la ruta siempre se considera relativa al directorio actual si no es absoluta) - La cuarta línea construye el proyecto configurado en
.
con el sistema de construcción configurado en la línea anterior. Ejecutará el destino deinstall
, que también genera todos los objetivos dependientes necesarios si necesitanCMAKE_INSTALL_PREFIX
y luego copia los archivos en elCMAKE_INSTALL_PREFIX
(que en este caso es./project-root/build/stage
. Para compilaciones de configuración múltiple, como en Visual Studio, también puede especificar la configuración con el--config <config>
opcional--config <config>
. - La parte buena cuando se utiliza el comando
cmake --build
es que funciona para todos los generadores (es decir, makefiles y Visual Studio) sin necesidad de comandos diferentes.
Luego uso los archivos instalados para crear paquetes o incluirlos en otros proyectos ...
Yo hago cmake . && make all install
cmake . && make all install
. Esto funciona, pero se instala en /usr/local
.
Necesito instalar en un prefijo diferente (por ejemplo, a /usr
).
¿Qué es la línea de comandos cmake
y make
para instalar en /usr
lugar de /usr/local
?
La parte ": PATH" en la respuesta aceptada se puede omitir. Esta sintaxis puede ser más memorable:
cmake -DCMAKE_INSTALL_PREFIX=/usr . && make all install
... como se usa en las respuestas here .
Puede pasar cualquier variable de CMake en la línea de comando, o editar las variables en caché usando ccmake / cmake-gui. En la línea de comando,
cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr . && make all install
Configuraría el proyecto, compilaría todos los objetivos e instalaría en el prefijo / usr. El tipo (PATH) no es estrictamente necesario, pero haría que el cmake-gui basado en Qt presente el diálogo de selección de directorio.
Algunas adiciones menores como comentarios dejan en claro que proporcionar una equivalencia simple no es suficiente para algunos. La mejor práctica sería usar un directorio de compilación externo, es decir, no la fuente directamente. También usar una sintaxis CMake más genérica que resuma el generador.
mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr .. && cmake --build . --target install --config Release
Puede ver que se vuelve un poco más largo, y ya no es directamente equivalente, pero está más cerca de las mejores prácticas en una forma bastante concisa ... El --config solo lo usan los generadores de configuración múltiple (es decir, MSVC), ignorado por otros.
Respecto a la respuesta de Bruce Adams:
Tu respuesta crea una confusión peligrosa. DESTDIR está diseñado para instalaciones fuera del árbol raíz. Permite ver qué se instalaría en el árbol raíz si no se especificara DESTDIR. PREFIX es el directorio base en el que se basa la instalación real.
Por ejemplo, PREFIX = / usr / local indica que el destino final de un paquete es / usr / local. El uso de DESTDIR = $ HOME instalará los archivos como si $ HOME fuera la raíz (/). Si, por ejemplo, DESTDIR, era / tmp / destdir, se podría ver lo que afectaría ''make install''. En ese espíritu, DESTDIR nunca debe afectar los objetos construidos.
Un segmento de makefile para explicarlo:
install:
cp program $DESTDIR$PREFIX/bin/program
Los programas deben asumir que PREFIX es el directorio base del directorio final (es decir, producción). La posibilidad de sincronizar un programa instalado en DESTDIR = / algo solo significa que el programa no accede a los archivos basados en PREFIX ya que simplemente no funcionaría. cat (1) es un programa que (en su forma más simple) puede ejecutarse desde cualquier lugar. Aquí hay un ejemplo que no:
prog.pseudo.in:
open("@prefix@/share/prog.db")
...
prog:
sed -e "s/@prefix@/$PREFIX/" prog.pseudo.in > prog.pseudo
compile prog.pseudo
install:
cp prog $DESTDIR$PREFIX/bin/prog
cp prog.db $DESTDIR$PREFIX/share/prog.db
Si intentara ejecutar prog desde una ubicación diferente a $ PREFIX / bin / prog, nunca se encontrará prog.db ya que no se encuentra en la ubicación esperada.
Finalmente, / etc / alternative realmente no funciona de esta manera. Hay enlaces simbólicos a los programas instalados en el árbol raíz (por ejemplo, vi -> / usr / bin / nvi, vi -> / usr / bin / vim, etc.).
Se considera una mala práctica invocar el generador real (por ejemplo, a través de make
) si se usa CMake . Es altamente recomendable hacerlo así:
Configurar la fase:
cmake -Hfoo -B_builds/foo/debug -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_DEBUG_POSTFIX=d -DCMAKE_INSTALL_PREFIX=/usr
Fases de construcción e instalación
cmake --build _builds/foo/debug --config Debug --target install
Al seguir este enfoque, el generador se puede cambiar fácilmente (por ejemplo, -GNinja
para Ninja ) sin tener que recordar ningún comando específico del generador.
Tenga en cuenta que tanto en CMake como en Autotools no siempre tiene que configurar la ruta de instalación en el momento de la configuración. Puede usar DESTDIR en el momento de la instalación (consulte también here ) como en:
make DESTDIR=<installhere> install
Vea también esta pregunta que explica la sutil diferencia entre DESTDIR y PREFIX.
Está diseñado para instalaciones en etapas y para permitir el almacenamiento de programas en una ubicación diferente de donde se ejecutan, por ejemplo, /etc/alternatives
través de enlaces simbólicos.
Sin embargo, si su paquete es reubicable y no necesita ninguna ruta codificada (prefijo) establecida a través de la etapa de configuración, puede omitirlo. Así que en lugar de:
cmake -DCMAKE_INSTALL_PREFIX=/usr . && make all install
tu correrías
cmake . && make DESTDIR=/usr all install
Tenga en cuenta que, como lo indica el usuario7498341, esto no es apropiado para los casos en los que realmente debería usar PREFIX.