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 -W __rust_alloc \ 57 -W __rust_alloc_zeroed \ 58 -W __rust_dealloc \ 59 -W __rust_realloc \ 60 -W __rdl_oom \ 61 -W __rg_oom 62 63.PHONY: all clean fmt install install-headers libs submodules test 64 65all: | libs 66 67clean: 68 $(CARGO) clean 69 $(MAKE) -C tests clean 70 rm -rf sysroot 71 72check: 73 $(CARGO) check 74 75fmt: 76 ./fmt.sh 77 78install-headers: libs 79 mkdir -pv "$(DESTDIR)/include" 80 cp -rv "include"/* "$(DESTDIR)/include" 81 cp -rv "target/include"/* "$(DESTDIR)/include" 82 cp -v "openlibm/include"/*.h "$(DESTDIR)/include" 83 cp -v "openlibm/src"/*.h "$(DESTDIR)/include" 84 cp -v "pthreads-emb/"*.h "$(DESTDIR)/include" 85 86libs: \ 87 $(BUILD)/release/libc.a \ 88 $(BUILD)/release/libc.so \ 89 $(BUILD)/release/crt0.o \ 90 $(BUILD)/release/crti.o \ 91 $(BUILD)/release/crtn.o \ 92 $(BUILD)/release/ld_so 93 94install-libs: libs 95 mkdir -pv "$(DESTDIR)/lib" 96 cp -v "$(BUILD)/release/libc.a" "$(DESTDIR)/lib" 97 cp -v "$(BUILD)/release/libc.so" "$(DESTDIR)/lib" 98 ln -frsv "$(DESTDIR)/lib/libc.so" "$(DESTDIR)/lib/libc.so.6" 99 cp -v "$(BUILD)/release/crt0.o" "$(DESTDIR)/lib" 100 ln -frsv "$(DESTDIR)/lib/crt0.o" "$(DESTDIR)/lib/crt1.o" 101 cp -v "$(BUILD)/release/crti.o" "$(DESTDIR)/lib" 102 cp -v "$(BUILD)/release/crtn.o" "$(DESTDIR)/lib" 103 cp -v "$(BUILD)/release/ld_so" "$(DESTDIR)/lib/ld64.so.1" 104 cp -v "$(BUILD)/openlibm/libopenlibm.a" "$(DESTDIR)/lib/libm.a" 105 cp -v "$(BUILD)/pthreads-emb/libpthread.a" "$(DESTDIR)/lib/libpthread.a" 106 107install: install-headers install-libs 108 109submodules: 110 git submodule sync 111 git submodule update --init --recursive 112 113sysroot: all 114 rm -rf $@ 115 rm -rf $@.partial 116 mkdir -p $@.partial 117 $(MAKE) install DESTDIR=$@.partial 118 mv $@.partial $@ 119 touch $@ 120 121test: sysroot 122 # TODO: Fix SIGILL when running cargo test 123 # $(CARGO_TEST) test 124 $(MAKE) -C tests verify 125 126# Debug targets 127 128$(BUILD)/debug/libc.a: $(BUILD)/debug/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 129 echo "create $@" > "$@.mri" 130 for lib in $^; do\ 131 echo "addlib $$lib" >> "$@.mri"; \ 132 done 133 echo "save" >> "$@.mri" 134 echo "end" >> "$@.mri" 135 $(AR) -M < "$@.mri" 136 137$(BUILD)/debug/libc.so: $(BUILD)/debug/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 138 $(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -Wl,-soname,libc.so.6 -o $@ 139 140$(BUILD)/debug/librelibc.a: $(SRC) 141 CARGO_INCREMENTAL=0 $(CARGO) rustc $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS) 142 # 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. 143 $(OBJCOPY) $@ $(WEAKEN_SYMBOLS) 144 touch $@ 145 146$(BUILD)/debug/crt0.o: $(SRC) 147 CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 148 touch $@ 149 150$(BUILD)/debug/crti.o: $(SRC) 151 CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 152 touch $@ 153 154$(BUILD)/debug/crtn.o: $(SRC) 155 CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 156 touch $@ 157 158$(BUILD)/debug/ld_so.o: $(SRC) 159 CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 160 touch $@ 161 162$(BUILD)/debug/ld_so: $(BUILD)/debug/ld_so.o $(BUILD)/debug/crti.o $(BUILD)/debug/libc.a $(BUILD)/debug/crtn.o 163 $(LD) --no-relax -T src/ld_so/ld_script/$(TARGET).ld --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@ 164 165# Release targets 166 167$(BUILD)/release/libc.a: $(BUILD)/release/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 168 echo "create $@" > "$@.mri" 169 for lib in $^; do\ 170 echo "addlib $$lib" >> "$@.mri"; \ 171 done 172 echo "save" >> "$@.mri" 173 echo "end" >> "$@.mri" 174 $(AR) -M < "$@.mri" 175 176$(BUILD)/release/libc.so: $(BUILD)/release/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 177 $(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -Wl,-soname,libc.so.6 -o $@ 178 179$(BUILD)/release/librelibc.a: $(SRC) 180 CARGO_INCREMENTAL=0 $(CARGO) rustc --release $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS) 181 $(OBJCOPY) $@ $(WEAKEN_SYMBOLS) 182 touch $@ 183 184$(BUILD)/release/crt0.o: $(SRC) 185 CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 186 touch $@ 187 188$(BUILD)/release/crti.o: $(SRC) 189 CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 190 touch $@ 191 192$(BUILD)/release/crtn.o: $(SRC) 193 CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 194 touch $@ 195 196$(BUILD)/release/ld_so.o: $(SRC) 197 CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 198 touch $@ 199 200$(BUILD)/release/ld_so: $(BUILD)/release/ld_so.o $(BUILD)/release/crti.o $(BUILD)/release/libc.a $(BUILD)/release/crtn.o 201 $(LD) --no-relax -T src/ld_so/ld_script/$(TARGET).ld --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@ 202 203# Other targets 204 205$(BUILD)/openlibm: openlibm 206 rm -rf $@ $@.partial 207 mkdir -p $(BUILD) 208 cp -r $< $@.partial 209 mv $@.partial $@ 210 touch $@ 211 212$(BUILD)/openlibm/libopenlibm.a: $(BUILD)/openlibm $(BUILD)/release/librelibc.a 213 $(MAKE) AR=$(AR) CC=$(CC) LD=$(LD) CPPFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libopenlibm.a 214 215$(BUILD)/pthreads-emb: pthreads-emb 216 rm -rf $@ $@.partial 217 mkdir -p $(BUILD) 218 cp -r $< $@.partial 219 mv $@.partial $@ 220 touch $@ 221 222$(BUILD)/pthreads-emb/libpthread.a: $(BUILD)/pthreads-emb $(BUILD)/release/librelibc.a 223 $(MAKE) AR=$(AR) CC=$(CC) LD=$(LD) CFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libpthread.a 224