OUTPUT = $(PWD)/output SOURCES = sources CONFIG_SUB_REV = 3d5db9ebe860 BINUTILS_VER = 2.25.1 GCC_VER = 5.3.0 MUSL_VER = 1.1.14 GMP_VER = 6.1.0 MPC_VER = 1.0.3 MPFR_VER = 3.1.4 LINUX_VER = 4.4.10 GNU_SITE = https://ftp.gnu.org/pub/gnu GCC_SITE = $(GNU_SITE)/gcc BINUTILS_SITE = $(GNU_SITE)/binutils GMP_SITE = $(GNU_SITE)/gmp MPC_SITE = $(GNU_SITE)/mpc MPFR_SITE = $(GNU_SITE)/mpfr MUSL_SITE = https://www.musl-libc.org/releases MUSL_REPO = git://git.musl-libc.org/musl LINUX_SITE = https://cdn.kernel.org/pub/linux/kernel BUILD_DIR = build-$(TARGET) -include config.mak SRC_DIRS = gcc-$(GCC_VER) binutils-$(BINUTILS_VER) musl-$(MUSL_VER) \ $(if $(GMP_VER),gmp-$(GMP_VER)) \ $(if $(MPC_VER),mpc-$(MPC_VER)) \ $(if $(MPFR_VER),mpfr-$(MPFR_VER)) \ $(if $(LINUX_VER),linux-$(LINUX_VER)) all: clean: rm -rf gcc-* binutils-* musl-* gmp-* mpc-* mpfr-* build-* linux-* distclean: clean rm -rf sources # Rules for downloading and verifying sources. Treat an external SOURCES path as # immutable and do not try to download anything into it. ifeq ($(SOURCES),sources) $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/gmp*)): SITE = $(GMP_SITE) $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/mpc*)): SITE = $(MPC_SITE) $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/mpfr*)): SITE = $(MPFR_SITE) $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/binutils*)): SITE = $(BINUTILS_SITE) $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/gcc*)): SITE = $(GCC_SITE)/$(basename $(basename $(notdir $@))) $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/musl*)): SITE = $(MUSL_SITE) $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/linux-4*)): SITE = $(LINUX_SITE)/v4.x $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/linux-3*)): SITE = $(LINUX_SITE)/v3.x $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/linux-2.6*)): SITE = $(LINUX_SITE)/v2.6 $(SOURCES): mkdir -p $@ $(SOURCES)/config.sub: | $(SOURCES) mkdir -p $@.tmp cd $@.tmp && wget -c -O $(notdir $@) "http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=$(CONFIG_SUB_REV)" cd $@.tmp && touch $(notdir $@) cd $@.tmp && sha1sum -c $(PWD)/hashes/$(notdir $@).$(CONFIG_SUB_REV).sha1 mv $@.tmp/$(notdir $@) $@ rm -rf $@.tmp $(SOURCES)/%: hashes/%.sha1 | $(SOURCES) mkdir -p $@.tmp cd $@.tmp && wget -c -O $(notdir $@) $(SITE)/$(notdir $@) cd $@.tmp && touch $(notdir $@) cd $@.tmp && sha1sum -c $(PWD)/hashes/$(notdir $@).sha1 mv $@.tmp/$(notdir $@) $@ rm -rf $@.tmp endif # Rules for extracting and patching sources, or checking them out from git. musl-git-%: rm -rf $@.tmp git clone -b $(patsubst musl-git-%,%,$@) $(MUSL_REPO) $@.tmp cd $@.tmp && git fsck mv $@.tmp $@ %: $(SOURCES)/%.tar.gz | $(SOURCES)/config.sub rm -rf $@.tmp mkdir $@.tmp ( cd $@.tmp && tar zxvf - ) < $< test ! -d patches/$@ || cat patches/$@/* | ( cd $@.tmp/$@ && patch -p1 ) test ! -f $@.tmp/$@/config.sub || cp -f $(SOURCES)/config.sub $@.tmp/$@ rm -rf $@ touch $@.tmp/$@ mv $@.tmp/$@ $@ rm -rf $@.tmp %: $(SOURCES)/%.tar.bz2 | $(SOURCES)/config.sub rm -rf $@.tmp mkdir $@.tmp ( cd $@.tmp && tar jxvf - ) < $< test ! -d patches/$@ || cat patches/$@/* | ( cd $@.tmp/$@ && patch -p1 ) test ! -f $@.tmp/$@/config.sub || cp -f $(SOURCES)/config.sub $@.tmp/$@ rm -rf $@ touch $@.tmp/$@ mv $@.tmp/$@ $@ rm -rf $@.tmp %: $(SOURCES)/%.tar.xz | $(SOURCES)/config.sub rm -rf $@.tmp mkdir $@.tmp ( cd $@.tmp && tar Jxvf - ) < $< test ! -d patches/$@ || cat patches/$@/* | ( cd $@.tmp/$@ && patch -p1 ) test ! -f $@.tmp/$@/config.sub || cp -f $(SOURCES)/config.sub $@.tmp/$@ rm -rf $@ touch $@.tmp/$@ mv $@.tmp/$@ $@ rm -rf $@.tmp # Rules for building. ifeq ($(TARGET),) all: @echo TARGET must be set via config.mak or command line. @exit 1 else $(BUILD_DIR): mkdir -p $@ $(BUILD_DIR)/Makefile: | $(BUILD_DIR) ln -sf ../litecross/Makefile $@ $(BUILD_DIR)/config.mak: | $(BUILD_DIR) printf >$@ -- '%s\n' \ "MUSL_SRCDIR = ../musl-$(MUSL_VER)" \ "GCC_SRCDIR = ../gcc-$(GCC_VER)" \ "BINUTILS_SRCDIR = ../binutils-$(BINUTILS_VER)" \ $(if $(GMP_VER),"GMP_SRCDIR = ../gmp-$(GMP_VER)") \ $(if $(MPC_VER),"MPC_SRCDIR = ../mpc-$(MPC_VER)") \ $(if $(MPFR_VER),"MPFR_SRCDIR = ../mpfr-$(MPFR_VER)") \ $(if $(LINUX_VER),"LINUX_SRCDIR = ../linux-$(LINUX_VER)") \ "-include ../config.mak" all: | $(SRC_DIRS) $(BUILD_DIR) $(BUILD_DIR)/Makefile $(BUILD_DIR)/config.mak cd $(BUILD_DIR) && $(MAKE) $@ install: | $(SRC_DIRS) $(BUILD_DIR) $(BUILD_DIR)/Makefile $(BUILD_DIR)/config.mak cd $(BUILD_DIR) && $(MAKE) OUTPUT=$(OUTPUT) $@ endif