Как я могу уменьшить шаблонный файл при сборке вне исходного кода и Java? - PullRequest
0 голосов
/ 26 октября 2010

У меня есть быстрый и грязный небольшой make-файл, который выполняет сборки из исходного кода для относительно небольшого 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

Недостатком здесь является то, что если я хочу добавить новый файл Java, мне нужно добавить для него цель, добавить зависимости к шагу упаковки jar и путь к командной строке шага упаковки jar. Добавление одного и того же в трех местах приведет к неразберихе с чем-то большим, чем 4-5 файлов.

То, что я хотел бы сделать, это просто добавить определение "SOURCEFILES= files here" и перечислить файлы, и не нужно связываться с командами и тому подобным. Можно ли это сделать?

ПРИМЕЧАНИЕ: я знаю, что, вероятно, есть лучшие инструменты для этого (например, ant), но это то, к чему я обращаюсь как домашнее задание, и я не могу требовать от грейдера ничего, кроме jdk amd make установлено.

Ответы [ 2 ]

1 голос
/ 26 октября 2010

Если вы можете ожидать 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 $@

Я объясняю в этот ответ , почему лучше использовать файл штампа для каталогов, а не в зависимости от самого каталога.

Обратите внимание, что если у вас есть классы, которые зависят друг от друга, вы не сможете скомпилировать с этим Makefile. Чтобы их скомпилировать, javac нужно дать обоим исходным файлам одновременно, если я правильно помню.

1 голос
/ 26 октября 2010

Не помогают ли символы подстановки?

javac ./blah/*.java  

Обновлено: Для просмотра через подкаталоги добавьте

**/*.java  

Пример:

javac -sourcepath src src/**/*.java -d classes -verbose  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...