Makefile 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. OUTPUT = $(PWD)/output
  2. SOURCES = sources
  3. CONFIG_SUB_REV = 3d5db9ebe860
  4. BINUTILS_VER = 2.25.1
  5. GCC_VER = 5.3.0
  6. MUSL_VER = 1.1.14
  7. GMP_VER = 6.1.0
  8. MPC_VER = 1.0.3
  9. MPFR_VER = 3.1.4
  10. LINUX_VER = 4.4.10
  11. GNU_SITE = https://ftp.gnu.org/pub/gnu
  12. GCC_SITE = $(GNU_SITE)/gcc
  13. BINUTILS_SITE = $(GNU_SITE)/binutils
  14. GMP_SITE = $(GNU_SITE)/gmp
  15. MPC_SITE = $(GNU_SITE)/mpc
  16. MPFR_SITE = $(GNU_SITE)/mpfr
  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. BUILD_DIR = build-$(TARGET)
  21. -include config.mak
  22. SRC_DIRS = gcc-$(GCC_VER) binutils-$(BINUTILS_VER) musl-$(MUSL_VER) \
  23. $(if $(GMP_VER),gmp-$(GMP_VER)) \
  24. $(if $(MPC_VER),mpc-$(MPC_VER)) \
  25. $(if $(MPFR_VER),mpfr-$(MPFR_VER)) \
  26. $(if $(LINUX_VER),linux-$(LINUX_VER))
  27. all:
  28. clean:
  29. rm -rf gcc-* binutils-* musl-* gmp-* mpc-* mpfr-* build-*
  30. distclean: clean
  31. rm -rf sources
  32. # Rules for downloading and verifying sources. Treat an external SOURCES path as
  33. # immutable and do not try to download anything into it.
  34. ifeq ($(SOURCES),sources)
  35. $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/gmp*)): SITE = $(GMP_SITE)
  36. $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/mpc*)): SITE = $(MPC_SITE)
  37. $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/mpfr*)): SITE = $(MPFR_SITE)
  38. $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/binutils*)): SITE = $(BINUTILS_SITE)
  39. $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/gcc*)): SITE = $(GCC_SITE)/$(basename $(basename $(notdir $@)))
  40. $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/musl*)): SITE = $(MUSL_SITE)
  41. $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/linux-4*)): SITE = $(LINUX_SITE)/v4.x
  42. $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/linux-3*)): SITE = $(LINUX_SITE)/v3.x
  43. $(patsubst hashes/%.sha1,$(SOURCES)/%,$(wildcard hashes/linux-2.6*)): SITE = $(LINUX_SITE)/v2.6
  44. $(SOURCES):
  45. mkdir -p $@
  46. $(SOURCES)/config.sub: | $(SOURCES)
  47. mkdir -p $@.tmp
  48. 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)"
  49. cd $@.tmp && touch $(notdir $@)
  50. cd $@.tmp && sha1sum -c $(PWD)/hashes/$(notdir $@).$(CONFIG_SUB_REV).sha1
  51. mv $@.tmp/$(notdir $@) $@
  52. rm -rf $@.tmp
  53. $(SOURCES)/%: hashes/%.sha1 | $(SOURCES)
  54. mkdir -p $@.tmp
  55. cd $@.tmp && wget -c -O $(notdir $@) $(SITE)/$(notdir $@)
  56. cd $@.tmp && touch $(notdir $@)
  57. cd $@.tmp && sha1sum -c $(PWD)/hashes/$(notdir $@).sha1
  58. mv $@.tmp/$(notdir $@) $@
  59. rm -rf $@.tmp
  60. endif
  61. # Rules for extracting and patching sources, or checking them out from git.
  62. musl-git-%:
  63. rm -rf $@.tmp
  64. git clone -b $(patsubst musl-git-%,%,$@) $(MUSL_REPO) $@.tmp
  65. cd $@.tmp && git fsck
  66. mv $@.tmp $@
  67. %: $(SOURCES)/%.tar.gz | $(SOURCES)/config.sub
  68. rm -rf $@.tmp
  69. mkdir $@.tmp
  70. ( cd $@.tmp && tar zxvf - ) < $<
  71. test ! -d patches/$@ || cat patches/$@/* | ( cd $@.tmp/$@ && patch -p1 )
  72. test ! -f $@.tmp/$@/config.sub || cp -f $(SOURCES)/config.sub $@.tmp/$@
  73. rm -rf $@
  74. touch $@.tmp/$@
  75. mv $@.tmp/$@ $@
  76. rm -rf $@.tmp
  77. %: $(SOURCES)/%.tar.bz2 | $(SOURCES)/config.sub
  78. rm -rf $@.tmp
  79. mkdir $@.tmp
  80. ( cd $@.tmp && tar jxvf - ) < $<
  81. test ! -d patches/$@ || cat patches/$@/* | ( cd $@.tmp/$@ && patch -p1 )
  82. test ! -f $@.tmp/$@/config.sub || cp -f $(SOURCES)/config.sub $@.tmp/$@
  83. rm -rf $@
  84. touch $@.tmp/$@
  85. mv $@.tmp/$@ $@
  86. rm -rf $@.tmp
  87. %: $(SOURCES)/%.tar.xz | $(SOURCES)/config.sub
  88. rm -rf $@.tmp
  89. mkdir $@.tmp
  90. ( cd $@.tmp && tar Jxvf - ) < $<
  91. test ! -d patches/$@ || cat patches/$@/* | ( cd $@.tmp/$@ && patch -p1 )
  92. test ! -f $@.tmp/$@/config.sub || cp -f $(SOURCES)/config.sub $@.tmp/$@
  93. rm -rf $@
  94. touch $@.tmp/$@
  95. mv $@.tmp/$@ $@
  96. rm -rf $@.tmp
  97. # Rules for building.
  98. ifeq ($(TARGET),)
  99. all:
  100. @echo TARGET must be set via config.mak or command line.
  101. @exit 1
  102. else
  103. $(BUILD_DIR):
  104. mkdir -p $@
  105. $(BUILD_DIR)/Makefile: | $(BUILD_DIR)
  106. ln -sf ../litecross/Makefile $@
  107. $(BUILD_DIR)/config.mak: | $(BUILD_DIR)
  108. printf >$@ -- '%s\n' \
  109. "MUSL_SRCDIR = ../musl-$(MUSL_VER)" \
  110. "GCC_SRCDIR = ../gcc-$(GCC_VER)" \
  111. "BINUTILS_SRCDIR = ../binutils-$(BINUTILS_VER)" \
  112. $(if $(GMP_VER),"GMP_SRCDIR = ../gmp-$(GMP_VER)") \
  113. $(if $(MPC_VER),"MPC_SRCDIR = ../mpc-$(MPC_VER)") \
  114. $(if $(MPFR_VER),"MPFR_SRCDIR = ../mpfr-$(MPFR_VER)") \
  115. $(if $(LINUX_VER),"LINUX_SRCDIR = ../linux-$(LINUX_VER)") \
  116. "-include ../config.mak"
  117. all: | $(SRC_DIRS) $(BUILD_DIR) $(BUILD_DIR)/Makefile $(BUILD_DIR)/config.mak
  118. cd $(BUILD_DIR) && $(MAKE) $@
  119. install: | $(SRC_DIRS) $(BUILD_DIR) $(BUILD_DIR)/Makefile $(BUILD_DIR)/config.mak
  120. cd $(BUILD_DIR) && $(MAKE) OUTPUT=$(OUTPUT) $@
  121. endif