2011-03-13 8 views
6

tengo un pequeño proyecto de Java que quiero construir usando un archivo MAKE, el código está en src/package... /*.java, el bytecode debe ir a bin/package.../*.class.
Mi archivo actual se parece a esto (simplificado):Makefile - aplicando una variable como prefijo a varias partes de otra variable

JC = javac 
SRCDIR = src 
BINDIR = bin 
JCFLAGS = -d $(BINDIR)/ 

CLASSES = $(SRCDIR)/package/class1.java $(SRCDIR)/package/class2.java $(SRCDIR)/package/class3.java 

default: 
    $(JC) $(JCFLAGS) $(CLASSES) 

funciona y hace lo que debe, pero tiene que haber una manera más elegante de hacer esto.
Por ejemplo, ¿hay alguna manera de aplicar la ruta ($(SRCDIR) y el nombre del paquete) como un prefijo para todos los nombres de clase, así que no tengo que poner la ruta por separado en frente de cada clase?

Todas las clases tienen que ser compilado en una javac-llamada, ya que hay dependencias circulares en ellos, así que usar un objetivo propio para cada clase no funciona:

default: $(CLASSES) 
%.java: 
    $(JC) $(JCFLAGS) $(SRCDIR)/[email protected] 

Gracias por su ayuda.

Respuesta

9

Desde el GNU make manual:

$(addprefix prefix,names...) 

Los nombres de los argumentos es considerado como una serie de nombres, separados por espacios en blanco; el prefijo se usa como una unidad. El valor del prefijo se antepone al frente de cada nombre individual y los nombres más grandes resultantes se concatenan con espacios únicos entre ellos. Por ejemplo,

$(addprefix src/,foo bar) 

produce el resultado ‘src/foo src/bar’.

Cuestiones relacionadas