Instalando múltiples versiones de software con git

Realmente estoy luchando por entender git , así que aquí hay una reformulación más estricta de una pregunta anterior que hice. Voy a explicar un escenario hipotético, detallando lo que creo que sucede cuando descargas algún código usando git e lo instalas en una máquina, ¡y con suerte alguien puede decirme sobre qué parte soy incorrecto!

  1. git clone git://github.com/foo/foo.git
  2. Esto crea un directory local foo y descarga el código fuente y los datos de git
  3. Este código fuente contiene efectivamente todas las versiones del software: files de origen, file de encabezado y datos de git para las diferentes versiones
  4. git checkout release-1.0
  5. Esto le dice a mi sistema que quiero tratar con la versión 1.0 del software
  6. Ejecuto make , que comstack el código para la versión 1.0
  7. Esto crea una biblioteca llamada libfoo.so.1
  8. Ejecuto make install , que instala la biblioteca
  9. Esto copy sobre libfoo.so.1 en el directory /usr/local/lib
  10. También copy sobre el file de encabezado foo.h en el directory /usr/local/include
  11. Este file de encabezado es la versión de foo.h que corresponde a la versión 1.0 del software
  12. Ahora también quiero instalar la versión 2 del software, así que ejecuto git checkout release-2.0
  13. Esto le dice a mi sistema que quiero tratar con la versión 2.0 del software
  14. Ejecuto make , que comstack el código para la versión 2.0
  15. Esto crea una biblioteca llamada libfoo.so.2
  16. Ejecuto make install , que instala la biblioteca
  17. Esto copy sobre libfoo.so.2 en el directory /usr/local/lib
  18. También copy sobre el file de encabezado foo.h en el directory /usr/local/include
  19. Este file de encabezado es la versión de foo.h que corresponde a la versión 2.0 del software
  20. Ahora trato de crear un proyecto que dependa de la versión 2.0 del software, y lo vinculo a libfoo.so.2 que está en /usr/local/lib , e foo.h que está en /usr/local/include
  21. Este proyecto comstack y funciona bien
  22. Ahora trato de crear un proyecto que dependa de la versión 1.0 del software, y lo vinculo a libfoo.so.1 que está en /usr/local/lib , e foo.h que está en /usr/local/include
  23. Este proyecto no comstack bien, porque foo.h es el file de encabezado para la versión 2.0 del software, no la versión 1.0.

Entonces, lo que me deja perplejo es cómo puede tener dos versiones de algún software instalado en su máquina. Los files de biblioteca reales libfoo.so.1 y libfoo.so.2 se crean y pueden vincularse con dos proyectos diferentes, pero solo hay una versión de foo.h instalada en la máquina local. Por lo tanto, solo la versión que se instaló más reciente tendrá el file de encabezado correcto, porque las dos versiones requieren versiones diferentes de foo.h

Por favor, ¿alguien puede explicarme dónde me estoy confundiendo? ¡Gracias!

Puede instalar las diferentes versiones de la biblioteca en directorys separados, de modo que la segunda versión que se instalará no sobrescribirá los files de la primera versión. Normalmente, puede especificar un prefijo de installation cuando ejecuta el script de configure .

Por ejemplo, para la versión 1, puede ejecutar:

 ./configure --prefix=/opt/foo-v1 make make install 

libfoo.so.1 se instalará en /opt/foo-v1/lib , y foo.h (para la versión 1) se instalará en /opt/foo-v1/include .

Del mismo modo, para la versión 2, puede ejecutar:

 ./configure --prefix=/opt/foo-v2 make make install 

libfoo.so.2 se instalará en /opt/foo-v2/lib , y foo.h (para la versión 2) se instalará en /opt/foo-v2/include .

Ahora, cuando comstack un progtwig que depende de la versión 1 de la biblioteca, puede especificar el encabezado y las routes de biblioteca apropiadas para la versión 1:

 clang++ -I/opt/foo-v1/include -L/opt/foo-v1/lib -lfoo program1.cc 

Del mismo modo, para la versión 2:

 clang++ -I/opt/foo-v2/include -L/opt/foo-v2/lib -lfoo program2.cc 

Tenga en count que el procedimiento exacto para especificar un prefijo de installation puede variar de un proyecto a otro en function de las herramientas de compilation que se utilicen. Normalmente, habrá un file README y / o INSTALL que documenta el procedimiento para el proyecto en cuestión.

Tu pregunta no está realmente relacionada con git en absoluto. Obtendrá el mismo problema con cualquier cosa, y la raíz de su problema es que al instalar una versión sobrescribe los mismos files en una location fija ( /usr/lib/foo.h ). Si desea poder trabajar contra ambas versiones al mismo time, debe encontrar la manera de cambiarla.