Hago cmake . && make all install
. Esto funciona, pero se instala en /usr/local
.
Necesito instalar en un prefijo diferente (por ejemplo, a /usr
).
¿Cuál es la línea de comando cmake
y make
para instalar en /usr
lugar de /usr/local
?
Puede pasar cualquier variable 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: RUTA = / usr. && hacer que todo se instale
Configuraría el proyecto, construiría todos los objetivos e instalaría el prefijo / usr. El tipo (PATH) no es estrictamente necesario, pero causaría que 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 utilizar un directorio de compilación externo, es decir, no la fuente directamente. También para usar una sintaxis CMake más genérica que abstraiga el generador.
mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX: PATH = / usr .. && cmake --build. --target install --config Release
Puede ver que se alarga bastante, 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 generadores de configuraciones múltiples (es decir, MSVC), ignorado por otros.
/usr .
Tenga en cuenta que tanto en CMake como en Autotools no siempre tiene que establecer 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 aquí ) como en:
make DESTDIR=<installhere> install
Vea también esta pregunta que explica la sutil diferencia entre DESTDIR y PREFIX.
Esto está destinado a instalaciones por etapas y para permitir el almacenamiento de programas en una ubicación diferente de donde se ejecutan, por ejemplo, a /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. Entonces en lugar de:
cmake -DCMAKE_INSTALL_PREFIX=/usr . && make all install
usted correría:
cmake . && make DESTDIR=/usr all install
Tenga en cuenta que, como señala user7498341, esto no es apropiado para los casos en los que realmente debería usar PREFIX.
DESTDIR
. Pero en realidad esto está mal. Debe consultar los documentos de cmake cmake.org/cmake/help/v3.0/variable/CMAKE_INSTALL_PREFIX.html ... make DESTDIR=/home/john install
que instalará el software en cuestión utilizando el prefijo de instalación, por ejemplo, "/ usr / local" antepuesto con el valor DESTDIR que finalmente da "/ home / john / usr / local".
cmake --build build --target install -- DESTDIR=/usr
tener en cuenta: esto también debería funcionar con el generador Ninja (las reglas parecen contener $ENV{DESTDIR}
)
La forma en que construyo los 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
./project-root/build/stage
, la ruta siempre se considera relativa al directorio actual si no es absoluta).
con el sistema de construcción configurado en la línea anterior. Ejecutará el install
destino que también construye todos los objetivos dependientes necesarios si es necesario construirlos y luego copia los archivos en el CMAKE_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 La --config <config>
bandera opcional .cmake --build
comando 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 ...
cmake -G "<generator>" -DCMAKE_INSTALL_PREFIX=stage ..
make -j $(nproc)
, para especificar el número de hilos de compilación, hacer cmake --build . --target=install --config=Release -- -j 8
para el generador de Makefile o cmake --build . --target=install --config=Release -- /m:8
para el generador de Visual Studio con 8 hilos. En realidad, puede pasar cualquier parámetro de la línea de comandos después de--
-j
no es una bandera para cmake, todas las banderas que vienen después --
pasan al sistema de compilación subyacente ...
En cuanto a la respuesta de Bruce Adams:
Tu respuesta crea confusión peligrosa. DESTDIR está diseñado para instalaciones fuera del árbol raíz. Permite ver lo que se instalaría en el árbol raíz si no se especifica 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, fuera / tmp / destdir, se podría ver qué afectaría 'make install'. En ese espíritu, DESTDIR nunca debería afectar a los objetos construidos.
Un segmento de archivo MAKE para explicarlo:
install:
cp program $DESTDIR$PREFIX/bin/program
Los programas deben suponer que PREFIX es el directorio base del directorio final (es decir, de producción). La posibilidad de vincular un programa instalado en DESTDIR = / something 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 lo hará:
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 trató de ejecutar prog desde otro lugar que no sea $ PREFIX / bin / prog, nunca se encontrará prog.db, ya que no está en su 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 muy recomendable hacerlo así:
Configurar 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.
--config
argumento?
Comenzando con CMake 3.15, la forma correcta de lograr esto sería usar:
cmake --install <dir> --prefix "/usr"
CMakeLists.txt
para que pueda configurarla y olvidarla. No estoy diciendo que no haya un caso de uso común para cambiar el directorio de instalación sobre la marcha, claramente lo está juzgando por el número de votos, soy bastante nuevo en CMake y tengo curiosidad cuando surge este problema.make install
ruta temporal para asegurarme de que todo lo que necesita ser instalado se haya instalado en la ubicación correcta sin estropear mi máquina de desarrollo. Solo un ejemplo. Otro caso es la compilación cruzada para otra arquitectura.CMakeLists.txt
, entonces necesito parchear la fuente original. Solo tener una opción de línea de comando me permite obtener las rutas directamente en elspec
archivo Fedora .CMakeLists.txt
archivo si solo está compilando e instalando software; el "consumidor" preferido es anular / configurar variables desde la línea de comandos o el archivo de caché inicial, etc. forma de configurar las opciones.