react helmet c build makefile configure autoconf

react helmet seo



¿Mejores prácticas para el manejo de CFLAGS en los scripts de configuración? (2)

No soy un fanático de autoconf, pero en aras del principio de menos sorpresa, estoy tratando de hacer que mis scripts de configuración (no autoconf) se comporten lo más cerca posible de lo que los usuarios esperan de un sistema de compilación basado en autoconf. Los estándares de codificación de GNU son en realidad bastante razonables en este tema, y ​​mencionan explícitamente la posibilidad de no usar autoconf / automake, pero proporcionar una interfaz compatible de otra manera:

https://www.gnu.org/prep/standards/standards.html#Configuration

Sin embargo, un problema del que no puedo encontrar una buena descripción es cómo manejar mejor los CFLAGS. Para mí está claro que cualquier indicador esencial (como -I$(srcdir)/inc ) que no pertenece al negocio del usuario no pertenece a CFLAGS ni en el script de configuración ni en el archivo make, ya que anularlo completamente rompería la compilación. Por lo tanto, estos o bien están codificados en el archivo make, o (si requieren algún tipo de detección) configuran la lógica de detección, pero los pasaron a través de una variable make separada en lugar de CFLAGS para que no se anulen.

Sin embargo, lo que aún no tengo claro cómo manejar mejor es cosas opcionales como niveles / opciones de optimización, marcas de advertencia, depuración, etc. ¿Deben agregarse las --enable-warnings habilitadas por cosas como --enable-debug o --enable-warnings CFLAGS o pasados ​​en alguna otra variable make? ¿Qué pasa si entran en conflicto con las banderas que ya están en CFLAGS proporcionadas por el CFLAGS ?

Puedo ver dónde para una gran cantidad de proyectos la respuesta debería ser simplemente "no se metan con eso en absoluto y dejen que el usuario elija su CFLAGS ", pero algunos de mis casos de uso son proyectos en los que la base de usuarios generalmente está interesada en tener Configuraciones optimizadas y de depuración listas para usar.

Edición: otro problema que olvidé: cuando se trata de detectar y utilizar automáticamente ciertos CFLAGS que no son esenciales pero preferidos, ¿esto debería hacerse solo si el usuario dejó el CFLAGS en blanco en el entorno, o siempre?


Sería lo suficientemente sensato como para que el usuario espere tener que luchar con las cosas al proporcionar banderas personalizadas. CFLAGS se puede CPPFLAGS , CPPFLAGS puede CPPFLAGS (las opciones de las rutas de búsqueda de encabezado se ven en la primera ruta, mientras que las optimizaciones y directivas del compilador se ven en las últimas opciones (o, más bien, anulan las opciones anteriores))

--enable-debug y quizás otras directivas de línea de comandos proporcionadas al script de configuración no solo tienen que cambiar las opciones del compilador, sino que también tienen la posibilidad de cambiar las cosas dentro de la fuente (tal vez, por ejemplo, redefinir las macros en línea para que sean reales Funciones), por lo que sus usos son algo diferentes.

En conclusión, CPPFLAGS especifique el CFLAGS especificado por el usuario y el CFLAGS especificado por el usuario; Cualquier opción de configuración de script puede ser agregada o agregada dependiendo del contexto.


Si desea manejar argumentos como --enable-warnings, tiene mucho trabajo por hacer. Si quieres que sea sencillo, puedes hacer que ese argumento agregue algo como

CFLAGS="$CFLAGS -Wall -Wextra"; CPPFLAGS="$CPPFLAGS -DWARNINGS"

en su script de configuración, pero esto realmente abre una gran lata de gusanos. ¿Son esas opciones reconocidas por todos los compiladores, o está asumiendo que su usuario está usando un compilador que reconoce esas opciones y por lo que hace lo que quiere? Probablemente deba ajustar esa asignación en otro cheque para un conjunto de compiladores que conozca. O es necesario que compruebe que el compilador que está utilizando el usuario al menos no produce errores cuando pasa esos indicadores (tal vez el usuario ya haya establecido -Wsome en CFLAGS, y el compilador generará un error con el argumento en conflicto - Muro.) Los mismos problemas se aplican a --enable-debug. Parece perfectamente razonable responder a --enable-debug agregando -DEBUG a CPPFLAGS, por lo que el usuario no necesita examinar su fuente para determinar si la depuración está habilitada a través de -DEBUG en lugar de -DDEBUG, pero no puede predecir todas las situaciones y En general, es mejor errar por el lado de la precaución y no hacer tales cosas.

Si desea que sus usuarios tengan "configuraciones optimizadas y de depuración listas para usar", el script de configuración para el proyecto es el lugar equivocado para hacerlo. Mantenga la configuración simple y haga que sus usuarios usen un sistema de administración de paquetes como pkgsrc para tales cosas. Si desea que su tarball de distribución tenga alguna de esa funcionalidad, proporcione un conjunto de scripts (quizás invocado automágicamente por el script de configuración después de detectar una plataforma, pero proporcione la capacidad de anular esa función) para plataformas comunes que realizan asignaciones para el usuario y De esta forma proporcionamos la funcionalidad deseada. Pero mantén el script de configuración en sí mismo.