¿Cómo gestionar adecuadamente las dependencias para el proyecto C / C ++?

11

Tengo un proyecto que utiliza 3-4 bibliotecas C / C ++ de código abierto diferentes.

Construí estas bibliotecas para varias plataformas y registré incluir archivos y bibliotecas estáticas para diferentes plataformas en mi proyecto.

Sin embargo, lucho con un par de problemas. Todos estos proyectos están relacionados con la gestión de dependencias. Y estoy buscando consejos sobre mejores prácticas.

1) ¿Cómo sé qué uso exactamente?

No tengo forma de obtener una versión de una biblioteca estática. Como resultado, necesito de alguna manera rastrear qué versión de lib estática estoy usando (¿puede ser SHA de un commit desde el que se creó)?

Esto es especialmente importante cuando necesito averiguar cuándo actualizar estas bibliotecas.

2) ¿Cómo reproduzco la compilación?

Podría haber tenido dificultades para construir una biblioteca específica para una plataforma específica. Me tomó un tiempo darme cuenta.

La próxima vez que necesite construir la misma biblioteca podría ser en medio año (cuando necesite actualizar por cualquier razón. Sin embargo, para ese momento, definitivamente no recordaré nada y un entorno en el que fue construido se habrá ido hace mucho tiempo.

3) ¿Debo bifurcar estas bibliotecas para tener una copia del código fuente?

Esta es una preocupación menor. Sin embargo, sigue siendo una preocupación. Es bueno asegurarse de que las compilaciones sean reproducibles (y eso requiere un código fuente).

Victor Ronin
fuente

Respuestas:

5

¿Realmente necesita usar siempre una versión exacta de una biblioteca dependiente? ¿Está mal escrito / rompe su API con cada pequeño aumento en la versión?

Si observa proyectos de código abierto, sus configurescripts de compilación (en su mayoría) verifican si hay varias bibliotecas presentes y arroja un error si no es así. También es lo suficientemente flexible como para permitir que el usuario se vincule con una versión más nueva de la biblioteca (que probablemente proporciona más correcciones de errores / seguridad que una anterior) y tampoco impone enlaces estáticos o dinámicos.

Si realmente necesita compilaciones reproducibles, también debe prestar atención a la versión exacta del compilador y sus bibliotecas estándar, tal vez incluso el sistema operativo. En este caso, tener una máquina de compilación con el entorno exacto que necesita es, en mi opinión, mejor que registrar bibliotecas compiladas en el repositorio de código fuente.

D. Jurcau
fuente
2
No creo que necesite usar la versión exacta. Sin embargo, necesito saber cuál estoy usando. Por ejemplo, si alguien encuentra que OpenSSL 1.1.0b tiene una gran vulnerabilidad, sé mejor si uso OpenSSL 1.1.0b o 1.1.0c
Victor Ronin
En cuanto a una reproducibilidad de compilación, esa es probablemente mi segunda preocupación.
Victor Ronin
3

¿Cómo sé qué uso exactamente?

Si los archivos de inclusión o los archivos libs ya no contienen un número de versión, agregue un archivo de texto "version.txt" (que contenga el número de versión) a cada carpeta lib y conéctelo a su VCS, junto con los archivos lib e include . Sin embargo, si versiona la fuente completa de la lib (punto 3), es probable que ya exista un archivo de código fuente que contenga el número de versión, por lo que no es necesario mantener el suyo para este caso.

¿Cómo reproduzco la compilación?

Intenta automatizar tanto como puedas. Use scripts, archivos MAKE o archivos de sus herramientas de compilación favoritas. Ponga todo esto bajo control de la fuente. Si se requieren pasos manuales, escriba los detalles en un archivo de texto (por ejemplo, readme_build.txt) y póngalo también bajo control de origen.

¿Debo bifurcar estas bibliotecas para tener una copia del código fuente?

Debe tener una copia del código fuente , pero bifurcar solo si es necesario (por ejemplo, si tropieza con un error urgente y el autor original no puede solucionarlo dentro de las restricciones de tiempo). O, si los autores usan un entorno de compilador diferente al suyo, y es necesario hacer algunos cambios para que la biblioteca funcione en su entorno. Sin embargo, tenga en cuenta que cada cambio en el código fuente original en su bifurcación probablemente dificulte la integración de actualizaciones en un momento posterior.

Sin embargo, recomiendo obtener una copia del código fuente original (sin codificar) de las bibliotecas que está utilizando. Eso le permitirá bifurcar o mantener la biblioteca más tarde si es necesario, incluso si el responsable original decide revocar las fuentes de la biblioteca de la web pública.

Doc Brown
fuente
Entonces, la respuesta es "haz esto manualmente" :) Esperaba que alguien dijera ... oh ... hay una herramienta para eso :) Cuando dices "copia del código fuente" quieres decir, solo obtén un archivo tar con la fuente y volcarlo en el control de la fuente?
Victor Ronin
1
@VictorRonin: no, la respuesta es "deje que su VCS maneje todo lo que pueda hacer por usted" y "automatice todo lo que pueda con las herramientas de compilación estándar". Usted es quien elige una versión específica y es el que necesita definir los pasos de compilación, vincular e incluir referencias para su entorno. El procedimiento estándar para manifestar estas dependencias es a través de scripts, archivos MAKE, archivos de proyecto, etc.
Doc Brown
... y cómo obtiene el código fuente de la biblioteca o las bibliotecas depende de cómo lo proporcione el responsable / proveedor. Tal vez una bola de alquitrán, tal vez por acceso directo a git hub, tal vez un paquete nuget.
Doc Brown