SOURCES = sources CONFIG_SUB_REV = 28ea239c53a2 GCC_VER = 11.4.0 MUSL_VER = 1.2.4 BINUTILS_VER = 2.41 GMP_VER = 6.3.0 MPC_VER = 1.3.1 MPFR_VER = 4.2.1 ISL_VER = LINUX_VER = MINGW_VER = v11.0.1 CHINA = # curl --progress-bar -Lo DL_CMD = curl --progress-bar -Lo SHA1_CMD = sha1sum -c COWPATCH = $(CURDIR)/cowpatch.sh HOST = $(if $(NATIVE),$(TARGET)) BUILD_DIR = build/$(if $(HOST),$(HOST),local)/$(TARGET) OUTPUT = $(CURDIR)/output$(if $(HOST),-$(HOST)) REL_TOP = ../../.. -include config.mak ifneq ($(CHINA),) GNU_SITE = https://mirrors.ustc.edu.cn/gnu SOURCEFORGE_MIRROT = https://jaist.dl.sourceforge.net GCC_SNAP = https://mirrors.tuna.tsinghua.edu.cn/sourceware/gcc/snapshots LINUX_SITE = https://mirrors.ustc.edu.cn/kernel.org/linux/kernel else GNU_SITE = https://ftp.gnu.org/gnu SOURCEFORGE_MIRROT = https://downloads.sourceforge.net GCC_SNAP = https://sourceware.org/pub/gcc/snapshots LINUX_SITE = https://cdn.kernel.org/pub/linux/kernel endif MUSL_SITE = https://musl.libc.org/releases MUSL_REPO = https://git.musl-libc.org/git/musl 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 ISL_SITE = $(SOURCEFORGE_MIRROT)/project/libisl MINGW_SITE = $(SOURCEFORGE_MIRROT)/project/mingw-w64/mingw-w64/mingw-w64-release LINUX_HEADERS_SITE = https://ftp.barfooze.de/pub/sabotage/tarballs ifneq ($(findstring musl,$(TARGET)),) MINGW_VER = else MUSL_VER = LINUX_VER = endif SRC_DIRS = gcc-$(GCC_VER) binutils-$(BINUTILS_VER) \ $(if $(MUSL_VER),musl-$(MUSL_VER)) \ $(if $(GMP_VER),gmp-$(GMP_VER)) \ $(if $(MPC_VER),mpc-$(MPC_VER)) \ $(if $(MPFR_VER),mpfr-$(MPFR_VER)) \ $(if $(ISL_VER),isl-$(ISL_VER)) \ $(if $(LINUX_VER),linux-$(LINUX_VER)) \ $(if $(MINGW_VER),mingw-w64-$(MINGW_VER)) all: clean: rm -rf gcc-* binutils-* musl-* gmp-* mpc-* mpfr-* isl-* build build-* linux-* mingw-w64-* distclean: clean rm -rf sources dist check: @echo "check bzip2" @which bzip2 @echo "check gcc" @which gcc @echo "check g++" @which g++ @echo "check libtool" @which libtool # 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/isl*)): SITE = $(ISL_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/gcc-*-*)): SITE = $(GCC_SNAP)/$(subst gcc-,,$(basename $(basename $(notdir $@)))) $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/musl*)): SITE = $(MUSL_SITE) $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/linux-6*)): SITE = $(LINUX_SITE)/v6.x $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/linux-5*)): SITE = $(LINUX_SITE)/v5.x $(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 $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/linux-headers-*)): SITE = $(LINUX_HEADERS_SITE) $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/mingw-w64*)): SITE = $(MINGW_SITE) $(SOURCES): mkdir -p $@ $(SOURCES)/config.sub: | $(SOURCES) mkdir -p $@.tmp cd $@.tmp && $(DL_CMD) $(notdir $@) "https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=$(CONFIG_SUB_REV)" cd $@.tmp && touch $(notdir $@) cd $@.tmp && $(SHA1_CMD) $(CURDIR)/hashes/$(notdir $@).$(CONFIG_SUB_REV).sha1 mv $@.tmp/$(notdir $@) $@ rm -rf $@.tmp $(SOURCES)/%: hashes/%.sha1 | $(SOURCES) mkdir -p $@.tmp cd $@.tmp && $(DL_CMD) $(notdir $@) $(SITE)/$(notdir $@) cd $@.tmp && touch $(notdir $@) cd $@.tmp && $(SHA1_CMD) $(CURDIR)/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 $(MUSL_REPO) $@.tmp cd $@.tmp && git reset --hard $(patsubst musl-git-%,%,$@) && git fsck test ! -d patches/$@ || cat patches/$@/* | ( cd $@.tmp && patch -p1 ) mv $@.tmp $@ %.orig: $(SOURCES)/%.tar.gz case "$@" in */*) exit 1 ;; esac rm -rf $@.tmp mkdir $@.tmp ( cd $@.tmp && tar -zxvf - > /dev/null ) < $< rm -rf $@ touch $@.tmp/$(patsubst %.orig,%,$@) mv $@.tmp/$(patsubst %.orig,%,$@) $@ rm -rf $@.tmp %.orig: $(SOURCES)/%.tar.bz2 case "$@" in */*) exit 1 ;; esac rm -rf $@.tmp mkdir $@.tmp ( cd $@.tmp && tar -jxvf - > /dev/null ) < $< rm -rf $@ touch $@.tmp/$(patsubst %.orig,%,$@) mv $@.tmp/$(patsubst %.orig,%,$@) $@ rm -rf $@.tmp %.orig: $(SOURCES)/%.tar.xz case "$@" in */*) exit 1 ;; esac rm -rf $@.tmp mkdir $@.tmp ( cd $@.tmp && tar -Jxvf - > /dev/null ) < $< rm -rf $@ touch $@.tmp/$(patsubst %.orig,%,$@) mv $@.tmp/$(patsubst %.orig,%,$@) $@ rm -rf $@.tmp %: %.orig | $(SOURCES)/config.sub case "$@" in */*) exit 1 ;; esac rm -rf $@.tmp mkdir $@.tmp ( cd $@.tmp && $(COWPATCH) -I ../$< ) test ! -d patches/$@ || cat patches/$@/* | ( cd $@.tmp && $(COWPATCH) -p1 ) if test -f $$@ '%s\n' \ "TARGET = $(TARGET)" \ "HOST = $(HOST)" \ "GCC_SRCDIR = $(REL_TOP)/gcc-$(GCC_VER)" \ "BINUTILS_SRCDIR = $(REL_TOP)/binutils-$(BINUTILS_VER)" \ $(if $(MUSL_VER),"MUSL_SRCDIR = $(REL_TOP)/musl-$(MUSL_VER)") \ $(if $(GMP_VER),"GMP_SRCDIR = $(REL_TOP)/gmp-$(GMP_VER)") \ $(if $(MPC_VER),"MPC_SRCDIR = $(REL_TOP)/mpc-$(MPC_VER)") \ $(if $(MPFR_VER),"MPFR_SRCDIR = $(REL_TOP)/mpfr-$(MPFR_VER)") \ $(if $(ISL_VER),"ISL_SRCDIR = $(REL_TOP)/isl-$(ISL_VER)") \ $(if $(LINUX_VER),"LINUX_SRCDIR = $(REL_TOP)/linux-$(LINUX_VER)") \ $(if $(MINGW_VER),"MINGW_SRCDIR = $(REL_TOP)/mingw-w64-$(MINGW_VER)") \ "-include $(REL_TOP)/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 .SECONDARY: