2012-01-20 13 views
54

Quiero escribir un Makefile que ejecutará pruebas. Las pruebas están en un directorio './tests' y los archivos ejecutables que deben probarse están en el directorio './bin'.

Cuando ejecuto las pruebas, no ven los archivos ejecutables, 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.

simple contenido Makefile:

test all: 
    PATH=bin:${PATH} 
    @echo $(PATH) 
    x 

Imprime la ruta correcta, sin embargo no encuentra el archivo x.

Cuando hago esto manualmente:

$ export PATH=bin:$PATH 
$ x 

todo está bien entonces.

¿Cómo podría cambiar $ PATH en el Makefile?

+0

¿No puede simplemente llamar a las pruebas desde el directorio ejecutable como '../ test/test_to_run'? Lo siento si he entendido mal la pregunta. – Chris

+0

Quiero que este archivo sea visible para las pruebas normalmente. No quiero jugar con los directorios, ya que refactorizar eso sería una pesadilla. –

+0

La única forma en que puede acercarse a esto es hacer que el archivo MAKE escriba un script de shell que contenga los decls variables y luego tener el origen del shell primario del script con '.'. Sin embargo, esto es poco práctico. –

Respuesta

65

¿Usted intentó export directive de hacerse (suponiendo que se utiliza GNU Make)?

export PATH := bin:$(PATH) 

test all: 
    x 

Además, hay un error en ti ejemplo:

test all: 
    PATH=bin:${PATH} 
    @echo $(PATH) 
    x 

En primer lugar, el valor de ser echo ed es una expansión de la variable PATH realizado por marca, no la cáscara. Si imprime el valor esperado, supongo que ha establecido la variable PATH en algún lugar anterior de su archivo Makefile o en un shell que invocó Make. Para evitar este tipo de comportamiento que debe escapar de dólares:

test all: 
    PATH=bin:$$PATH 
    @echo $$PATH 
    x 

En segundo lugar, en cualquier caso, esto no va a funcionar porque Make ejecuta cada línea de la receta en un separate shell.Esto se puede cambiar la receta escrita en una sola línea:

test all: 
    export PATH=bin:$$PATH; echo $$PATH; x 
+4

'$ (RUTA)' se establecerá en el valor de 'RUTA 'de la invocación de shell. Según [el manual] (http://www.gnu.org/software/make/manual/html_node/Environment.html), "Cada variable de entorno que se ve cuando se inicia se transforma en una variable make con el mismo nombre y valor ". –

-2

para establecer la variable PATH, dentro del Makefile solamente, usar algo como:

PATH := $(PATH):/my/dir 

test: 
@echo my new PATH = $(PATH) 
+0

No funciona como yo quiero. He actualizado la pregunta con ejemplos de lo que quiero lograr. –

2

Lo que suelo hacer es proporcionar la ruta al ejecutable de forma explícita:

EXE=./bin/ 
... 
test all: 
    $(EXE)x 

También utilizo este técnica para ejecutar binarios no nativos bajo un emulador como QEMU si estoy compilando de forma cruzada:

EXE = qemu-mips ./bin/ 

Si marca está utilizando el shell sh, esto debería funcionar:

test all: 
    PATH=bin:$PATH x 
+0

Sí, genial, sin embargo, tengo mis pruebas escritas en Perl y necesito llamar al ejecutable de la secuencia de comandos de Perl, no directamente desde el archivo MAKE. Tengo que volver a pensar toda la prueba de estas cosas :) –

+0

Gotcha. ¿Qué hay de establecer PATH en la línea de comando? Ver la edición de arriba. –

+0

Oh, ahora entiendo. Perdón por la desinformación. –

18

cambios de ruta que ser persistente si se establece la variable SHELL en su archivo MAKE primera:

SHELL := /bin/bash 
PATH := bin:$(PATH) 

test all: 
    x 

No sé si este es un comportamiento deseado o no.

+0

Esto solucionó el problema que estaba teniendo (estoy ejecutando zsh). ¡Gracias! –

+0

Sí, esto sí hace lo que el OP quería ... ¿pero es una característica o un error? Incluso después de leer [hacer la sección SHELL del manual] (http://www.gnu.org/software/make/manual/make.html#Choosing-the-Shell) no estoy seguro. – pje

+2

Esto tampoco funciona para mí. 'which' y' env' ahora recogen la nueva RUTA, pero la ejecución directa de un binario aún no se encuentra en la RUTA modificada, solo en la ruta original. –

8

Por diseño make analizador ejecuta líneas en un invocaciones shell separados, es por eso que el cambio de variable (por ejemplo PATH) en una línea, el cambio no se puede aplicar para los próximos líneas (ver este post).

Una forma de solucionar este problema, es la de convertir varios comandos en una sola línea (separados por ;), o utilizar One Shell objetivo especial (.ONESHELL, como de GNU Hacer 3,82).

Alternativamente, puede proporcionar la variable PATH en el momento en que se invoca el shell. Por ejemplo:

PATH := $(PATH):$(PWD)/bin:/my/other/path 
SHELL := env PATH=$(PATH) /bin/bash 
+1

¡Me gusta el enfoque! –

+1

¡Esto es lo mejor, porque funciona incluso con invocaciones '$ (shell)'! : D Ejemplo: https://pastebin.com/Pii8pmkD – PsychoX

Cuestiones relacionadas