2010-07-02 23 views
7

Estoy compilando paquetes y veo que a menudo los autores de Makefile escriben set CFLAGS en el archivo MAKE, con tal y tales opciones. Yo, por otro lado, me gustaría probar algunas optimizaciones del compilador y me gustaría propagar los modificadores del compilador para hacerlos con la menor cantidad de problemas posible. No siempre es esto factible sin embargo. Por ejemplo, cuando un archivo MAKE especifica CFLAGS y quiero que todas las invocaciones del compilador C utilicen -fomit-frame-pointer, salvo tener que escribir explícitamente algo como CFLAGS=-fomit-frame-pointer make, ¿cuáles son mis opciones que no son hackish? Por lo que puedo ver que hay de lo anterior, entonces no es el mismo pero diferente make "CFLAGS=-fomit-frame-pointer" y también puede hacer lo que considero que es la mejor solución y la razón de esta pregunta: ¿¿Por qué las variables de entorno no anulan las variables establecidas en los archivos make de forma predeterminada?

export CFLAGS=-fomit-frame-pointer 
make -e 

considero este el mejor uno, porque francamente pensé que era una bandera potencialmente peligrosa, no depuro tanto el software, y cuando necesito puedo recompilar una pieza en particular a pedido, con información de depuración y todo. De lo contrario, me gusta trabajar con el software de lanzamiento sin depurar para nada las campanas y silbatos, especialmente si el paquete no es mi autor. Así que supongo que lo que pregunto aquí específicamente es: ¿por qué make no prefiere automáticamente las variables de entorno a las de makefile? Después de que todo el entorno sabe mejor qué es qué, y en caso de que el autor realmente necesite tener algo a su manera, existe la sintaxis de "anulación", ¿no?

+0

Hay un parámetro que hacer: --environment-overrides que hace lo que describes, creo, por lo que puedes hacer que este sea el predeterminado al "envolver" make con un script que llame a make real con --environment -overrides FWIW – rogerdpack

Respuesta

5

Eso es discutible: "Después de todo entorno sabe mejor qué es lo que"

Es como decir "madre sabe mejor" a un niño todo mayor de edad y que les impida ir a estudiar derecho, ya que quería ver qué tipo de plomero serían. Es su vida. Suelta y deja que ellos elijan por sí mismos.

Oh, espera, usted preguntaba sobre el medio ambiente y la marca. Derecha.

Bueno, make es un proceso nuevo que comienza después de que haya modificado su entorno y, en general, el entorno no sabe cuáles son los objetivos y cómo funciona. Por lo tanto, cualquiera que sea explícitamente establece debe prevalecer sobre lo que pueda ocurrir en el entorno.

Actualización: Hay un argumento que olvidé originalmente en mi respuesta: la previsibilidad. El único requisito debe ser la presencia de un conjunto de herramientas estandarizadas (la misma versión de GCC, mismas libs), y dado que un archivo make debidamente escrito siempre debe producir el mismo resultado, sin importar cuál sea el entorno, o qué otras herramientas están presentes .

+1

Entonces, ¿cómo se supone que debemos anular los compiladores para el software creado por make? Quiero decir de una manera amigable con el medio ambiente? :-) Seguramente uno querría controlar las optimizaciones? No puedes tener que decidir sobre eso. En todo caso, ¿un archivo MAKE que codifica CFLAGS/CXXFLAGS/CPPFLAGS y NO permite que uno los cambie, no está bien diseñado? – amn

+1

Puede cambiar el archivo MAKE o sobrescribirlo pasando los indicadores adecuados como parámetros de línea de comandos cuando llama a make. sobrescribir estos en ese caso es una acción _explicit_ del usuario. obtener lo que sea que esté en el entorno podría generar resultados impredecibles, ya que el usuario podría no darse cuenta de las modificaciones en el entorno que hizo el programa anterior. –

+0

Bueno, ese es mi argumento completo: que el entorno lo sabe mejor. O al menos debería, con un Makefile diseñado correctamente. De ahí la implicación de que si el Makefile se rompe en una variable de conjunto de entorno, no es bueno. Si un autor realmente necesita tener su compilador '-g', y tiene miedo de que el usuario del archivo pueda arrojarlo por otra cosa, tal vez deberían usar la sintaxis "anular" o la asignación de la segunda etapa ": ="? Pasar indicadores de línea de comando para hacer no es una buena opción cuando se está creando un conjunto completo de paquetes ... – amn

16

Make anulará las variables si las pone en la línea de comando make.

Prueba esto: make CFLAGS=-fomit-frame-pointer

Una palabra de advertencia. La mayoría de los Makefiles no esperan que sus variables sean anuladas. Eso significa que si Makefile usa CFLAGS para especificar -I para archivos de inclusión, -O2 para optimización u otros indicadores, debe agregarlos a la anulación de CFLAGS o la marca probablemente fallará.

Cuestiones relacionadas