2010-10-25 3 views
0

J'ai un petit fichier make rapide et sale qui fait hors de source construit pour un projet Java relativement faible:Comment est-ce que je peux réduire makefile warmplate en faisant des constructions hors-de-source et Java?

 
default: bin/classes/EntryPoint.class bin/classes/manifest 
    jar cvfm ./bin/output.jar ./bin/classes/manifest -C ./bin/classes EntryPoint.class 

bin/classes/EntryPoint.class: ./src/EntryPoint.java bin 
    javac -sourcepath ./src -d ./bin/classes ./src/EntryPoint.java 

bin/classes/manifest: src/manifest 
    cp bin/classes/manifest src/manifest 

bin: 
    mkdir ./bin; mkdir ./bin/classes; 

clean: 
    rm -rf bin 

L'inconvénient est que si je veux ajouter un nouveau fichier java, J'ai besoin d'ajouter une cible pour cela, et ajouter des dépendances à l'étape d'empaquetage de jar, et le chemin d'accès à la ligne de commande de l'étape d'empaquetage de pot. Ajouter la même chose à 3 endroits va entraîner un désordre impossible à maintenir pour tout ce qui dépasse les 4 ou 5 fichiers.

Ce que je voudrais faire est simplement d'ajouter une définition "SOURCEFILES= files here" et la liste des fichiers, et ne pas avoir à jouer avec les commandes et autres. Cela peut-il être fait?

NOTE: Je sais qu'il y a probablement de meilleurs outils pour cela (comme ant), mais c'est quelque chose que je deviens comme devoir, et je ne peux pas exiger que la niveleuse ait autre chose que le jdk amd make installé .

+0

Est-ce que c'est sous linux? Vous pourriez faire des inclusions avec de la magie Linux si vous êtes sûr de pouvoir tourner sous linux ... – bwawok

+0

@bwawok: Je crois que GNUmake va être utilisé, mais ça pourrait être sur une boîte BSD. Pas certain. –

Répondre

1

Les caractères génériques ne sont-ils pas utiles?

javac ./blah/*.java 

Mise à jour: Pour RECURSE dans des sous-répertoires ajouter

**/*.java 

Exemple:

javac -sourcepath src src/**/*.java -d classes -verbose 
+0

Cela aide, mais cela n'aidera pas pour les sous-répertoires. –

+0

Essayez **/*. Java qui devrait se répéter. Mis à jour la réponse ci-dessus. – ch4nd4n

+1

J'ai corrigé le formatage pour vous. Utilisez quatre espaces avant une ligne pour obtenir un texte 'monospaced'. Cela ignore également les autres balisages comme les astérisques. Il ne se déclenche pas, sauf s'il y a une ligne vide après le paragraphe précédent. –

1

Si vous pouvez vous attendre gnumake:

SOURCES := $(wildcard src/**/*.java) 
CLASSES := $(patsubst src/%.java,bin/classes/%.class,$(SOURCES)) 

default: $(CLASSES) bin/classes/manifest 
    jar cvfm ./bin/output.jar ./bin/classes/manifest -C ./bin/classes EntryPoint.class 

bin/classes/%.class: src/%.java bin/.dirstamp 
    javac -sourcepath ./src -d ./bin/classes $< 

bin/classes/manifest: src/manifest 
    cp bin/classes/manifest src/manifest 

clean: 
    rm -rf bin 

bin/.dirstamp 
    mkdir -p bin/classes 
    touch [email protected] 

J'explique dans this answer pourquoi il est préférable d'utiliser un fichier timbre pour les répertoires plutôt que de dépendre du répertoire lui-même.

Notez que si vous avez des classes qui dépendent les unes des autres, vous ne pourrez pas compiler avec ce Makefile. Pour compiler ceux-ci, javac doit être donné à la fois les fichiers source à la fois, si je me souviens bien.

Questions connexes