2
0

Makefile 7.0 KB

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