【问题标题】:Make implicit rule for 2 file types为 2 种文件类型制定隐式规则
【发布时间】:2015-12-01 11:38:13
【问题描述】:

我的 makefile 目前有这条隐含规则:

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

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

我需要这样的东西:

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

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

【问题讨论】:

    标签: java makefile sqlj


    【解决方案1】:

    您不能为此使用Old-Fashioned Suffix Rules

    您需要为此使用Implicit Rules

    所以你会写

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

    假设%.java 文件是主要输入。如果$(SQLJC) 需要.sqlj 文件而不是使用

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

    会这样做。

    如果您需要同时将.sqlj .java 文件both 传递给$(SQLJC),则将$&lt; 替换为$^ in这些例子中的任何一个。

    要同时编译所有 .java.sqlj 文件,您需要更多类似的东西:

    # Assumes files are all in the current directory.
    FILES=$(wildcard *.java) $(wildcard *.sqlj)
    
    tgt.class: $(FILES)
            $(SQLJC) -classpath . $^
    

    但假设您实际上可以将任何.java.sqlj 文件编译为某种中间格式(.class?)单独以这种方式执行操作将失去您只需为每个输入文件执行此操作的好处当它改变时。这将重新编译 每个 文件每次 时其中任何一个发生变化。

    【讨论】:

    • 感谢您的回答,这会转化为%.class: A.sqlj B.java 还是%.class: A.sqlj A.java
    • 该规则应获取所有 .java 和 .sqlj 文件,并使用 $(SQLJC) 一次性编译它们。
    • 所有 .java.sqlj 文件?不只是配对.java/.sqlj 文件?因为您的原始版本在 .java.class 或您尝试的 (.java.sqlj).class 版本中都没有做任何此类事情。
    • 是的,所有这些,我刚刚意识到我不知道 makefile 是如何做他们的事情的。 gmake 获取每个匹配的文件并将其分别传递给编译命令,对吧?
    • make 做任何你告诉它的事情。如果你给它一个后缀或模式规则,它会“单独”应用到文件(对于单独匹配后缀/模式的任何定义)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多