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 submodules 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 99submodules: 100 git submodule sync 101 git submodule update --init --recursive 102 103sysroot: all 104 rm -rf $@ 105 rm -rf $@.partial 106 mkdir -p $@.partial 107 $(MAKE) install DESTDIR=$@.partial 108 mv $@.partial $@ 109 touch $@ 110 111test: sysroot 112 # TODO: Fix SIGILL when running cargo test 113 # $(CARGO_TEST) test 114 $(MAKE) -C tests verify 115 116# Debug targets 117 118$(BUILD)/debug/libc.a: $(BUILD)/debug/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 119 echo "create $@" > "$@.mri" 120 for lib in $^; do\ 121 echo "addlib $$lib" >> "$@.mri"; \ 122 done 123 echo "save" >> "$@.mri" 124 echo "end" >> "$@.mri" 125 $(AR) -M < "$@.mri" 126 127$(BUILD)/debug/libc.so: $(BUILD)/debug/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 128 $(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -Wl,-soname,libc.so.6 -o $@ 129 130$(BUILD)/debug/librelibc.a: $(SRC) 131 CARGO_INCREMENTAL=0 $(CARGO) rustc $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS) 132 # 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. 133 $(OBJCOPY) $@ $(WEAKEN_SYMBOLS) 134 touch $@ 135 136$(BUILD)/debug/crt0.o: $(SRC) 137 CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 138 touch $@ 139 140$(BUILD)/debug/crti.o: $(SRC) 141 CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 142 touch $@ 143 144$(BUILD)/debug/crtn.o: $(SRC) 145 CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 146 touch $@ 147 148$(BUILD)/debug/ld_so.o: $(SRC) 149 CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 150 touch $@ 151 152$(BUILD)/debug/ld_so: $(BUILD)/debug/ld_so.o $(BUILD)/debug/crti.o $(BUILD)/debug/libc.a $(BUILD)/debug/crtn.o 153 $(LD) --no-relax -T src/ld_so/ld_script --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@ 154 155# Release targets 156 157$(BUILD)/release/libc.a: $(BUILD)/release/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 158 echo "create $@" > "$@.mri" 159 for lib in $^; do\ 160 echo "addlib $$lib" >> "$@.mri"; \ 161 done 162 echo "save" >> "$@.mri" 163 echo "end" >> "$@.mri" 164 $(AR) -M < "$@.mri" 165 166$(BUILD)/release/libc.so: $(BUILD)/release/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 167 $(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -Wl,-soname,libc.so.6 -o $@ 168 169$(BUILD)/release/librelibc.a: $(SRC) 170 CARGO_INCREMENTAL=0 $(CARGO) rustc --release $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS) 171 $(OBJCOPY) $@ $(WEAKEN_SYMBOLS) 172 touch $@ 173 174$(BUILD)/release/crt0.o: $(SRC) 175 CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 176 touch $@ 177 178$(BUILD)/release/crti.o: $(SRC) 179 CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 180 touch $@ 181 182$(BUILD)/release/crtn.o: $(SRC) 183 CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 184 touch $@ 185 186$(BUILD)/release/ld_so.o: $(SRC) 187 CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 188 touch $@ 189 190$(BUILD)/release/ld_so: $(BUILD)/release/ld_so.o $(BUILD)/release/crti.o $(BUILD)/release/libc.a $(BUILD)/release/crtn.o 191 $(LD) --no-relax -T src/ld_so/ld_script --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@ 192 193# Other targets 194 195$(BUILD)/openlibm: openlibm 196 rm -rf $@ $@.partial 197 mkdir -p $(BUILD) 198 cp -r $< $@.partial 199 mv $@.partial $@ 200 touch $@ 201 202$(BUILD)/openlibm/libopenlibm.a: $(BUILD)/openlibm $(BUILD)/release/librelibc.a 203 $(MAKE) CC=$(CC) CPPFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libopenlibm.a 204 205$(BUILD)/pthreads-emb: pthreads-emb 206 rm -rf $@ $@.partial 207 mkdir -p $(BUILD) 208 cp -r $< $@.partial 209 mv $@.partial $@ 210 touch $@ 211 212$(BUILD)/pthreads-emb/libpthread.a: $(BUILD)/pthreads-emb $(BUILD)/release/librelibc.a 213 $(MAKE) CC=$(CC) CFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libpthread.a 214