2009-10-09 22 views
17

En mi makefile tengo una variable con una lista de directorios, así:elementos de unión de una lista de GNU Make

DIRS = /usr /usr/share/ /lib 

Ahora, tengo que crear la variable PATH de ella, que es básicamente el mismo , pero usa punto y coma como separador:

PATH = /usr:/usr/share/:/lib 

¿Cómo puedo hacer eso? Quiero decir, ¿cómo unir elementos de la lista DIRS con punto y coma, en lugar de espacios?

+0

+1 Tengo la misma pregunta ... pensarías que esto sería fácil. –

Respuesta

30

Usted puede utilizar el comando $(subst), combinado con un pequeño truco para conseguir una variable que tiene un valor de un solo espacio:

p = /usr /usr/share /lib 
noop= 
space = $(noop) $(noop) 

all: 
     @echo $(subst $(space),:,$(p)) 

Espero que ayude,

Eric melski

+0

Guau, funciona como un encanto, muchas gracias! ¡Ha estado luchando con eso por horas! –

+1

También puede usar '$ (eval)' en lugar de '$ (noop)' allí, eliminando así la necesidad de definir noop. –

+2

+1 para encontrar tal magia negra. –

8

Forma más limpia (que puedo encontrar):

classpathify = $(subst $(eval) ,:,$(wildcard $1)) 
cp = a b c d/*.jar 

target: 
    echo $(call classpathify,$(cp)) 
# prints a:b:c:d/1.jar:d/2.jar 

Notas:

  • Convertirlo en una pseudo-función hace que la intención sea más clara que hacer un montón de manipulación de cadenas arcanas en línea.
  • Incluí la función $ (comodín) porque casi siempre usa estos dos juntos al especificar un classpath
  • Asegúrese de no poner espacios adicionales después de las comas o obtendrá algo como ":: a: b : c: d: e ".
+0

Una cosa que agregaría: ahora que java admite la sintaxis "-cp lib/*", puede evitar hacer $ (comodín $ 1), lo que probablemente sea una buena acción, ya que los proyectos de Java tienden a utilizar una una tonelada de JAR puede llevar a casos en los que exceda los límites de longitud en ciertas plataformas. –

+1

Una forma más genérica: joinwith = $ (subst $ (eval), $ 1, $ 2) $ (llamada joinwith, -o, $ (list_of_files_separated_by_spaces)) –

Cuestiones relacionadas