1507ea70eSGnoCiYeH# TARGET?=$(shell rustc -Z unstable-options --print target-spec-json | grep llvm-target | cut -d '"' -f4) 272331e9dSLoGinexport RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static 372331e9dSLoGinexport RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup 472331e9dSLoGin 5507ea70eSGnoCiYeHTARGET=x86_64-unknown-dragonos 6507ea70eSGnoCiYeH 7507ea70eSGnoCiYeHCARGO?=cargo 8507ea70eSGnoCiYeHCARGO_TEST?=$(CARGO) 9507ea70eSGnoCiYeHCARGO_COMMON_FLAGS=-Z build-std=core,alloc,compiler_builtins 10507ea70eSGnoCiYeHCARGOFLAGS?=$(CARGO_COMMON_FLAGS) 11507ea70eSGnoCiYeHRUSTCFLAGS?= 12507ea70eSGnoCiYeHexport OBJCOPY?=objcopy 13507ea70eSGnoCiYeH 14507ea70eSGnoCiYeHBUILD="target/$(TARGET)" 15507ea70eSGnoCiYeHCARGOFLAGS+="--target=$(TARGET)" 16507ea70eSGnoCiYeH 17507ea70eSGnoCiYeHifeq ($(TARGET),aarch64-unknown-linux-gnu) 18507ea70eSGnoCiYeH export CC=aarch64-linux-gnu-gcc 19507ea70eSGnoCiYeH export LD=aarch64-linux-gnu-ld 20507ea70eSGnoCiYeH export AR=aarch64-linux-gnu-ar 21507ea70eSGnoCiYeH export OBJCOPY=aarch64-linux-gnu-objcopy 22507ea70eSGnoCiYeHendif 23507ea70eSGnoCiYeH 24507ea70eSGnoCiYeHifeq ($(TARGET),aarch64-unknown-redox) 25507ea70eSGnoCiYeH export CC=aarch64-unknown-redox-gcc 26507ea70eSGnoCiYeH export LD=aarch64-unknown-redox-ld 27507ea70eSGnoCiYeH export AR=aarch64-unknown-redox-ar 28507ea70eSGnoCiYeH export OBJCOPY=aarch64-unknown-redox-objcopy 29507ea70eSGnoCiYeHendif 30507ea70eSGnoCiYeH 31507ea70eSGnoCiYeHifeq ($(TARGET),x86_64-unknown-linux-gnu) 32507ea70eSGnoCiYeH export CC=x86_64-linux-gnu-gcc 33507ea70eSGnoCiYeH export LD=x86_64-linux-gnu-ld 34507ea70eSGnoCiYeH export AR=x86_64-linux-gnu-ar 35507ea70eSGnoCiYeH export OBJCOPY=x86_64-linux-gnu-objcopy 36507ea70eSGnoCiYeHendif 37507ea70eSGnoCiYeH 38507ea70eSGnoCiYeHifeq ($(TARGET),i686-unknown-redox) 39507ea70eSGnoCiYeH export CC=i686-unknown-redox-gcc 40507ea70eSGnoCiYeH export LD=i686-unknown-redox-ld 41507ea70eSGnoCiYeH export AR=i686-unknown-redox-ar 42507ea70eSGnoCiYeH export OBJCOPY=i686-unknown-redox-objcopy 43507ea70eSGnoCiYeHendif 44507ea70eSGnoCiYeH 45507ea70eSGnoCiYeHifeq ($(TARGET),x86_64-unknown-redox) 46507ea70eSGnoCiYeH export CC=x86_64-unknown-redox-gcc 47507ea70eSGnoCiYeH export LD=x86_64-unknown-redox-ld 48507ea70eSGnoCiYeH export AR=x86_64-unknown-redox-ar 49507ea70eSGnoCiYeH export OBJCOPY=x86_64-unknown-redox-objcopy 50507ea70eSGnoCiYeHendif 51507ea70eSGnoCiYeH 52507ea70eSGnoCiYeHifeq ($(TARGET),x86_64-unknown-dragonos) 53507ea70eSGnoCiYeH# 如果存在x86_64-dragonos-gcc,就用它,否则用gcc 54507ea70eSGnoCiYeH 55507ea70eSGnoCiYeHifeq ($(shell which x86_64-dragonos-gcc),) 56507ea70eSGnoCiYeH export CC=gcc 57507ea70eSGnoCiYeH# export LD=ld 58507ea70eSGnoCiYeH export LD=ld 59507ea70eSGnoCiYeH export AR=ar 60507ea70eSGnoCiYeH# export AR=x86_64-dragonos-ar 61507ea70eSGnoCiYeH export OBJCOPY=objcopy 62507ea70eSGnoCiYeH# export OBJCOPY=x86_64-dragonos-objcopy 63507ea70eSGnoCiYeHelse 64507ea70eSGnoCiYeH export CC=x86_64-dragonos-gcc 65507ea70eSGnoCiYeH export LD=x86_64-dragonos-ld 66507ea70eSGnoCiYeH export AR=x86_64-dragonos-ar 67507ea70eSGnoCiYeH export OBJCOPY=x86_64-dragonos-objcopy 68507ea70eSGnoCiYeHendif 69507ea70eSGnoCiYeHendif 70507ea70eSGnoCiYeH 71507ea70eSGnoCiYeHSRC=\ 72507ea70eSGnoCiYeH Cargo.* \ 73507ea70eSGnoCiYeH $(shell find src -type f) 74507ea70eSGnoCiYeH 75507ea70eSGnoCiYeHBUILTINS_VERSION=0.1.70 76507ea70eSGnoCiYeH 77507ea70eSGnoCiYeH.PHONY: all clean fmt install install-headers libs submodules test 78507ea70eSGnoCiYeH 79507ea70eSGnoCiYeHall: | libs 80507ea70eSGnoCiYeH 81507ea70eSGnoCiYeHclean: 82507ea70eSGnoCiYeH $(CARGO) clean 83507ea70eSGnoCiYeH 84507ea70eSGnoCiYeHcheck: 85*a1cd3472SLoGin $(CARGO) -Z build-std=core,alloc,compiler_builtins check --workspace --message-format=json --target target.json 86507ea70eSGnoCiYeH 87507ea70eSGnoCiYeHfmt: 880fe3ff00SLoGin $(CARGO) fmt 89507ea70eSGnoCiYeH 900fe3ff00SLoGinfmt-check: 910fe3ff00SLoGin $(CARGO) fmt --check 92507ea70eSGnoCiYeHinstall-headers: libs 93507ea70eSGnoCiYeH mkdir -pv "$(DESTDIR)/include" 94507ea70eSGnoCiYeH cp -rv "include"/* "$(DESTDIR)/include" 95507ea70eSGnoCiYeH cp -rv "target/include"/* "$(DESTDIR)/include" 96507ea70eSGnoCiYeH cp -v "openlibm/include"/*.h "$(DESTDIR)/include" 97507ea70eSGnoCiYeH cp -v "openlibm/src"/*.h "$(DESTDIR)/include" 98507ea70eSGnoCiYeH cp -v "pthreads-emb/"*.h "$(DESTDIR)/include" 99507ea70eSGnoCiYeH 100507ea70eSGnoCiYeH# $(BUILD)/release/libc.so 101507ea70eSGnoCiYeHlibs: 102b38c7942SLoGin @cargo -Z build-std=core,alloc,compiler_builtins build --target target.json --release 103507ea70eSGnoCiYeH#$(BUILD)/release/ld_so 104507ea70eSGnoCiYeH 105507ea70eSGnoCiYeHinstall-libs: libs 106507ea70eSGnoCiYeH mkdir -pv "$(DESTDIR)/lib" 107507ea70eSGnoCiYeH cp -v "$(BUILD)/release/libc.a" "$(DESTDIR)/lib" 108507ea70eSGnoCiYeH# cp -v "$(BUILD)/release/libc.so" "$(DESTDIR)/lib" 109507ea70eSGnoCiYeH# ln -frsv "$(DESTDIR)/lib/libc.so" "$(DESTDIR)/lib/libc.so.6" 110507ea70eSGnoCiYeH cp -v "$(BUILD)/release/crt0.o" "$(DESTDIR)/lib" 111507ea70eSGnoCiYeH ln -frsv "$(DESTDIR)/lib/crt0.o" "$(DESTDIR)/lib/crt1.o" 112507ea70eSGnoCiYeH cp -v "$(BUILD)/release/crti.o" "$(DESTDIR)/lib" 113507ea70eSGnoCiYeH cp -v "$(BUILD)/release/crtn.o" "$(DESTDIR)/lib" 114507ea70eSGnoCiYeH# cp -v "$(BUILD)/release/ld_so" "$(DESTDIR)/lib/ld64.so.1" 115507ea70eSGnoCiYeH cp -v "$(BUILD)/openlibm/libopenlibm.a" "$(DESTDIR)/lib/libm.a" 116507ea70eSGnoCiYeH cp -v "$(BUILD)/pthreads-emb/libpthread.a" "$(DESTDIR)/lib/libpthread.a" 117507ea70eSGnoCiYeH # Empty libraries for dl and rt 118507ea70eSGnoCiYeH $(AR) -rcs "$(DESTDIR)/lib/libdl.a" 119507ea70eSGnoCiYeH $(AR) -rcs "$(DESTDIR)/lib/librt.a" 120507ea70eSGnoCiYeH 121507ea70eSGnoCiYeHinstall: install-headers install-libs 122507ea70eSGnoCiYeH 123507ea70eSGnoCiYeHsubmodules: 124507ea70eSGnoCiYeH git submodule sync 125507ea70eSGnoCiYeH git submodule update --init --recursive 126507ea70eSGnoCiYeH 127507ea70eSGnoCiYeHsysroot: all 128507ea70eSGnoCiYeH rm -rf $@ 129507ea70eSGnoCiYeH rm -rf $@.partial 130507ea70eSGnoCiYeH mkdir -p $@.partial 131507ea70eSGnoCiYeH $(MAKE) install DESTDIR=$@.partial 132507ea70eSGnoCiYeH mv $@.partial $@ 133507ea70eSGnoCiYeH touch $@ 134507ea70eSGnoCiYeH 135507ea70eSGnoCiYeHtest: sysroot 136507ea70eSGnoCiYeH # TODO: Fix SIGILL when running cargo test 137507ea70eSGnoCiYeH # $(CARGO_TEST) test 138507ea70eSGnoCiYeH $(MAKE) -C tests verify 139507ea70eSGnoCiYeH 140507ea70eSGnoCiYeH# Debug targets 141507ea70eSGnoCiYeH 142507ea70eSGnoCiYeH$(BUILD)/debug/libc.a: $(BUILD)/debug/libdrsstd.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 143507ea70eSGnoCiYeH echo "create $@" > "$@.mri" 144507ea70eSGnoCiYeH for lib in $^; do\ 145507ea70eSGnoCiYeH echo "addlib $$lib" >> "$@.mri"; \ 146507ea70eSGnoCiYeH done 147507ea70eSGnoCiYeH echo "save" >> "$@.mri" 148507ea70eSGnoCiYeH echo "end" >> "$@.mri" 149507ea70eSGnoCiYeH $(AR) -M < "$@.mri" 150507ea70eSGnoCiYeH 151507ea70eSGnoCiYeH$(BUILD)/debug/libc.so: $(BUILD)/debug/libdrsstd.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 152507ea70eSGnoCiYeH $(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -Wl,-soname,libc.so.6 -o $@ 153507ea70eSGnoCiYeH 154507ea70eSGnoCiYeH$(BUILD)/debug/libdrsstd.a: $(SRC) 155507ea70eSGnoCiYeH CARGO_INCREMENTAL=0 $(CARGO) rustc $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS) 156507ea70eSGnoCiYeH ./renamesyms.sh $@ $(BUILD)/debug/deps/ 157507ea70eSGnoCiYeH touch $@ 158507ea70eSGnoCiYeH 159507ea70eSGnoCiYeH$(BUILD)/debug/crt0.o: $(SRC) 160507ea70eSGnoCiYeH CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 161507ea70eSGnoCiYeH touch $@ 162507ea70eSGnoCiYeH 163507ea70eSGnoCiYeH$(BUILD)/debug/crti.o: $(SRC) 164507ea70eSGnoCiYeH CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 165507ea70eSGnoCiYeH touch $@ 166507ea70eSGnoCiYeH 167507ea70eSGnoCiYeH$(BUILD)/debug/crtn.o: $(SRC) 168507ea70eSGnoCiYeH CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 169507ea70eSGnoCiYeH touch $@ 170507ea70eSGnoCiYeH 171507ea70eSGnoCiYeH$(BUILD)/debug/ld_so.o: $(SRC) 172507ea70eSGnoCiYeH CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 173507ea70eSGnoCiYeH touch $@ 174507ea70eSGnoCiYeH 175507ea70eSGnoCiYeH$(BUILD)/debug/ld_so: $(BUILD)/debug/ld_so.o $(BUILD)/debug/crti.o $(BUILD)/debug/libc.a $(BUILD)/debug/crtn.o 176507ea70eSGnoCiYeH $(LD) --no-relax -T src/ld_so/ld_script/$(TARGET).ld --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@ 177507ea70eSGnoCiYeH 178507ea70eSGnoCiYeH# Release targets 179507ea70eSGnoCiYeH 180507ea70eSGnoCiYeH$(BUILD)/release/libc.a: $(BUILD)/release/libdrsstd.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 181507ea70eSGnoCiYeH echo "create $@" > "$@.mri" 182507ea70eSGnoCiYeH for lib in $^; do\ 183507ea70eSGnoCiYeH echo "addlib $$lib" >> "$@.mri"; \ 184507ea70eSGnoCiYeH done 185507ea70eSGnoCiYeH echo "save" >> "$@.mri" 186507ea70eSGnoCiYeH echo "end" >> "$@.mri" 187507ea70eSGnoCiYeH $(AR) -M < "$@.mri" 188507ea70eSGnoCiYeH 189507ea70eSGnoCiYeH$(BUILD)/release/libc.so: $(BUILD)/release/libdrsstd.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 190507ea70eSGnoCiYeH $(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -Wl,-soname,libc.so.6 -o $@ 191507ea70eSGnoCiYeH 192507ea70eSGnoCiYeH$(BUILD)/release/libdrsstd.a: $(SRC) 193507ea70eSGnoCiYeH CARGO_INCREMENTAL=0 $(CARGO) rustc --release $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS) 194507ea70eSGnoCiYeH # TODO: Better to only allow a certain whitelisted set of symbols? Perhaps 195507ea70eSGnoCiYeH # use some cbindgen hook, specify them manually, or grep for #[no_mangle]. 196507ea70eSGnoCiYeH ./renamesyms.sh $@ $(BUILD)/release/deps/ 197507ea70eSGnoCiYeH touch $@ 198507ea70eSGnoCiYeH 199507ea70eSGnoCiYeH$(BUILD)/release/crt0.o: $(SRC) 200507ea70eSGnoCiYeH CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 201507ea70eSGnoCiYeH touch $@ 202507ea70eSGnoCiYeH 203507ea70eSGnoCiYeH$(BUILD)/release/crti.o: $(SRC) 204507ea70eSGnoCiYeH CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 205507ea70eSGnoCiYeH touch $@ 206507ea70eSGnoCiYeH 207507ea70eSGnoCiYeH$(BUILD)/release/crtn.o: $(SRC) 208507ea70eSGnoCiYeH CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 209507ea70eSGnoCiYeH touch $@ 210507ea70eSGnoCiYeH 211507ea70eSGnoCiYeH$(BUILD)/release/ld_so.o: $(SRC) 212507ea70eSGnoCiYeH CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 213507ea70eSGnoCiYeH touch $@ 214507ea70eSGnoCiYeH 215507ea70eSGnoCiYeH$(BUILD)/release/ld_so: $(BUILD)/release/ld_so.o $(BUILD)/release/crti.o $(BUILD)/release/libc.a $(BUILD)/release/crtn.o 216507ea70eSGnoCiYeH $(LD) --no-relax -T src/ld_so/ld_script/$(TARGET).ld --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@ 217507ea70eSGnoCiYeH 218507ea70eSGnoCiYeH# Other targets 219507ea70eSGnoCiYeH 220507ea70eSGnoCiYeH$(BUILD)/openlibm: openlibm 221507ea70eSGnoCiYeH rm -rf $@ $@.partial 222507ea70eSGnoCiYeH mkdir -p $(BUILD) 223507ea70eSGnoCiYeH cp -r $< $@.partial 224507ea70eSGnoCiYeH mv $@.partial $@ 225507ea70eSGnoCiYeH touch $@ 226507ea70eSGnoCiYeH 227507ea70eSGnoCiYeH$(BUILD)/openlibm/libopenlibm.a: $(BUILD)/openlibm $(BUILD)/release/libdrsstd.a 228507ea70eSGnoCiYeH $(MAKE) AR=$(AR) CC=$(CC) LD=$(LD) CPPFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libopenlibm.a 229507ea70eSGnoCiYeH 230507ea70eSGnoCiYeH$(BUILD)/pthreads-emb: pthreads-emb 231507ea70eSGnoCiYeH rm -rf $@ $@.partial 232507ea70eSGnoCiYeH mkdir -p $(BUILD) 233507ea70eSGnoCiYeH cp -r $< $@.partial 234507ea70eSGnoCiYeH mv $@.partial $@ 235507ea70eSGnoCiYeH touch $@ 236507ea70eSGnoCiYeH 237507ea70eSGnoCiYeH$(BUILD)/pthreads-emb/libpthread.a: $(BUILD)/pthreads-emb $(BUILD)/release/libdrsstd.a 238507ea70eSGnoCiYeH $(MAKE) AR=$(AR) CC=$(CC) LD=$(LD) CFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libpthread.a 239