Makefile 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. OUTPUT = $(PWD)/output
  2. BINUTILS_SRCDIR = BINUTILS_SRCDIR_not_set
  3. GCC_SRCDIR = GCC_SRCDIR_not_set
  4. MUSL_SRCDIR = MUSL_SRCDIR_not_set
  5. COMMON_CONFIG = --enable-languages=c,c++
  6. GCC_CONFIG = $(COMMON_CONFIG)
  7. TOOLCHAIN_CONFIG = $(GCC_CONFIG)
  8. XGCC_DIR = ../obj_toolchain/gcc
  9. XGCC = $(XGCC_DIR)/xgcc -B $(XGCC_DIR)
  10. ifneq ($(findstring fdpic,$(TARGET)),)
  11. GCC_CONFIG += --enable-fdpic
  12. endif
  13. ifneq ($(filter x86_64%x32,$(TARGET)),)
  14. GCC_CONFIG += --with-abi=x32
  15. endif
  16. ifneq ($(findstring mips64,$(TARGET))$(findstring mipsisa64,$(TARGET)),)
  17. ifneq ($(findstring n32,$(TARGET)),)
  18. GCC_CONFIG += --with-abi=n32
  19. else
  20. GCC_CONFIG += --with-abi=64
  21. endif
  22. endif
  23. ifneq ($(filter %sf,$(TARGET)),)
  24. GCC_CONFIG += --with-float=soft
  25. endif
  26. ifneq ($(filter %hf,$(TARGET)),)
  27. GCC_CONFIG += --with-float=hard
  28. endif
  29. -include config.mak
  30. MAKE += MULTILIB_OSDIRNAMES=
  31. MAKE += INFO_DEPS= infodir=
  32. MAKE += ac_cv_prog_lex_root=lex.yy.c
  33. FULL_TOOLCHAIN_CONFIG = $(TOOLCHAIN_CONFIG) \
  34. --disable-werror \
  35. --target=$(TARGET) --prefix= \
  36. --libdir=/lib --disable-multilib \
  37. --with-sysroot=$(SYSROOT) \
  38. --with-build-sysroot='$$(LC_ROOT)/obj_sysroot' \
  39. --enable-tls \
  40. --disable-libmudflap --disable-libsanitizer \
  41. --disable-gnu-indirect-function \
  42. --disable-libmpx \
  43. --enable-libstdcxx-time
  44. FULL_MUSL_CONFIG = $(MUSL_CONFIG) \
  45. --prefix= --host=$(TARGET)
  46. ifeq ($(NATIVE),)
  47. SYSROOT = /$(TARGET)
  48. FULL_MUSL_CONFIG += CC="$(XGCC)" LIBCC="../obj_toolchain/$(TARGET)/libgcc/libgcc.a"
  49. MUSL_VARS = AR=../obj_toolchain/binutils/ar RANLIB=../obj_toolchain/binutils/ranlib
  50. obj_musl/.lc_built: | obj_toolchain/$(TARGET)/libgcc/libgcc.a
  51. obj_toolchain/.lc_built: | obj_sysroot/.lc_libs
  52. else
  53. SYSROOT = /
  54. FULL_TOOLCHAIN_CONFIG += --host=$(TARGET)
  55. MUSL_VARS =
  56. endif
  57. ifeq ($(TARGET),)
  58. all:
  59. @echo TARGET must be set.
  60. @exit 1
  61. install: all
  62. else
  63. all: musl toolchain
  64. install: install-musl install-toolchain
  65. musl: obj_musl/.lc_built
  66. toolchain: obj_toolchain/.lc_built
  67. .PHONY: all musl toolchain install-musl install-toolchain clean
  68. src_binutils: | $(BINUTILS_SRCDIR)
  69. ln -sf $(BINUTILS_SRCDIR) $@
  70. src_gcc: | $(GCC_SRCDIR)
  71. ln -sf $(GCC_SRCDIR) $@
  72. src_musl: | $(MUSL_SRCDIR)
  73. ln -sf $(MUSL_SRCDIR) $@
  74. ifneq ($(GMP_SRCDIR),)
  75. src_toolchain: src_gmp
  76. src_gmp: | $(GMP_SRCDIR)
  77. ln -sf "$(GMP_SRCDIR)" $@
  78. endif
  79. ifneq ($(MPC_SRCDIR),)
  80. src_toolchain: src_mpc
  81. src_mpc: | $(MPC_SRCDIR)
  82. ln -sf "$(MPC_SRCDIR)" $@
  83. endif
  84. ifneq ($(MPFR_SRCDIR),)
  85. src_toolchain: src_mpfr
  86. src_mpfr: | $(MPFR_SRCDIR)
  87. ln -sf "$(MPFR_SRCDIR)" $@
  88. endif
  89. ifneq ($(ISL_SRCDIR),)
  90. src_toolchain: src_isl
  91. src_isl: | $(ISL_SRCDIR)
  92. ln -sf "$(ISL_SRCDIR)" $@
  93. endif
  94. src_toolchain: src_binutils src_gcc
  95. rm -rf $@ $@.tmp
  96. mkdir $@.tmp
  97. cd $@.tmp && ln -sf ../src_binutils/* .
  98. cd $@.tmp && ln -sf ../src_gcc/* .
  99. $(if $(GMP_SRCDIR),cd $@.tmp && ln -sf ../src_gmp gmp)
  100. $(if $(MPC_SRCDIR),cd $@.tmp && ln -sf ../src_mpc mpc)
  101. $(if $(MPFR_SRCDIR),cd $@.tmp && ln -sf ../src_mpfr mpfr)
  102. $(if $(ISL_SRCDIR),cd $@.tmp && ln -sf ../src_isl isl)
  103. mv $@.tmp $@
  104. obj_%:
  105. mkdir -p $@
  106. obj_sysroot/include:
  107. mkdir -p $@
  108. obj_sysroot/usr: | obj_sysroot
  109. ln -sf . $@
  110. obj_sysroot/lib64: | obj_sysroot
  111. ln -sf lib $@
  112. obj_toolchain/.lc_configured: | obj_toolchain src_toolchain
  113. cd obj_toolchain && ../src_toolchain/configure $(FULL_TOOLCHAIN_CONFIG)
  114. touch $@
  115. obj_toolchain/gcc/.lc_built: | obj_toolchain/.lc_configured obj_sysroot/usr obj_sysroot/lib64 obj_sysroot/include
  116. cd obj_toolchain && $(MAKE) MAKE="$(MAKE)" LC_ROOT=$(PWD) all-gcc
  117. touch $@
  118. obj_musl/.lc_configured: | obj_toolchain/gcc/.lc_built obj_musl src_musl
  119. cd obj_musl && ../src_musl/configure $(FULL_MUSL_CONFIG)
  120. touch $@
  121. obj_sysroot/.lc_headers: | obj_musl/.lc_configured obj_sysroot
  122. cd obj_musl && $(MAKE) DESTDIR=$(PWD)/obj_sysroot install-headers
  123. touch $@
  124. obj_toolchain/$(TARGET)/libgcc/.lc_configured: | obj_sysroot/.lc_headers
  125. cd obj_toolchain && $(MAKE) MAKE="$(MAKE)" LC_ROOT=$(PWD) configure-target-libgcc
  126. touch $@
  127. obj_toolchain/$(TARGET)/libgcc/libgcc.a: | obj_toolchain/$(TARGET)/libgcc/.lc_configured
  128. cd $(dir $@) && $(MAKE) MAKE="$(MAKE)" LC_ROOT=$(PWD) libgcc.a
  129. obj_musl/.lc_built: | obj_musl/.lc_configured
  130. cd obj_musl && $(MAKE) $(MUSL_VARS)
  131. touch $@
  132. obj_sysroot/.lc_libs: | obj_musl/.lc_built
  133. cd obj_musl && $(MAKE) $(MUSL_VARS) DESTDIR=$(PWD)/obj_sysroot install
  134. touch $@
  135. obj_toolchain/.lc_built: | obj_toolchain/.lc_configured obj_sysroot/.lc_headers
  136. cd obj_toolchain && $(MAKE) MAKE="$(MAKE)" LC_ROOT=$(PWD)
  137. touch $@
  138. install-musl: | obj_musl/.lc_built
  139. cd obj_musl && $(MAKE) $(MUSL_VARS) DESTDIR=$(DESTDIR)$(OUTPUT)$(SYSROOT) install
  140. install-toolchain: | obj_toolchain/.lc_built
  141. cd obj_toolchain && $(MAKE) MAKE="$(MAKE)" LC_ROOT=$(PWD) DESTDIR=$(DESTDIR)$(OUTPUT) install
  142. ln -sf $(TARGET)-gcc $(DESTDIR)$(OUTPUT)/bin/$(TARGET)-cc
  143. ifneq ($(LINUX_SRCDIR),)
  144. TARGET_ARCH = $(firstword $(subst -, ,$(TARGET)))
  145. TARGET_ARCH_MANGLED = $(patsubst i%86,x86,$(patsubst aarch64%,arm64%,$(TARGET_ARCH)))
  146. LINUX_ARCH_LIST = $(sort $(notdir $(wildcard $(LINUX_SRCDIR)/arch/*)))
  147. LINUX_ARCH = $(firstword $(foreach a,$(LINUX_ARCH_LIST),$(findstring $(a),$(TARGET_ARCH_MANGLED))))
  148. ifneq ($(LINUX_ARCH),)
  149. all: kernel-headers
  150. install: install-kernel-headers
  151. kernel-headers: | obj_kernel_headers/.lc_built
  152. src_kernel_headers: | $(LINUX_SRCDIR)
  153. ln -sf "$(LINUX_SRCDIR)" $@
  154. obj_kernel_headers/.lc_built: | src_kernel_headers
  155. mkdir -p $(PWD)/obj_kernel_headers/staged
  156. cd src_kernel_headers && $(MAKE) ARCH=$(LINUX_ARCH) O=$(PWD)/obj_kernel_headers INSTALL_HDR_PATH=$(PWD)/obj_kernel_headers/staged headers_install
  157. touch $@
  158. install-kernel-headers: | obj_kernel_headers/.lc_built
  159. mkdir -p $(DESTDIR)$(OUTPUT)$(SYSROOT)/include
  160. cp -R obj_kernel_headers/staged/include/* $(DESTDIR)$(OUTPUT)$(SYSROOT)/include
  161. endif
  162. endif
  163. endif
  164. clean:
  165. rm -rf src_* obj_*