###--------------------------------------------------------------------------
### Build parameters.
+abs_builddir := $(shell pwd)
+
## Where to put the object files.
-OUTDIR = out/
+OUTDIR = out
## Native C compiler.
CC = gcc
### Native C code.
out/%.o: %.c
- $(call v_tag,CC)mkdir -p $(OUTDIR) && \
+ $(call v_tag,CC)mkdir -p $(OUTDIR)/ && \
$(CC) -c $(ALL_CFLAGS) -MMD -o$@ $<
ALL_SOURCES =
DISTFILES += $(ALL_SOURCES)
-objects = $(patsubst %.c,$(OUTDIR)%$2,$1)
-CLEANFILES += $(OUTDIR)*.o $(OUTDIR)*.d
+objects = $(patsubst %.c,$(OUTDIR)/%$2,$1)
+CLEANFILES += $(OUTDIR)/*.o $(OUTDIR)/*.d
###--------------------------------------------------------------------------
### Java classes.
## unpredictable names. Rather than try to guess stable outputs for these
## sources, we make artificial `timestamp' files and uses these in our
## dependencies.
-CLASSDIR = $(OUTDIR)cls/
-stamps = $(patsubst %,$(OUTDIR)%.stamp,$1)
+CLASSDIR = $(OUTDIR)/cls
+stamps = $(patsubst %,$(OUTDIR)/%.$1-stamp,$2)
clean::; rm -rf $(CLASSDIR)
-CLEANFILES += $(OUTDIR)*.stamp
+CLEANFILES += $(OUTDIR)/*.class-stamp
## Compiling actual Java code. Note that this confuses the resident Scala
## compiler, so we have to reset it here.
CLSISH += java
-$(OUTDIR)%.stamp: %.java
- $(call v_tag,JAVAC)mkdir -p $(CLASSDIR) && \
+$(OUTDIR)/%.class-stamp: %.java
+ $(call v_tag,JAVAC)mkdir -p $(CLASSDIR)/ && \
$(JAVAC) -d $(CLASSDIR) -cp $(CLASSDIR) $(JAVAFLAGS) $< && \
echo built >$@
$(V_AT)$(SCALAC_RESET)
## Compiling Scala code.
CLSEXT += scala
-$(OUTDIR)%.stamp: %.scala
- $(call v_tag,SCALAC)mkdir -p $(CLASSDIR) && \
+$(OUTDIR)/%.class-stamp: %.scala
+ $(call v_tag,SCALAC)mkdir -p $(CLASSDIR)/ && \
$(SCALAC) -d $(CLASSDIR) -cp $(CLASSDIR) $(SCALAFLAGS) $< && \
echo built >$@
SHLIBS += toy
toy_SOURCES = jni.c
-shlibfile = $(patsubst %,$(OUTDIR)lib%.so,$1)
+shlibfile = $(patsubst %,$(OUTDIR)/lib%.so,$1)
SHLIBFILES = $(call shlibfile,$(SHLIBS))
TARGETS += $(SHLIBFILES)
ALL_SOURCES += $(foreach l,$(SHLIBS),$($l_SOURCES))
-$(SHLIBFILES): $(OUTDIR)lib%.so: $$(call objects,$$($$*_SOURCES),.o)
+$(SHLIBFILES): $(OUTDIR)/lib%.so: $$(call objects,$$($$*_SOURCES),.o)
$(call v_tag,LD)$(LD) $(LDFLAGS.so) -o$@ $^ $(LIBS)
###--------------------------------------------------------------------------
CLASS_NAMES = $(foreach c,$(CLASSES),$(call class-name,$c))
-all:: $(call stamps,$(CLASS_NAMES))
+all:: $(call stamps,class,$(CLASS_NAMES))
-$(foreach c,$(CLASSES),$(eval $(call stamps,$(call class-name,$c)): \
- $(call stamps,$(call class-deps,$c))))
+$(foreach c,$(CLASSES),$(eval $(call stamps,class,$(call class-name,$c)): \
+ $(call stamps,class,$(call class-deps,$c))))
DISTFILES += $(foreach c,$(CLASSES),\
$(foreach e,$(CLSEXT),\
$(wildcard $(call class-name,$c).$e)))
###--------------------------------------------------------------------------
+### External packages.
+
+EXTPREFIX = $(abs_builddir)/$(OUTDIR)/inst
+
+join-paths = $(if $(filter /%,$2),$2,$1/$2)
+ext-srcdir = $(or $($1_SRCDIR),../$1)
+
+EXTERNALS += adns
+adns_CONFIG = --disable-dynamic
+
+EXTERNALS += mLib
+mLib_DEPS = adns
+mLib_CONFIG = --enable-static --disable-shared --with-adns
+
+EXTERNALS += catacomb
+catacomb_DEPS = mLib
+catacomb_CONFIG = --enable-static --disable-shared
+
+EXTERNALS += tripe
+tripe_DEPS = mLib catacomb
+tripe_CONFIG = --without-wireshark --with-adns --with-tunnel=slip
+
+all:: $(call stamps,ext,$(EXTERNALS))
+CLEANFILES += $(OUTDIR)/*.ext-stamp
+clean::; rm -rf $(OUTDIR)/inst $(OUTDIR)/build
+
+$(call stamps,ext,$(EXTERNALS)): \
+ $(OUTDIR)/%.ext-stamp: $$(call stamps,ext,$$($$*_DEPS))
+ $(V_AT)rm -rf $(OUTDIR)/build/$*/
+ $(V_AT)mkdir -p $(OUTDIR)/build/$*/
+ cd $(OUTDIR)/build/$*/ && \
+ $(call join-paths,../../..,$(call ext-srcdir,$*))/configure \
+ --prefix=$(EXTPREFIX) \
+ $($*_CONFIG) \
+ CFLAGS="-O2 -g -fPIC -Wall -I$(EXTPREFIX)/include" \
+ LDFLAGS="-L$(EXTPREFIX)/lib" \
+ PKG_CONFIG="pkg-config --static" \
+ PKG_CONFIG_LIBDIR=$(EXTPREFIX)/lib/pkgconfig
+ $(MAKE) -C$(OUTDIR)/build/$*/
+ $(MAKE) -C$(OUTDIR)/build/$*/ -s install
+ $(V_AT)echo done >$@
+
+###--------------------------------------------------------------------------
### Distribution arrangements.
DISTFILES += COPYING
DISTTAR = $(distdir).tar.gz
distdir:
- rm -rf $(OUTDIR)$(distdir)
- mkdir $(OUTDIR)$(distdir)
- echo $(VERSION) >$(OUTDIR)$(distdir)/RELEASE
+ rm -rf $(OUTDIR)/$(distdir)
+ mkdir $(OUTDIR)/$(distdir)/
+ echo $(VERSION) >$(OUTDIR)/$(distdir)/RELEASE
set -e; for i in $(DISTFILES); do \
- case $$i in */*) mkdir -p $(OUTDIR)$(distdir)/$${i%/*} ;; esac; \
- cp $$i $(OUTDIR)$(distdir)/; \
+ case $$i in */*) mkdir -p $(OUTDIR)/$(distdir)/$${i%/*}/ ;; esac; \
+ cp $$i $(OUTDIR)/$(distdir)/; \
done
.PHONY: distdir
dist: distdir
- set -e; cd $(OUTDIR); tar chozf ../$(DISTTAR) $(distdir)
+ set -e; cd $(OUTDIR)/; tar chozf ../$(DISTTAR) $(distdir)
rm -rf $(distdir)
.PHONY: dist