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