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