Makefile 6.6 KB

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