diff --git a/Makefile b/Makefile
index d145e2019daf3a54de10d5d4cefec32c41fc789c..ab51c74061c69231c8135fae0a2756c16a0b7632 100644
--- a/Makefile
+++ b/Makefile
@@ -1,24 +1,36 @@
+TARGET?=
+
+BUILD=target/debug
+ifneq ($(TARGET),)
+	BUILD=target/$(TARGET)/debug
+	CARGOFLAGS+="--target=$(TARGET)"
+	CC=$(TARGET)-gcc
+endif
+
 .PHONY: all clean fmt test
 
-all: openlibm/libopenlibm.a target/debug/libc.a target/debug/libcrt0.a
-	cargo build
+all: $(BUILD)/libc.a $(BUILD)/libcrt0.a $(BUILD)/openlibm/libopenlibm.a
 
 clean:
 	cargo clean
-	make -C openlibm clean
 	make -C tests clean
 
 fmt:
 	./fmt.sh
 
-test: openlibm/libopenlibm.a
+test: all
 	make -C tests run
 
-target/debug/libc.a:
-	cargo build
+$(BUILD)/libc.a:
+	cargo build $(CARGOFLAGS)
+
+$(BUILD)/libcrt0.a:
+	cargo build --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS)
 
-target/debug/libcrt0.a:
-	cargo build --manifest-path src/crt0/Cargo.toml
+$(BUILD)/openlibm: openlibm
+	rm -rf $@ $@.partial
+	cp -r $< $@.partial
+	mv $@.partial $@
 
-openlibm/libopenlibm.a:
-	CFLAGS=-fno-stack-protector make -C openlibm libopenlibm.a
+$(BUILD)/openlibm/libopenlibm.a: $(BUILD)/openlibm
+	CC=$(CC) CFLAGS=-fno-stack-protector make -C $< libopenlibm.a