Quiero escribir un Makefile que ejecute pruebas. Las pruebas están en un directorio './tests' y los archivos ejecutables que se van a probar están en el directorio './bin'.
Cuando ejecuto las pruebas, no ven los archivos exec, ya que el directorio ./bin no está en $ PATH.
Cuando hago algo como esto:
EXPORT PATH=bin:$PATH
make test
Todo funciona. Sin embargo, necesito cambiar $ PATH en el Makefile.
Contenido simple de Makefile:
test all:
PATH=bin:${PATH}
@echo $(PATH)
x
Imprime la ruta correctamente, sin embargo, no encuentra el archivo x.
Cuando hago esto manualmente:
$ export PATH=bin:$PATH
$ x
entonces todo está bien.
¿Cómo puedo cambiar $ PATH en el Makefile?
../test/test_to_run
? Lo siento si he entendido mal la pregunta..
. Sin embargo, esto probablemente no sea práctico.Respuestas:
¿Probó la
export
directiva de Make en sí (asumiendo que usa GNU Make)?Además, hay un error en tu ejemplo:
Primero, el valor que se
echo
edita es una expansión de laPATH
variable realizada por Make, no el shell. Si imprime el valor esperado, entonces, supongo, ha establecido laPATH
variable en algún lugar antes en su Makefile, o en un shell que invocó Make. Para evitar tal comportamiento, debe escapar de los dólares:En segundo lugar, en cualquier caso, esto no funcionará porque Make ejecuta cada línea de la receta en un shell separado . Esto se puede cambiar escribiendo la receta en una sola línea:
fuente
$(PATH)
se establecerá en el valor delPATH
shell que invoca a make. Según el manual , "Cada variable de entorno que make ve cuando se inicia se transforma en una variable de make con el mismo nombre y valor".PATH
se refleja correctamente en variables (echo $(PATH)
) y dentro de entornos de comandos (env
,which python
,bash -c python
), pero no parece que se utilizará cuando se localiza el ejecutable para el comando: el comandopython
todavía corre el Python ejecutable en el originalPATH
.Por diseño, el
make
analizador ejecuta líneas en invocaciones de shell separadas, es por eso que al cambiar la variable (por ejemploPATH
) en una línea, es posible que el cambio no se aplique a las siguientes líneas (consulte esta publicación ).Una forma de solucionar este problema es convertir varios comandos en una sola línea (separados por
;
), o utilizar un objetivo especial One Shell (.ONESHELL
, a partir de GNU Make 3.82).Alternativamente, puede proporcionar una
PATH
variable en el momento en que se invoca el shell. Por ejemplo:fuente
$(shell)
invocaciones! : D Ejemplo: pastebin.com/Pii8pmkDLos cambios de ruta parecen ser persistentes si primero configuras la variable SHELL en tu archivo MAKE:
No sé si este es el comportamiento deseado o no.
fuente
which
yenv
ahora elige el nuevo PATH, pero la ejecución directa de un binario todavía no se encuentra en el PATH modificado, solo en el original.Lo que suelo hacer es proporcionar la ruta al ejecutable explícitamente:
También utilizo esta técnica para ejecutar binarios no nativos en un emulador como QEMU si estoy compilando de forma cruzada:
Si make está usando el shell sh, esto debería funcionar:
fuente
Para establecer la
PATH
variable, solo dentro del Makefile, use algo como:fuente