Makefile 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. SOURCES = sources
  2. CONFIG_SUB_REV = 3d5db9ebe860
  3. BINUTILS_VER = 2.33.1
  4. GCC_VER = 9.2.0
  5. MUSL_VER = 1.1.24
  6. GMP_VER = 6.1.2
  7. MPC_VER = 1.1.0
  8. MPFR_VER = 4.0.2
  9. LINUX_VER = headers-4.19.88
  10. GNU_SITE = https://ftp.gnu.org/pub/gnu
  11. GCC_SITE = $(GNU_SITE)/gcc
  12. BINUTILS_SITE = $(GNU_SITE)/binutils
  13. GMP_SITE = $(GNU_SITE)/gmp
  14. MPC_SITE = $(GNU_SITE)/mpc
  15. MPFR_SITE = $(GNU_SITE)/mpfr
  16. ISL_SITE = http://isl.gforge.inria.fr/
  17. MUSL_SITE = https://www.musl-libc.org/releases
  18. MUSL_REPO = git://git.musl-libc.org/musl
  19. LINUX_SITE = https://cdn.kernel.org/pub/linux/kernel
  20. LINUX_HEADERS_SITE = http://ftp.barfooze.de/pub/sabotage/tarballs/
  21. DL_CMD = wget -c -O
  22. COWPATCH = $(PWD)/cowpatch.sh
  23. HOST = $(if $(NATIVE),$(TARGET))
  24. BUILD_DIR = build/$(if $(HOST),$(HOST),local)/$(TARGET)
  25. OUTPUT = $(CURDIR)/output$(if $(HOST),-$(HOST))
  26. REL_TOP = ../../..
  27. -include config.mak
  28. SRC_DIRS = gcc-$(GCC_VER) binutils-$(BINUTILS_VER) musl-$(MUSL_VER) \
  29. $(if $(GMP_VER),gmp-$(GMP_VER)) \
  30. $(if $(MPC_VER),mpc-$(MPC_VER)) \
  31. $(if $(MPFR_VER),mpfr-$(MPFR_VER)) \
  32. $(if $(ISL_VER),isl-$(ISL_VER)) \
  33. $(if $(LINUX_VER),linux-$(LINUX_VER))
  34. all:
  35. clean:
  36. rm -rf gcc-* binutils-* musl-* gmp-* mpc-* mpfr-* isl-* build build-* linux-*
  37. distclean: clean
  38. rm -rf sources
  39. # Rules for downloading and verifying sources. Treat an external SOURCES path as
  40. # immutable and do not try to download anything into it.
  41. ifeq ($(SOURCES),sources)
  42. $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/gmp*)): SITE = $(GMP_SITE)
  43. $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/mpc*)): SITE = $(MPC_SITE)
  44. $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/mpfr*)): SITE = $(MPFR_SITE)
  45. $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/isl*)): SITE = $(ISL_SITE)
  46. $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/binutils*)): SITE = $(BINUTILS_SITE)
  47. $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/gcc*)): SITE = $(GCC_SITE)/$(basename $(basename $(notdir $@)))
  48. $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/musl*)): SITE = $(MUSL_SITE)
  49. $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/linux-4*)): SITE = $(LINUX_SITE)/v4.x
  50. $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/linux-3*)): SITE = $(LINUX_SITE)/v3.x
  51. $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/linux-2.6*)): SITE = $(LINUX_SITE)/v2.6
  52. $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/linux-headers-*)): SITE = $(LINUX_HEADERS_SITE)
  53. $(SOURCES):
  54. mkdir -p $@
  55. $(SOURCES)/config.sub: | $(SOURCES)
  56. mkdir -p $@.tmp
  57. cd $@.tmp && $(DL_CMD) $(notdir $@) "http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=$(CONFIG_SUB_REV)"
  58. cd $@.tmp && touch $(notdir $@)
  59. cd $@.tmp && sha1sum -c $(CURDIR)/hashes/$(notdir $@).$(CONFIG_SUB_REV).sha1
  60. mv $@.tmp/$(notdir $@) $@
  61. rm -rf $@.tmp
  62. $(SOURCES)/%: hashes/%.sha1 | $(SOURCES)
  63. mkdir -p $@.tmp
  64. cd $@.tmp && $(DL_CMD) $(notdir $@) $(SITE)/$(notdir $@)
  65. cd $@.tmp && touch $(notdir $@)
  66. cd $@.tmp && sha1sum -c $(CURDIR)/hashes/$(notdir $@).sha1
  67. mv $@.tmp/$(notdir $@) $@
  68. rm -rf $@.tmp
  69. endif
  70. # Rules for extracting and patching sources, or checking them out from git.
  71. musl-git-%:
  72. rm -rf $@.tmp
  73. git clone -b $(patsubst musl-git-%,%,$@) $(MUSL_REPO) $@.tmp
  74. cd $@.tmp && git fsck
  75. mv $@.tmp $@
  76. %.orig: $(SOURCES)/%.tar.gz
  77. case "$@" in */*) exit 1 ;; esac
  78. rm -rf $@.tmp
  79. mkdir $@.tmp
  80. ( cd $@.tmp && tar zxvf - ) < $<
  81. rm -rf $@
  82. touch $@.tmp/$(patsubst %.orig,%,$@)
  83. mv $@.tmp/$(patsubst %.orig,%,$@) $@
  84. rm -rf $@.tmp
  85. %.orig: $(SOURCES)/%.tar.bz2
  86. case "$@" in */*) exit 1 ;; esac
  87. rm -rf $@.tmp
  88. mkdir $@.tmp
  89. ( cd $@.tmp && tar jxvf - ) < $<
  90. rm -rf $@
  91. touch $@.tmp/$(patsubst %.orig,%,$@)
  92. mv $@.tmp/$(patsubst %.orig,%,$@) $@
  93. rm -rf $@.tmp
  94. %.orig: $(SOURCES)/%.tar.xz
  95. case "$@" in */*) exit 1 ;; esac
  96. rm -rf $@.tmp
  97. mkdir $@.tmp
  98. ( cd $@.tmp && tar Jxvf - ) < $<
  99. rm -rf $@
  100. touch $@.tmp/$(patsubst %.orig,%,$@)
  101. mv $@.tmp/$(patsubst %.orig,%,$@) $@
  102. rm -rf $@.tmp
  103. %: %.orig | $(SOURCES)/config.sub
  104. case "$@" in */*) exit 1 ;; esac
  105. rm -rf $@.tmp
  106. mkdir $@.tmp
  107. ( cd $@.tmp && find ../$< -path '*/*/*' -prune -exec sh -c 'ln -s "$$@" .' ':' {} + )
  108. test ! -d patches/$@ || cat patches/$@/* | ( cd $@.tmp && $(COWPATCH) -p1 )
  109. test ! -f $</config.sub || ( rm -f $@.tmp/config.sub && cp -f $(SOURCES)/config.sub $@.tmp/ )
  110. rm -rf $@
  111. mv $@.tmp $@
  112. binutils-$(BINUTILS_VER): $(wildcard patches/binutils-$(BINUTILS_VER) patches/binutils-$(BINUTILS_VER)/*)
  113. gcc-$(GCC_VER): $(wildcard patches/gcc-$(GCC_VER) patches/gcc-$(GCC_VER)/*)
  114. musl-$(MUSL_VER): $(wildcard patches/musl-$(MUSL_VER) patches/musl-$(MUSL_VER)/*)
  115. gmp-$(GMP_VER): $(wildcard patches/gmp-$(GMP_VER) patches/gmp-$(GMP_VER)/*)
  116. mpfr-$(MPFR_VER): $(wildcard patches/mpfr-$(MPFR_VER) patches/mpfr-$(MPFR_VER)/*)
  117. mpc-$(MPC_VER): $(wildcard patches/mpc-$(MPC_VER) patches/mpc-$(MPC_VER)/*)
  118. ils-$(ISL_VER): $(wildcard patches/isl-$(ISL_VER) patches/isl-$(ISL_VER)/*)
  119. linux-$(LINUX_VER): $(wildcard patches/linux-$(LINUX_VER) patches/linux-$(LINUX_VER)/*)
  120. extract_all: | $(SRC_DIRS)
  121. # Rules for building.
  122. ifeq ($(TARGET),)
  123. all:
  124. @echo TARGET must be set via config.mak or command line.
  125. @exit 1
  126. else
  127. $(BUILD_DIR):
  128. mkdir -p $@
  129. $(BUILD_DIR)/Makefile: | $(BUILD_DIR)
  130. ln -sf $(REL_TOP)/litecross/Makefile $@
  131. $(BUILD_DIR)/config.mak: | $(BUILD_DIR)
  132. printf >$@ '%s\n' \
  133. "TARGET = $(TARGET)" \
  134. "HOST = $(HOST)" \
  135. "MUSL_SRCDIR = $(REL_TOP)/musl-$(MUSL_VER)" \
  136. "GCC_SRCDIR = $(REL_TOP)/gcc-$(GCC_VER)" \
  137. "BINUTILS_SRCDIR = $(REL_TOP)/binutils-$(BINUTILS_VER)" \
  138. $(if $(GMP_VER),"GMP_SRCDIR = $(REL_TOP)/gmp-$(GMP_VER)") \
  139. $(if $(MPC_VER),"MPC_SRCDIR = $(REL_TOP)/mpc-$(MPC_VER)") \
  140. $(if $(MPFR_VER),"MPFR_SRCDIR = $(REL_TOP)/mpfr-$(MPFR_VER)") \
  141. $(if $(ISL_VER),"ISL_SRCDIR = $(REL_TOP)/isl-$(ISL_VER)") \
  142. $(if $(LINUX_VER),"LINUX_SRCDIR = $(REL_TOP)/linux-$(LINUX_VER)") \
  143. "-include $(REL_TOP)/config.mak"
  144. all: | $(SRC_DIRS) $(BUILD_DIR) $(BUILD_DIR)/Makefile $(BUILD_DIR)/config.mak
  145. cd $(BUILD_DIR) && $(MAKE) $@
  146. install: | $(SRC_DIRS) $(BUILD_DIR) $(BUILD_DIR)/Makefile $(BUILD_DIR)/config.mak
  147. cd $(BUILD_DIR) && $(MAKE) OUTPUT=$(OUTPUT) $@
  148. endif
  149. .SECONDARY: