PREFIX=$(ROOT)/prefix

PREFIX_BINUTILS_PATH=$(PREFIX)/binutils-install/bin
PREFIX_FREESTANDING_PATH=$(PREFIX_BINUTILS_PATH):$(PREFIX)/gcc-freestanding-install/bin
PREFIX_PATH=$(PREFIX_BINUTILS_PATH):$(PREFIX)/gcc-install/bin

prefix: $(PREFIX)/gcc-install
	touch "$@"

$(PREFIX)/binutils.tar.bz2:
	mkdir -p "$(@D)"
	wget -O $@.partial "https://gitlab.redox-os.org/redox-os/binutils-gdb/-/archive/master/binutils-gdb-master.tar.bz2"
	mv $@.partial $@

$(PREFIX)/binutils: $(PREFIX)/binutils.tar.bz2
	mkdir -p "$@.partial"
	tar --extract --file "$<" --directory "$@.partial" --strip-components=1
	mv "$@.partial" "$@"
	touch "$@"

$(PREFIX)/binutils-install: $(PREFIX)/binutils
	rm -rf "$<-build" "$@"
	mkdir -p "$<-build" "$@"
	cd "$<-build" && \
	"$</configure" --target="$(TARGET)" --disable-werror --prefix="$@" && \
	make all -j `nproc` && \
	make install -j `nproc`
	touch "$@"

$(PREFIX)/gcc.tar.bz2:
	mkdir -p "$(@D)"
	wget -O $@.partial "https://gitlab.redox-os.org/redox-os/gcc/-/archive/redox/gcc-redox.tar.bz2"
	mv "$@.partial" "$@"

$(PREFIX)/gcc: $(PREFIX)/gcc.tar.bz2
	mkdir -p "$@.partial"
	tar --extract --file "$<" --directory "$@.partial" --strip-components=1
	cd "$@.partial" && ./contrib/download_prerequisites
	mv "$@.partial" "$@"
	touch "$@"

$(PREFIX)/gcc-freestanding-install: $(PREFIX)/gcc
	rm -rf "$<-freestanding-build" "$@"
	mkdir -p "$<-freestanding-build" "$@"
	cd "$<-freestanding-build" && \
	export PATH="$(PREFIX_BINUTILS_PATH):$$PATH" && \
	"$</configure" --target="$(TARGET)" --prefix="$@" --disable-nls --enable-languages=c,c++ --without-headers && \
	make all-gcc -j `nproc` && \
	make all-target-libgcc -j `nproc` && \
	make install-gcc -j `nproc` && \
	make install-target-libgcc -j `nproc`
	touch "$@"

$(PREFIX)/relibc-install: $(PREFIX)/binutils-install $(PREFIX)/gcc-freestanding-install
	rm -rf "$@"
	cd relibc && \
	export PATH="$(PREFIX_FREESTANDING_PATH):$$PATH" && \
	rustup target add "$(TARGET)" && \
	make all && \
	make DESTDIR="$@/usr" install
	touch "$@"

$(PREFIX)/gcc-install: $(PREFIX)/gcc | $(PREFIX)/relibc-install
	rm -rf "$<-build" "$@"
	mkdir -p "$<-build" "$@"
	cd "$<-build" && \
	export PATH="$(PREFIX_FREESTANDING_PATH):$$PATH" && \
	"$</configure" --target="$(TARGET)" --disable-werror --prefix="$@" --with-sysroot="$(PREFIX)/relibc-install" --disable-nls --enable-languages=c,c++ && \
	make all-gcc -j `nproc` && \
	make all-target-libgcc -j `nproc` && \
	make install-gcc -j `nproc` && \
	make install-target-libgcc -j `nproc` && \
	make all-target-libstdc++-v3 -j `nproc` && \
	make install-target-libstdc++-v3 -j `nproc`
	touch "$@"