es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Agregar ENVVARs en la línea de comandos del objetivo de make no funciona de manera consistente en Windows.

Tengo un archivo Makefile con un objetivo que agrega una variable de entorno a la llamada del shell (con la sintaxis habitual de bash). Esto es lo básico:

mytest:
    ANSWER=42 echo ¡Hola!

(En realidad, se trata de un programa que hace algo con la variable de entorno ANSWER, pero eso no es relevante aquí).

Esto funciona como se espera en un entorno de linux/bash. En entornos de windows/cmd.exe, funciona sorprendentemente en algunas máquinas, pero falla en otras con este error:

> make mytest
MYVAR=42 echo ¡Hola!
'MYVAR' no se reconoce como un comando interno o externo,
programa o archivo por lotes ejecutable.
make: *** [Makefile:332: mytest] Error 1

Esto es lo que normalmente esperaría, ya que ENVVAR=<valor> <comando> no es una sintaxis válida en el shell de Windows. Aparentemente, Make hace algo mágico que no entiendo.

Si exporto previamente la variable de entorno de esta manera, funciona como se espera:

mytest: export ANSWER:=42
mytest:
    echo ¡Hola!

Pero como funciona en algunos entornos de Windows, me gustaría saber por qué y tal vez adaptar esos en lugar de cambiar muchos Makefiles.

Todos los entornos están utilizando GNU Make versión 4.3.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que en algunos entornos de Windows, GNU Make puede estar utilizando una shell diferente a la predeterminada cmd.exe, por lo cual el objetivo original del makefile funciona. Sin embargo, en entornos donde se está utilizando cmd.exe, la sintaxis ENVVAR=<valor> <comando> no es compatible.

    Para asegurar la compatibilidad entre plataformas, se recomienda utilizar la directiva export para establecer variables de entorno en los Makefiles. El objetivo actualizado debería lucir así:

    mytest: export ANSWER:=42
    mytest:
        echo ¡Hola!
    

    Esto debería funcionar en todos los entornos, incluyendo aquellos que utilizan cmd.exe. No está del todo claro por qué el objetivo original funciona en algunos entornos de Windows, pero es probable que se deba al uso de una shell diferente por parte de GNU Make.

Comments are closed.