2

我的makefile目前有这个隐式规则:

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

我需要实现的不仅是对 .java 文件使用此规则,而且对 .sqlj 文件也使用此规则。

我需要这样的东西:

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

原因是我的一个 java 文件和一个 sqlj 文件之间存在循环依赖关系,只有在一步编译 .java 文件和 .sqlj 文件时才能解决这种依赖关系。据我尝试,sqlj 翻译器也可以编译 .java 文件,所以这应该没问题。

4

1 回答 1

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?),以这种方式单独执行操作将失去您只需在每个输入文件更改时对其执行此操作的好处。这将在每次更改时重新编译每个文件。

于 2015-12-01T13:21:29.153 回答