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