1TARGET?=$(shell rustc -Z unstable-options --print target-spec-json | grep llvm-target | cut -d '"' -f4) 2 3CARGO?=cargo 4CARGO_TEST?=$(CARGO) 5CARGO_COMMON_FLAGS=-Z build-std=core,alloc,compiler_builtins 6CARGOFLAGS?=$(CARGO_COMMON_FLAGS) 7RUSTCFLAGS?= 8export OBJCOPY?=objcopy 9 10BUILD="target/$(TARGET)" 11CARGOFLAGS+="--target=$(TARGET)" 12 13ifeq ($(TARGET),aarch64-unknown-linux-gnu) 14 export CC=aarch64-linux-gnu-gcc 15 export LD=aarch64-linux-gnu-ld 16 export AR=aarch64-linux-gnu-ar 17 export OBJCOPY=aarch64-linux-gnu-objcopy 18endif 19 20ifeq ($(TARGET),aarch64-unknown-redox) 21 export CC=aarch64-unknown-redox-gcc 22 export LD=aarch64-unknown-redox-ld 23 export AR=aarch64-unknown-redox-ar 24 export OBJCOPY=aarch64-unknown-redox-objcopy 25endif 26 27ifeq ($(TARGET),x86_64-unknown-linux-gnu) 28 export CC=x86_64-linux-gnu-gcc 29 export LD=x86_64-linux-gnu-ld 30 export AR=x86_64-linux-gnu-ar 31 export OBJCOPY=x86_64-linux-gnu-objcopy 32endif 33 34ifeq ($(TARGET),i686-unknown-redox) 35 export CC=i686-unknown-redox-gcc 36 export LD=i686-unknown-redox-ld 37 export AR=i686-unknown-redox-ar 38 export OBJCOPY=i686-unknown-redox-objcopy 39endif 40 41ifeq ($(TARGET),x86_64-unknown-redox) 42 export CC=x86_64-unknown-redox-gcc 43 export LD=x86_64-unknown-redox-ld 44 export AR=x86_64-unknown-redox-ar 45 export OBJCOPY=x86_64-unknown-redox-objcopy 46endif 47 48SRC=\ 49 Cargo.* \ 50 $(shell find src -type f) 51 52BUILTINS_VERSION=0.1.70 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 ln -frsv "$(DESTDIR)/lib/crt0.o" "$(DESTDIR)/lib/crt1.o" 92 cp -v "$(BUILD)/release/crti.o" "$(DESTDIR)/lib" 93 cp -v "$(BUILD)/release/crtn.o" "$(DESTDIR)/lib" 94 cp -v "$(BUILD)/release/ld_so" "$(DESTDIR)/lib/ld64.so.1" 95 cp -v "$(BUILD)/openlibm/libopenlibm.a" "$(DESTDIR)/lib/libm.a" 96 cp -v "$(BUILD)/pthreads-emb/libpthread.a" "$(DESTDIR)/lib/libpthread.a" 97 98install: install-headers install-libs 99 100submodules: 101 git submodule sync 102 git submodule update --init --recursive 103 104sysroot: all 105 rm -rf $@ 106 rm -rf $@.partial 107 mkdir -p $@.partial 108 $(MAKE) install DESTDIR=$@.partial 109 mv $@.partial $@ 110 touch $@ 111 112test: sysroot 113 # TODO: Fix SIGILL when running cargo test 114 # $(CARGO_TEST) test 115 $(MAKE) -C tests verify 116 117# Debug targets 118 119$(BUILD)/debug/libc.a: $(BUILD)/debug/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 120 echo "create $@" > "$@.mri" 121 for lib in $^; do\ 122 echo "addlib $$lib" >> "$@.mri"; \ 123 done 124 echo "save" >> "$@.mri" 125 echo "end" >> "$@.mri" 126 $(AR) -M < "$@.mri" 127 128$(BUILD)/debug/libc.so: $(BUILD)/debug/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 129 $(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -Wl,-soname,libc.so.6 -o $@ 130 131$(BUILD)/debug/librelibc.a: $(SRC) 132 CARGO_INCREMENTAL=0 $(CARGO) rustc $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS) 133 ./renamesyms.sh $@ $(BUILD)/debug/deps/ 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/$(TARGET).ld --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 # TODO: Better to only allow a certain whitelisted set of symbols? Perhaps 172 # use some cbindgen hook, specify them manually, or grep for #[no_mangle]. 173 ./renamesyms.sh $@ $(BUILD)/release/deps/ 174 touch $@ 175 176$(BUILD)/release/crt0.o: $(SRC) 177 CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 178 touch $@ 179 180$(BUILD)/release/crti.o: $(SRC) 181 CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 182 touch $@ 183 184$(BUILD)/release/crtn.o: $(SRC) 185 CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 186 touch $@ 187 188$(BUILD)/release/ld_so.o: $(SRC) 189 CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 190 touch $@ 191 192$(BUILD)/release/ld_so: $(BUILD)/release/ld_so.o $(BUILD)/release/crti.o $(BUILD)/release/libc.a $(BUILD)/release/crtn.o 193 $(LD) --no-relax -T src/ld_so/ld_script/$(TARGET).ld --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@ 194 195# Other targets 196 197$(BUILD)/openlibm: openlibm 198 rm -rf $@ $@.partial 199 mkdir -p $(BUILD) 200 cp -r $< $@.partial 201 mv $@.partial $@ 202 touch $@ 203 204$(BUILD)/openlibm/libopenlibm.a: $(BUILD)/openlibm $(BUILD)/release/librelibc.a 205 $(MAKE) AR=$(AR) CC=$(CC) LD=$(LD) CPPFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libopenlibm.a 206 207$(BUILD)/pthreads-emb: pthreads-emb 208 rm -rf $@ $@.partial 209 mkdir -p $(BUILD) 210 cp -r $< $@.partial 211 mv $@.partial $@ 212 touch $@ 213 214$(BUILD)/pthreads-emb/libpthread.a: $(BUILD)/pthreads-emb $(BUILD)/release/librelibc.a 215 $(MAKE) AR=$(AR) CC=$(CC) LD=$(LD) CFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libpthread.a 216