您好我有一个名为“buildMyJava”的构建脚本,它构建了一堆Java源代码。假设这些源代码位于不同的目录,例如“folder1”和“folder2”,则输出将转到名为“classes”的某个文件夹。我如何创建一个makefile,因此只有当源代码意味着这两个目录中的* .java发生了变化以及缺少输出类时才知道它是否构建?
我有类似以下的东西,但它总是构建,依赖性不起作用。
all: task
task: folder1/*.java folder2/*.java classes/
buildMyJava
答案 0 :(得分:0)
首先,构建脚本生成.java文件,因此.java文件应该是目标,而不是先决条件。所以你应该有这样的东西:
folder1/%.java folder2/%.java:
buildMyJava
唯一的问题是,如果你做一个make -j2,buildMyJava将运行多次(一次用于folder1,一次用于folder2)。实际上,这是makefile的限制 - 你不能让多个目标只调用一次相同的配方。这里有一个很好的讨论:http://www.cmcrossroads.com/article/rules-multiple-outputs-gnu-make
请注意,虽然“模式”目标计为单个目标 - 这意味着,如果您可以获得匹配所有目标的模式,则只能调用一次配方。一个小警告 - %
符号不能代表/
。因此,您无法执行folder%.java
,因为它与folder1/file1.java
不匹配...如果您可以将脚本拆分为一次仅输出到一个目录,则可以执行以下操作:< / p>
folder1/%.java:
buildMyJava folder1
folder2/%.java:
buildMyJava folder2
约翰