Как указано выше, вы можете легко сделать что-то вроде этого:
%.class : %.java
javac flags_go_here
... но есть несколько проблем с этим:
- Если есть какие-либозависимости между классами - и будут - вы должны будете получить правильный порядок.Нет никаких инструментов или параметров командной строки, таких как то, что GCC предоставляет для генерации зависимостей для вас
- Java допускает циклические зависимости между классами.Невозможно скомпилировать два класса, которые зависят друг от друга, если вы не скомпилируете их вместе, например:
- $ {JAVAC} $ {FLAGS} class1.java class2.java
javac
имеет длительное время запуска.Для небольших проектов вы этого не заметите, но для любого проекта, где достаточно классов, он будет быстро складываться, а время сборки уходит быстро.
Лучшее решение, которое я нашелс чем-то вроде следующего (с использованием синтаксиса стиля GNU-make):
all: my.jar
my.jar : c1.java c2.java ... cN.java
${JAVAC} ${JAVAC_FLAGS} ${^}
${JAR} cf ${JAR_FLAGS} ${@} -C src ${^:%.java=%.class}
# As a bonus, here's how you could do JNI stuff based on individual class files.
# This is necessary because nothing in the build actually depends directly on
# the .class files; if they don't exist and the .jar does, then you need some
# way to get the .class files without rebuilding the jar.
# It's written this way so it's re-usable.
# I'm using 'unzip' instead of 'jar' because it has the -j option so it won't
# dump some/irritating/path/to/work/with/when/all/I/need/is/the/.class/file
define CANNED_JAVAH_TARGET =
$(if $(filter %.java,${^}),,\
$(error When building ${@}: No jar dependency provided))
unzip -j -d /somewhere/to/put/temp/class/file \
$(filter %.jar,${^}) ${PKG_PATH}/${@F:%.h=%.class}
${JAVAH} ${JAVAH_FLAGS} <whatever flags are needed to make the header>
endef
${JNI_HEADER_TARGETS} : my.jar
${CANNED_JAVAH_TARGET}
Есть проблема с частью javah: для вещи JAVAH, если кто-то заставляет ее зависеть более чем от одного jar, этосломаю.Может быть несколько мелких ошибок или вещей, которые нужно обойти в вышеизложенном (исходя из памяти здесь), но в целом это сработало для меня без особых хлопот.