Makefile 5.9 KB

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