Makefile 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. # TARGET?=$(shell rustc -Z unstable-options --print target-spec-json | grep llvm-target | cut -d '"' -f4)
  2. TARGET=x86_64-unknown-dragonos
  3. CARGO?=cargo
  4. CARGO_TEST?=$(CARGO)
  5. CARGO_COMMON_FLAGS=-Z build-std=core,alloc,compiler_builtins
  6. CARGOFLAGS?=$(CARGO_COMMON_FLAGS)
  7. RUSTCFLAGS?=
  8. export OBJCOPY?=objcopy
  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),i686-unknown-redox)
  30. export CC=i686-unknown-redox-gcc
  31. export LD=i686-unknown-redox-ld
  32. export AR=i686-unknown-redox-ar
  33. export OBJCOPY=i686-unknown-redox-objcopy
  34. endif
  35. ifeq ($(TARGET),x86_64-unknown-redox)
  36. export CC=x86_64-unknown-redox-gcc
  37. export LD=x86_64-unknown-redox-ld
  38. export AR=x86_64-unknown-redox-ar
  39. export OBJCOPY=x86_64-unknown-redox-objcopy
  40. endif
  41. ifeq ($(TARGET),x86_64-unknown-dragonos)
  42. # 如果存在x86_64-dragonos-gcc,就用它,否则用gcc
  43. ifeq ($(shell which x86_64-dragonos-gcc),)
  44. export CC=gcc
  45. # export LD=ld
  46. export LD=ld
  47. export AR=ar
  48. # export AR=x86_64-dragonos-ar
  49. export OBJCOPY=objcopy
  50. # export OBJCOPY=x86_64-dragonos-objcopy
  51. else
  52. export CC=x86_64-dragonos-gcc
  53. export LD=x86_64-dragonos-ld
  54. export AR=x86_64-dragonos-ar
  55. export OBJCOPY=x86_64-dragonos-objcopy
  56. endif
  57. endif
  58. SRC=\
  59. Cargo.* \
  60. $(shell find src -type f)
  61. BUILTINS_VERSION=0.1.70
  62. .PHONY: all clean fmt install install-headers libs submodules test
  63. all: | libs
  64. clean:
  65. $(CARGO) clean
  66. check:
  67. $(CARGO) check
  68. fmt:
  69. ./fmt.sh
  70. install-headers: libs
  71. mkdir -pv "$(DESTDIR)/include"
  72. cp -rv "include"/* "$(DESTDIR)/include"
  73. cp -rv "target/include"/* "$(DESTDIR)/include"
  74. cp -v "openlibm/include"/*.h "$(DESTDIR)/include"
  75. cp -v "openlibm/src"/*.h "$(DESTDIR)/include"
  76. cp -v "pthreads-emb/"*.h "$(DESTDIR)/include"
  77. # $(BUILD)/release/libc.so
  78. libs:
  79. @cargo -Z build-std=core,alloc,compiler_builtins build --target target.json --release
  80. #$(BUILD)/release/ld_so
  81. install-libs: libs
  82. mkdir -pv "$(DESTDIR)/lib"
  83. cp -v "$(BUILD)/release/libc.a" "$(DESTDIR)/lib"
  84. # cp -v "$(BUILD)/release/libc.so" "$(DESTDIR)/lib"
  85. # ln -frsv "$(DESTDIR)/lib/libc.so" "$(DESTDIR)/lib/libc.so.6"
  86. cp -v "$(BUILD)/release/crt0.o" "$(DESTDIR)/lib"
  87. ln -frsv "$(DESTDIR)/lib/crt0.o" "$(DESTDIR)/lib/crt1.o"
  88. cp -v "$(BUILD)/release/crti.o" "$(DESTDIR)/lib"
  89. cp -v "$(BUILD)/release/crtn.o" "$(DESTDIR)/lib"
  90. # cp -v "$(BUILD)/release/ld_so" "$(DESTDIR)/lib/ld64.so.1"
  91. cp -v "$(BUILD)/openlibm/libopenlibm.a" "$(DESTDIR)/lib/libm.a"
  92. cp -v "$(BUILD)/pthreads-emb/libpthread.a" "$(DESTDIR)/lib/libpthread.a"
  93. # Empty libraries for dl and rt
  94. $(AR) -rcs "$(DESTDIR)/lib/libdl.a"
  95. $(AR) -rcs "$(DESTDIR)/lib/librt.a"
  96. install: install-headers install-libs
  97. submodules:
  98. git submodule sync
  99. git submodule update --init --recursive
  100. sysroot: all
  101. rm -rf $@
  102. rm -rf $@.partial
  103. mkdir -p $@.partial
  104. $(MAKE) install DESTDIR=$@.partial
  105. mv $@.partial $@
  106. touch $@
  107. test: sysroot
  108. # TODO: Fix SIGILL when running cargo test
  109. # $(CARGO_TEST) test
  110. $(MAKE) -C tests verify
  111. # Debug targets
  112. $(BUILD)/debug/libc.a: $(BUILD)/debug/libdrsstd.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
  113. echo "create $@" > "$@.mri"
  114. for lib in $^; do\
  115. echo "addlib $$lib" >> "$@.mri"; \
  116. done
  117. echo "save" >> "$@.mri"
  118. echo "end" >> "$@.mri"
  119. $(AR) -M < "$@.mri"
  120. $(BUILD)/debug/libc.so: $(BUILD)/debug/libdrsstd.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
  121. $(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -Wl,-soname,libc.so.6 -o $@
  122. $(BUILD)/debug/libdrsstd.a: $(SRC)
  123. CARGO_INCREMENTAL=0 $(CARGO) rustc $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS)
  124. ./renamesyms.sh $@ $(BUILD)/debug/deps/
  125. touch $@
  126. $(BUILD)/debug/crt0.o: $(SRC)
  127. CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
  128. touch $@
  129. $(BUILD)/debug/crti.o: $(SRC)
  130. CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
  131. touch $@
  132. $(BUILD)/debug/crtn.o: $(SRC)
  133. CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
  134. touch $@
  135. $(BUILD)/debug/ld_so.o: $(SRC)
  136. CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
  137. touch $@
  138. $(BUILD)/debug/ld_so: $(BUILD)/debug/ld_so.o $(BUILD)/debug/crti.o $(BUILD)/debug/libc.a $(BUILD)/debug/crtn.o
  139. $(LD) --no-relax -T src/ld_so/ld_script/$(TARGET).ld --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@
  140. # Release targets
  141. $(BUILD)/release/libc.a: $(BUILD)/release/libdrsstd.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
  142. echo "create $@" > "$@.mri"
  143. for lib in $^; do\
  144. echo "addlib $$lib" >> "$@.mri"; \
  145. done
  146. echo "save" >> "$@.mri"
  147. echo "end" >> "$@.mri"
  148. $(AR) -M < "$@.mri"
  149. $(BUILD)/release/libc.so: $(BUILD)/release/libdrsstd.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
  150. $(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -Wl,-soname,libc.so.6 -o $@
  151. $(BUILD)/release/libdrsstd.a: $(SRC)
  152. CARGO_INCREMENTAL=0 $(CARGO) rustc --release $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS)
  153. # TODO: Better to only allow a certain whitelisted set of symbols? Perhaps
  154. # use some cbindgen hook, specify them manually, or grep for #[no_mangle].
  155. ./renamesyms.sh $@ $(BUILD)/release/deps/
  156. touch $@
  157. $(BUILD)/release/crt0.o: $(SRC)
  158. CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
  159. touch $@
  160. $(BUILD)/release/crti.o: $(SRC)
  161. CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
  162. touch $@
  163. $(BUILD)/release/crtn.o: $(SRC)
  164. CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
  165. touch $@
  166. $(BUILD)/release/ld_so.o: $(SRC)
  167. CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
  168. touch $@
  169. $(BUILD)/release/ld_so: $(BUILD)/release/ld_so.o $(BUILD)/release/crti.o $(BUILD)/release/libc.a $(BUILD)/release/crtn.o
  170. $(LD) --no-relax -T src/ld_so/ld_script/$(TARGET).ld --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@
  171. # Other targets
  172. $(BUILD)/openlibm: openlibm
  173. rm -rf $@ $@.partial
  174. mkdir -p $(BUILD)
  175. cp -r $< $@.partial
  176. mv $@.partial $@
  177. touch $@
  178. $(BUILD)/openlibm/libopenlibm.a: $(BUILD)/openlibm $(BUILD)/release/libdrsstd.a
  179. $(MAKE) AR=$(AR) CC=$(CC) LD=$(LD) CPPFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libopenlibm.a
  180. $(BUILD)/pthreads-emb: pthreads-emb
  181. rm -rf $@ $@.partial
  182. mkdir -p $(BUILD)
  183. cp -r $< $@.partial
  184. mv $@.partial $@
  185. touch $@
  186. $(BUILD)/pthreads-emb/libpthread.a: $(BUILD)/pthreads-emb $(BUILD)/release/libdrsstd.a
  187. $(MAKE) AR=$(AR) CC=$(CC) LD=$(LD) CFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libpthread.a