проблема с Java Makefile - PullRequest
       7

проблема с Java Makefile

0 голосов
/ 15 февраля 2012

Для выполнения домашнего задания я должен сделать make-файл (физически и программно) для серии файлов .java, которые я написал.

Я написал файл make:

JFLAGS = -d -g bin/
JC = javac

.SUFFXES: .java .class

CLASSES = \
    cdn\communications\CommandReader.java \
    cdn\communications\CommandReaderFactory.java \
    cdn\communications\CommandReaderThread.java \
    cdn\communications\DiscoveryCommandReader.java \
    cdn\communications\Link.java \
    cdn\communications\RefreshThread.java \
    cdn\communications\RouterCommandReader.java \
    cdn\node\Discovery.java \
    cdn\node\Node.java \
    cdn\node\Router.java \
    cdn\utility\Utility.java \
    cdn\wireformats\DeRegisterRequest.java \
    cdn\wireformats\DeRegisterResponse.java \
    cdn\wireformats\LinkInfo.java \
    cdn\wireformats\LinkWeightUpdate.java \
    cdn\wireformats\MessageType.java \
    cdn\wireformats\PeerRouterList.java \
    cdn\wireformats\RegisterRequest.java \
    cdn\wireformats\RegisterResponse.java \
    cdn\wireformats\RouterInfo.java \
    cdn\wireformats\WireFormatFactory.java \

all : $(CLASSES)

clean : $(CLASSES:.java=.class)

Но когда я запускаю его, я получаю сообщение "make: Ничего не нужно делать для` all '".и ни один из моих файлов не создан.

Есть что-то, что я здесь упускаю?Я запускаю файл из каталога, в котором находится иерархия каталогов "cdn"?

Буду признателен за любые мысли.

Ответы [ 3 ]

2 голосов
/ 15 февраля 2012

Вы не указали, как создавать классы Java в вашем Makefile.По сути, что-то вроде ниже ...

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

См. эту ссылку , которая имеет хороший пример.

1 голос
/ 15 февраля 2012

Исправьте вашу цель all, чтобы она зависела от файлов .class вместо файлов .java (которые уже существуют и, следовательно, «Ничего не поделаешь»).

all : $(CLASSES:.java=.class)

Кроме того, вам необходимо добавить правило для компиляции файлов .java в файлы .class:

%.class : %.java
    $(JC) $(JFLAGS) $<

В случае использования вышеприведенного правила (так называемое шаблонное правило ), .SUFFXES: больше не требуется, вы можете удалить его вообще.

0 голосов
/ 21 августа 2012

Как указано выше, вы можете легко сделать что-то вроде этого:

%.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, этосломаю.Может быть несколько мелких ошибок или вещей, которые нужно обойти в вышеизложенном (исходя из памяти здесь), но в целом это сработало для меня без особых хлопот.

...