2010-09-23 5 views
2

Je ne comprends pas ce que je fait de mal avec mon makefile:makefile pour java

 
JAVA_SRCS:=$(wildcard tasks/src/*.java) 
JAVA_CLASSES=$(subst /src/,/build/,$(JAVA_SRCS:.java=.class)) 
JFLAGS=-cp jar/octobot.jar -d tasks/build 
JC=javac 

.SUFFIXES: .java .class 

.java.class: 
$(JC) $(JFLAGS) $*.java 

default: build 

build: $(JAVA_CLASSES) 

clean: 
$(RM) tasks/build/*.class 

Je suis cette erreur:

 
make: *** No rule to make target `tasks/build/ClickTask.class', needed by `classes'. Stop. 
zsh: exit 2  make 

Mais étrangement, quand je ré-écrire la règle build comme ceci:

 
build: $(JAVA_SRCS:.java=.class) 

aucune erreur, la règle est lancé, mais il le fait chaque fois (et je t est exact non)

Répondre

5

@Dean Povey est correct: vous ne pouvez pas le faire avec des règles de suffixe, parce qu'ils regardent dans le même répertoire que la source. Vous pouvez cependant faire cela avec un GNU Make règle de motif (et que vous utilisez déjà gnumake-ismes dans votre Makefile, donc peu importe):

tasks/build/%.class: tasks/src/%.java 
     $(JC) $(JFLAGS) $< 

Notez cependant que make est mal adapté à la construction source java comme un seul fichier .java peut entraîner de nombreux .class fichiers (classes internes, par exemple). L'approche de Automake à ce problème est de tout compiler dans un seul appel à javac et écrire un fichier d'horodatage (echo timestamp > classnoinst.stamp, par exemple). Ensuite, tout ce qui a besoin des sources java construites dépend de ce fichier de timbre et make clean supprime le .stamp ainsi que les fichiers .class.

2

Je pense que cela est parce que votre Src est dans un répertoire différent. Il recherche tasks/build/ClickTask.java mais votre source est tasks/src/ClickTask.java.

Le second cas fonctionne parce qu'il trouve le fichier source, mais attend le fichier de classe pour mettre fin dans les tâches/src, qu'il ne par conséquent, il reconstitue tout le temps.

Je n'ai pas une bonne réponse pour savoir comment faire avec Makefile, je tends à simplement mettre les fichiers de classe dans le même répertoire. Alternativement, pensez à utiliser Ant ou Maven qui prend en charge cela beaucoup plus facilement.

EDIT: Je pense que cela devrait vous dire ce que vous avez besoin: http://www.makelinux.net/make3/make3-CHP-8-SECT-1.html