Makefile 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. TARGET?=$(shell rustc -Z unstable-options --print target-spec-json | grep llvm-target | cut -d '"' -f4)
  2. CARGO?=cargo
  3. CARGO_TEST?=$(CARGO)
  4. CARGOFLAGS?=-Z build-std=core,alloc,compiler_builtins
  5. RUSTCFLAGS?=
  6. export OBJCOPY?=objcopy
  7. # When using xargo, build it in local location
  8. export XARGO_HOME=$(CURDIR)/target/xargo
  9. BUILD="target/$(TARGET)"
  10. CARGOFLAGS+="--target=$(TARGET)"
  11. ifeq ($(TARGET),aarch64-unknown-linux-gnu)
  12. export CC=aarch64-linux-gnu-gcc
  13. export LD=aarch64-linux-gnu-ld
  14. export AR=aarch64-linux-gnu-ar
  15. export OBJCOPY=aarch64-linux-gnu-objcopy
  16. endif
  17. ifeq ($(TARGET),aarch64-unknown-redox)
  18. export CC=aarch64-unknown-redox-gcc
  19. export LD=aarch64-unknown-redox-ld
  20. export AR=aarch64-unknown-redox-ar
  21. export OBJCOPY=aarch64-unknown-redox-objcopy
  22. endif
  23. ifeq ($(TARGET),x86_64-unknown-linux-gnu)
  24. export CC=x86_64-linux-gnu-gcc
  25. export LD=x86_64-linux-gnu-ld
  26. export AR=x86_64-linux-gnu-ar
  27. export OBJCOPY=x86_64-linux-gnu-objcopy
  28. endif
  29. ifeq ($(TARGET),x86_64-unknown-redox)
  30. export CC=x86_64-unknown-redox-gcc
  31. export LD=x86_64-unknown-redox-ld
  32. export AR=x86_64-unknown-redox-ar
  33. export OBJCOPY=x86_64-unknown-redox-objcopy
  34. endif
  35. SRC=\
  36. Cargo.* \
  37. $(shell find src -type f)
  38. # FIXME: Remove the following line. It's only required since xargo automatically links with compiler_builtins, which conflicts with the compiler_builtins that rustc always links with.
  39. WEAKEN_SYMBOLS=\
  40. -W __divti3 \
  41. -W __fixdfti \
  42. -W __floattidf \
  43. -W __muloti4 \
  44. -W __udivti3 \
  45. -W __umodti3 \
  46. -W __rust_probestack \
  47. -W __rust_alloc \
  48. -W __rust_alloc_zeroed \
  49. -W __rust_dealloc \
  50. -W __rust_realloc
  51. .PHONY: all clean fmt install install-headers libs submodules test
  52. all: | libs
  53. clean:
  54. $(CARGO) clean
  55. $(MAKE) -C tests clean
  56. rm -rf sysroot
  57. check:
  58. $(CARGO) check
  59. fmt:
  60. ./fmt.sh
  61. install-headers: libs
  62. mkdir -pv "$(DESTDIR)/include"
  63. cp -rv "include"/* "$(DESTDIR)/include"
  64. cp -rv "target/include"/* "$(DESTDIR)/include"
  65. cp -v "openlibm/include"/*.h "$(DESTDIR)/include"
  66. cp -v "openlibm/src"/*.h "$(DESTDIR)/include"
  67. cp -v "pthreads-emb/"*.h "$(DESTDIR)/include"
  68. libs: \
  69. $(BUILD)/release/libc.a \
  70. $(BUILD)/release/libc.so \
  71. $(BUILD)/release/crt0.o \
  72. $(BUILD)/release/crti.o \
  73. $(BUILD)/release/crtn.o \
  74. $(BUILD)/release/ld_so
  75. install-libs: libs
  76. mkdir -pv "$(DESTDIR)/lib"
  77. cp -v "$(BUILD)/release/libc.a" "$(DESTDIR)/lib"
  78. cp -v "$(BUILD)/release/libc.so" "$(DESTDIR)/lib"
  79. ln -frsv "$(DESTDIR)/lib/libc.so" "$(DESTDIR)/lib/libc.so.6"
  80. cp -v "$(BUILD)/release/crt0.o" "$(DESTDIR)/lib"
  81. ln -frsv "$(DESTDIR)/lib/crt0.o" "$(DESTDIR)/lib/crt1.o"
  82. cp -v "$(BUILD)/release/crti.o" "$(DESTDIR)/lib"
  83. cp -v "$(BUILD)/release/crtn.o" "$(DESTDIR)/lib"
  84. cp -v "$(BUILD)/release/ld_so" "$(DESTDIR)/lib/ld64.so.1"
  85. cp -v "$(BUILD)/openlibm/libopenlibm.a" "$(DESTDIR)/lib/libm.a"
  86. cp -v "$(BUILD)/pthreads-emb/libpthread.a" "$(DESTDIR)/lib/libpthread.a"
  87. install: install-headers install-libs
  88. submodules:
  89. git submodule sync
  90. git submodule update --init --recursive
  91. sysroot: all
  92. rm -rf $@
  93. rm -rf $@.partial
  94. mkdir -p $@.partial
  95. $(MAKE) install DESTDIR=$@.partial
  96. mv $@.partial $@
  97. touch $@
  98. test: sysroot
  99. # TODO: Fix SIGILL when running cargo test
  100. # $(CARGO_TEST) test
  101. $(MAKE) -C tests verify
  102. # Debug targets
  103. $(BUILD)/debug/libc.a: $(BUILD)/debug/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
  104. echo "create $@" > "$@.mri"
  105. for lib in $^; do\
  106. echo "addlib $$lib" >> "$@.mri"; \
  107. done
  108. echo "save" >> "$@.mri"
  109. echo "end" >> "$@.mri"
  110. $(AR) -M < "$@.mri"
  111. $(BUILD)/debug/libc.so: $(BUILD)/debug/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
  112. $(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -Wl,-soname,libc.so.6 -o $@
  113. $(BUILD)/debug/librelibc.a: $(SRC)
  114. CARGO_INCREMENTAL=0 $(CARGO) rustc $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS)
  115. # FIXME: Remove the following line. It's only required since xargo automatically links with compiler_builtins, which conflicts with the compiler_builtins that rustc always links with.
  116. $(OBJCOPY) $@ $(WEAKEN_SYMBOLS)
  117. touch $@
  118. $(BUILD)/debug/crt0.o: $(SRC)
  119. CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
  120. touch $@
  121. $(BUILD)/debug/crti.o: $(SRC)
  122. CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
  123. touch $@
  124. $(BUILD)/debug/crtn.o: $(SRC)
  125. CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
  126. touch $@
  127. $(BUILD)/debug/ld_so.o: $(SRC)
  128. CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
  129. touch $@
  130. $(BUILD)/debug/ld_so: $(BUILD)/debug/ld_so.o $(BUILD)/debug/crti.o $(BUILD)/debug/libc.a $(BUILD)/debug/crtn.o
  131. $(LD) --no-relax -T src/ld_so/ld_script/$(TARGET).ld --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@
  132. # Release targets
  133. $(BUILD)/release/libc.a: $(BUILD)/release/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
  134. echo "create $@" > "$@.mri"
  135. for lib in $^; do\
  136. echo "addlib $$lib" >> "$@.mri"; \
  137. done
  138. echo "save" >> "$@.mri"
  139. echo "end" >> "$@.mri"
  140. $(AR) -M < "$@.mri"
  141. $(BUILD)/release/libc.so: $(BUILD)/release/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
  142. $(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -Wl,-soname,libc.so.6 -o $@
  143. $(BUILD)/release/librelibc.a: $(SRC)
  144. CARGO_INCREMENTAL=0 $(CARGO) rustc --release $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS)
  145. $(OBJCOPY) $@ $(WEAKEN_SYMBOLS)
  146. touch $@
  147. $(BUILD)/release/crt0.o: $(SRC)
  148. CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
  149. touch $@
  150. $(BUILD)/release/crti.o: $(SRC)
  151. CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
  152. touch $@
  153. $(BUILD)/release/crtn.o: $(SRC)
  154. CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
  155. touch $@
  156. $(BUILD)/release/ld_so.o: $(SRC)
  157. CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
  158. touch $@
  159. $(BUILD)/release/ld_so: $(BUILD)/release/ld_so.o $(BUILD)/release/crti.o $(BUILD)/release/libc.a $(BUILD)/release/crtn.o
  160. $(LD) --no-relax -T src/ld_so/ld_script/$(TARGET).ld --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@
  161. # Other targets
  162. $(BUILD)/openlibm: openlibm
  163. rm -rf $@ $@.partial
  164. mkdir -p $(BUILD)
  165. cp -r $< $@.partial
  166. mv $@.partial $@
  167. touch $@
  168. $(BUILD)/openlibm/libopenlibm.a: $(BUILD)/openlibm $(BUILD)/release/librelibc.a
  169. $(MAKE) AR=$(AR) CC=$(CC) LD=$(LD) CPPFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libopenlibm.a
  170. $(BUILD)/pthreads-emb: pthreads-emb
  171. rm -rf $@ $@.partial
  172. mkdir -p $(BUILD)
  173. cp -r $< $@.partial
  174. mv $@.partial $@
  175. touch $@
  176. $(BUILD)/pthreads-emb/libpthread.a: $(BUILD)/pthreads-emb $(BUILD)/release/librelibc.a
  177. $(MAKE) AR=$(AR) CC=$(CC) LD=$(LD) CFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libpthread.a