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