-%.o: %.c
- $(call v_tag,CC)$(CC) -c $(CFLAGS) -MMD -o$@ $<
-CLEANFILES += *.o *.d
-
-%.stamp: %.java
- $(call v_tag,JAVAC)$(JAVAC) $(JAVAFLAGS) $< && echo built >$@
-%.stamp: %.scala
- $(call v_tag,SCALAC)$(SCALAC) $(SCALAFLAGS) $< && echo built >$@
-CLEANFILES += *.stamp
-
-objects = $(patsubst %.c,%$2,$1)
-
-TARGETS += libtoy.so
+OUTDIR = out/
+
+out/%.o: %.c
+ $(call v_tag,CC)mkdir -p $(OUTDIR) && $(CC) -c $(CFLAGS) -MMD -o$@ $<
+CLEANFILES += $(OUTDIR)*.o $(OUTDIR)*.d
+
+stamp = $(patsubst %,$(OUTDIR)%.stamp,$1)
+CLASSDIR = $(OUTDIR)cls/
+$(OUTDIR)%.stamp: %.java
+ $(call v_tag,JAVAC)mkdir -p $(CLASSDIR) && \
+ $(JAVAC) -d $(CLASSDIR) -cp $(CLASSDIR) $(JAVAFLAGS) $< && \
+ echo built >$@
+ $(V_AT)$(SCALAC) -reset
+$(OUTDIR)%.stamp: %.scala
+ $(call v_tag,SCALAC)mkdir -p $(CLASSDIR) && \
+ $(SCALAC) -d $(CLASSDIR) -cp $(CLASSDIR) $(SCALAFLAGS) $< && \
+ echo built >$@
+CLEANFILES += $(OUTDIR)*.stamp
+clean::; rm -rf $(CLASSDIR)
+
+objects = $(patsubst %.c,$(OUTDIR)%$2,$1)
+
+TARGETS += $(OUTDIR)libtoy.so