Создать неявное правило для 2 типов файлов

У меня есть в моем make-файле в настоящее время это неявное правило:

.java.class:
    $(JAVAC) -classpath . $<

Чего мне нужно добиться, так это использовать не только это правило для файлов.java, но и для файлов.sqlj.

Мне нужно что-то вроде этого:

(.java.sqlj).class:
    $(SQLJC) -classpath . $<

Причина в том, что у меня есть круговая зависимость между одним из моих java-файлов и одним из моих файлов sqlj, которая разрешается только при компиляции как файлов.java, так и файлов.sqlj за один шаг. Насколько я попробовал, переводчик sqlj также может компилировать файлы.java, так что это не должно быть проблемой.

1 ответ

Для этого нельзя использовать старомодные суффиксные правила.

Вы должны использовать неявные правила для этого.

Так вы бы написали

%.class: %.java %.sqlj
        $(SQLJC) -classpath . $<

Предполагая, что %.java Файл был основным входом. Если $(SQLJC) нуждается в .sqlj файл вместо того, чтобы использовать

%.class: %.sqlj %.java
        $(SQLJC) -classpath . $<

сделал бы это.

Если вам нужно передать оба .sqlj а также .java файлы в $(SQLJC) в то же время заменить $< с $^ в любом из этих примеров.

Скомпилировать все .java а также .sqlj файлы вместе, вы хотите что-то более похожее на это:

# Assumes files are all in the current directory.
FILES=$(wildcard *.java) $(wildcard *.sqlj)

tgt.class: $(FILES)
        $(SQLJC) -classpath . $^

Но при условии, что вы можете скомпилировать любой из ваших .java или же .sqlj файлы в некоторый промежуточный формат (.class?) индивидуальное выполнение действий таким образом лишит вас преимущества, если вы будете делать это только для каждого входного файла при его изменении. Это будет перекомпилировать каждый файл каждый раз, когда любой из них изменяется.

Другие вопросы по тегам