1# TARGET?=$(shell rustc -Z unstable-options --print target-spec-json | grep llvm-target | cut -d '"' -f4) 2TARGET=x86_64-unknown-dragonos 3 4CARGO?=cargo 5CARGO_TEST?=$(CARGO) 6CARGO_COMMON_FLAGS=-Z build-std=core,alloc,compiler_builtins 7CARGOFLAGS?=$(CARGO_COMMON_FLAGS) 8RUSTCFLAGS?= 9export OBJCOPY?=objcopy 10 11BUILD="target/$(TARGET)" 12CARGOFLAGS+="--target=$(TARGET)" 13 14ifeq ($(TARGET),aarch64-unknown-linux-gnu) 15 export CC=aarch64-linux-gnu-gcc 16 export LD=aarch64-linux-gnu-ld 17 export AR=aarch64-linux-gnu-ar 18 export OBJCOPY=aarch64-linux-gnu-objcopy 19endif 20 21ifeq ($(TARGET),aarch64-unknown-redox) 22 export CC=aarch64-unknown-redox-gcc 23 export LD=aarch64-unknown-redox-ld 24 export AR=aarch64-unknown-redox-ar 25 export OBJCOPY=aarch64-unknown-redox-objcopy 26endif 27 28ifeq ($(TARGET),x86_64-unknown-linux-gnu) 29 export CC=x86_64-linux-gnu-gcc 30 export LD=x86_64-linux-gnu-ld 31 export AR=x86_64-linux-gnu-ar 32 export OBJCOPY=x86_64-linux-gnu-objcopy 33endif 34 35ifeq ($(TARGET),i686-unknown-redox) 36 export CC=i686-unknown-redox-gcc 37 export LD=i686-unknown-redox-ld 38 export AR=i686-unknown-redox-ar 39 export OBJCOPY=i686-unknown-redox-objcopy 40endif 41 42ifeq ($(TARGET),x86_64-unknown-redox) 43 export CC=x86_64-unknown-redox-gcc 44 export LD=x86_64-unknown-redox-ld 45 export AR=x86_64-unknown-redox-ar 46 export OBJCOPY=x86_64-unknown-redox-objcopy 47endif 48 49ifeq ($(TARGET),x86_64-unknown-dragonos) 50# 如果存在x86_64-dragonos-gcc,就用它,否则用gcc 51 52ifeq ($(shell which x86_64-dragonos-gcc),) 53 export CC=gcc 54# export LD=ld 55 export LD=ld 56 export AR=ar 57# export AR=x86_64-dragonos-ar 58 export OBJCOPY=objcopy 59# export OBJCOPY=x86_64-dragonos-objcopy 60else 61 export CC=x86_64-dragonos-gcc 62 export LD=x86_64-dragonos-ld 63 export AR=x86_64-dragonos-ar 64 export OBJCOPY=x86_64-dragonos-objcopy 65endif 66endif 67 68SRC=\ 69 Cargo.* \ 70 $(shell find src -type f) 71 72BUILTINS_VERSION=0.1.70 73 74.PHONY: all clean fmt install install-headers libs submodules test 75 76all: | libs 77 78clean: 79 $(CARGO) clean 80 $(MAKE) -C tests clean 81 rm -rf sysroot 82 83check: 84 $(CARGO) check 85 86fmt: 87 ./fmt.sh 88 89install-headers: libs 90 mkdir -pv "$(DESTDIR)/include" 91 cp -rv "include"/* "$(DESTDIR)/include" 92 cp -rv "target/include"/* "$(DESTDIR)/include" 93 cp -v "openlibm/include"/*.h "$(DESTDIR)/include" 94 cp -v "openlibm/src"/*.h "$(DESTDIR)/include" 95 cp -v "pthreads-emb/"*.h "$(DESTDIR)/include" 96 97# $(BUILD)/release/libc.so 98libs: \ 99 $(BUILD)/release/libc.a \ 100 $(BUILD)/release/crt0.o \ 101 $(BUILD)/release/crti.o \ 102 $(BUILD)/release/crtn.o 103#$(BUILD)/release/ld_so 104 105install-libs: libs 106 mkdir -pv "$(DESTDIR)/lib" 107 cp -v "$(BUILD)/release/libc.a" "$(DESTDIR)/lib" 108# cp -v "$(BUILD)/release/libc.so" "$(DESTDIR)/lib" 109# ln -frsv "$(DESTDIR)/lib/libc.so" "$(DESTDIR)/lib/libc.so.6" 110 cp -v "$(BUILD)/release/crt0.o" "$(DESTDIR)/lib" 111 ln -frsv "$(DESTDIR)/lib/crt0.o" "$(DESTDIR)/lib/crt1.o" 112 cp -v "$(BUILD)/release/crti.o" "$(DESTDIR)/lib" 113 cp -v "$(BUILD)/release/crtn.o" "$(DESTDIR)/lib" 114# cp -v "$(BUILD)/release/ld_so" "$(DESTDIR)/lib/ld64.so.1" 115 cp -v "$(BUILD)/openlibm/libopenlibm.a" "$(DESTDIR)/lib/libm.a" 116 cp -v "$(BUILD)/pthreads-emb/libpthread.a" "$(DESTDIR)/lib/libpthread.a" 117 # Empty libraries for dl and rt 118 $(AR) -rcs "$(DESTDIR)/lib/libdl.a" 119 $(AR) -rcs "$(DESTDIR)/lib/librt.a" 120 121install: install-headers install-libs 122 123submodules: 124 git submodule sync 125 git submodule update --init --recursive 126 127sysroot: all 128 rm -rf $@ 129 rm -rf $@.partial 130 mkdir -p $@.partial 131 $(MAKE) install DESTDIR=$@.partial 132 mv $@.partial $@ 133 touch $@ 134 135test: sysroot 136 # TODO: Fix SIGILL when running cargo test 137 # $(CARGO_TEST) test 138 $(MAKE) -C tests verify 139 140# Debug targets 141 142$(BUILD)/debug/libc.a: $(BUILD)/debug/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 143 echo "create $@" > "$@.mri" 144 for lib in $^; do\ 145 echo "addlib $$lib" >> "$@.mri"; \ 146 done 147 echo "save" >> "$@.mri" 148 echo "end" >> "$@.mri" 149 $(AR) -M < "$@.mri" 150 151$(BUILD)/debug/libc.so: $(BUILD)/debug/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 152 $(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -Wl,-soname,libc.so.6 -o $@ 153 154$(BUILD)/debug/librelibc.a: $(SRC) 155 CARGO_INCREMENTAL=0 $(CARGO) rustc $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS) 156 ./renamesyms.sh $@ $(BUILD)/debug/deps/ 157 touch $@ 158 159$(BUILD)/debug/crt0.o: $(SRC) 160 CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 161 touch $@ 162 163$(BUILD)/debug/crti.o: $(SRC) 164 CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 165 touch $@ 166 167$(BUILD)/debug/crtn.o: $(SRC) 168 CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 169 touch $@ 170 171$(BUILD)/debug/ld_so.o: $(SRC) 172 CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 173 touch $@ 174 175$(BUILD)/debug/ld_so: $(BUILD)/debug/ld_so.o $(BUILD)/debug/crti.o $(BUILD)/debug/libc.a $(BUILD)/debug/crtn.o 176 $(LD) --no-relax -T src/ld_so/ld_script/$(TARGET).ld --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@ 177 178# Release targets 179 180$(BUILD)/release/libc.a: $(BUILD)/release/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 181 echo "create $@" > "$@.mri" 182 for lib in $^; do\ 183 echo "addlib $$lib" >> "$@.mri"; \ 184 done 185 echo "save" >> "$@.mri" 186 echo "end" >> "$@.mri" 187 $(AR) -M < "$@.mri" 188 189$(BUILD)/release/libc.so: $(BUILD)/release/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 190 $(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -Wl,-soname,libc.so.6 -o $@ 191 192$(BUILD)/release/librelibc.a: $(SRC) 193 CARGO_INCREMENTAL=0 $(CARGO) rustc --release $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS) 194 # TODO: Better to only allow a certain whitelisted set of symbols? Perhaps 195 # use some cbindgen hook, specify them manually, or grep for #[no_mangle]. 196 ./renamesyms.sh $@ $(BUILD)/release/deps/ 197 touch $@ 198 199$(BUILD)/release/crt0.o: $(SRC) 200 CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 201 touch $@ 202 203$(BUILD)/release/crti.o: $(SRC) 204 CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 205 touch $@ 206 207$(BUILD)/release/crtn.o: $(SRC) 208 CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 209 touch $@ 210 211$(BUILD)/release/ld_so.o: $(SRC) 212 CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 213 touch $@ 214 215$(BUILD)/release/ld_so: $(BUILD)/release/ld_so.o $(BUILD)/release/crti.o $(BUILD)/release/libc.a $(BUILD)/release/crtn.o 216 $(LD) --no-relax -T src/ld_so/ld_script/$(TARGET).ld --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@ 217 218# Other targets 219 220$(BUILD)/openlibm: openlibm 221 rm -rf $@ $@.partial 222 mkdir -p $(BUILD) 223 cp -r $< $@.partial 224 mv $@.partial $@ 225 touch $@ 226 227$(BUILD)/openlibm/libopenlibm.a: $(BUILD)/openlibm $(BUILD)/release/librelibc.a 228 $(MAKE) AR=$(AR) CC=$(CC) LD=$(LD) CPPFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libopenlibm.a 229 230$(BUILD)/pthreads-emb: pthreads-emb 231 rm -rf $@ $@.partial 232 mkdir -p $(BUILD) 233 cp -r $< $@.partial 234 mv $@.partial $@ 235 touch $@ 236 237$(BUILD)/pthreads-emb/libpthread.a: $(BUILD)/pthreads-emb $(BUILD)/release/librelibc.a 238 $(MAKE) AR=$(AR) CC=$(CC) LD=$(LD) CFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libpthread.a 239