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 export CC=gcc 51# export LD=ld 52 export LD=ld 53 export AR=ar 54# export AR=x86_64-dragonos-ar 55 export OBJCOPY=objcopy 56# export OBJCOPY=x86_64-dragonos-objcopy 57endif 58 59SRC=\ 60 Cargo.* \ 61 $(shell find src -type f) 62 63BUILTINS_VERSION=0.1.70 64 65.PHONY: all clean fmt install install-headers libs submodules test 66 67all: | libs 68 69clean: 70 $(CARGO) clean 71 $(MAKE) -C tests clean 72 rm -rf sysroot 73 74check: 75 $(CARGO) check 76 77fmt: 78 ./fmt.sh 79 80install-headers: libs 81 mkdir -pv "$(DESTDIR)/include" 82 cp -rv "include"/* "$(DESTDIR)/include" 83 cp -rv "target/include"/* "$(DESTDIR)/include" 84 cp -v "openlibm/include"/*.h "$(DESTDIR)/include" 85 cp -v "openlibm/src"/*.h "$(DESTDIR)/include" 86 cp -v "pthreads-emb/"*.h "$(DESTDIR)/include" 87 88# $(BUILD)/release/libc.so 89libs: \ 90 $(BUILD)/release/libc.a \ 91 $(BUILD)/release/crt0.o \ 92 $(BUILD)/release/crti.o \ 93 $(BUILD)/release/crtn.o 94#$(BUILD)/release/ld_so 95 96install-libs: libs 97 mkdir -pv "$(DESTDIR)/lib" 98 cp -v "$(BUILD)/release/libc.a" "$(DESTDIR)/lib" 99# cp -v "$(BUILD)/release/libc.so" "$(DESTDIR)/lib" 100# ln -frsv "$(DESTDIR)/lib/libc.so" "$(DESTDIR)/lib/libc.so.6" 101 cp -v "$(BUILD)/release/crt0.o" "$(DESTDIR)/lib" 102 ln -frsv "$(DESTDIR)/lib/crt0.o" "$(DESTDIR)/lib/crt1.o" 103 cp -v "$(BUILD)/release/crti.o" "$(DESTDIR)/lib" 104 cp -v "$(BUILD)/release/crtn.o" "$(DESTDIR)/lib" 105# cp -v "$(BUILD)/release/ld_so" "$(DESTDIR)/lib/ld64.so.1" 106 cp -v "$(BUILD)/openlibm/libopenlibm.a" "$(DESTDIR)/lib/libm.a" 107 cp -v "$(BUILD)/pthreads-emb/libpthread.a" "$(DESTDIR)/lib/libpthread.a" 108 # Empty libraries for dl and rt 109 $(AR) -rcs "$(DESTDIR)/lib/libdl.a" 110 $(AR) -rcs "$(DESTDIR)/lib/librt.a" 111 112install: install-headers install-libs 113 114submodules: 115 git submodule sync 116 git submodule update --init --recursive 117 118sysroot: all 119 rm -rf $@ 120 rm -rf $@.partial 121 mkdir -p $@.partial 122 $(MAKE) install DESTDIR=$@.partial 123 mv $@.partial $@ 124 touch $@ 125 126test: sysroot 127 # TODO: Fix SIGILL when running cargo test 128 # $(CARGO_TEST) test 129 $(MAKE) -C tests verify 130 131# Debug targets 132 133$(BUILD)/debug/libc.a: $(BUILD)/debug/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 134 echo "create $@" > "$@.mri" 135 for lib in $^; do\ 136 echo "addlib $$lib" >> "$@.mri"; \ 137 done 138 echo "save" >> "$@.mri" 139 echo "end" >> "$@.mri" 140 $(AR) -M < "$@.mri" 141 142$(BUILD)/debug/libc.so: $(BUILD)/debug/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 143 $(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -Wl,-soname,libc.so.6 -o $@ 144 145$(BUILD)/debug/librelibc.a: $(SRC) 146 CARGO_INCREMENTAL=0 $(CARGO) rustc $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS) 147 ./renamesyms.sh $@ $(BUILD)/debug/deps/ 148 touch $@ 149 150$(BUILD)/debug/crt0.o: $(SRC) 151 CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 152 touch $@ 153 154$(BUILD)/debug/crti.o: $(SRC) 155 CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 156 touch $@ 157 158$(BUILD)/debug/crtn.o: $(SRC) 159 CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 160 touch $@ 161 162$(BUILD)/debug/ld_so.o: $(SRC) 163 CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 164 touch $@ 165 166$(BUILD)/debug/ld_so: $(BUILD)/debug/ld_so.o $(BUILD)/debug/crti.o $(BUILD)/debug/libc.a $(BUILD)/debug/crtn.o 167 $(LD) --no-relax -T src/ld_so/ld_script/$(TARGET).ld --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@ 168 169# Release targets 170 171$(BUILD)/release/libc.a: $(BUILD)/release/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 172 echo "create $@" > "$@.mri" 173 for lib in $^; do\ 174 echo "addlib $$lib" >> "$@.mri"; \ 175 done 176 echo "save" >> "$@.mri" 177 echo "end" >> "$@.mri" 178 $(AR) -M < "$@.mri" 179 180$(BUILD)/release/libc.so: $(BUILD)/release/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a 181 $(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -Wl,-soname,libc.so.6 -o $@ 182 183$(BUILD)/release/librelibc.a: $(SRC) 184 CARGO_INCREMENTAL=0 $(CARGO) rustc --release $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS) 185 # TODO: Better to only allow a certain whitelisted set of symbols? Perhaps 186 # use some cbindgen hook, specify them manually, or grep for #[no_mangle]. 187 ./renamesyms.sh $@ $(BUILD)/release/deps/ 188 touch $@ 189 190$(BUILD)/release/crt0.o: $(SRC) 191 CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 192 touch $@ 193 194$(BUILD)/release/crti.o: $(SRC) 195 CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 196 touch $@ 197 198$(BUILD)/release/crtn.o: $(SRC) 199 CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 200 touch $@ 201 202$(BUILD)/release/ld_so.o: $(SRC) 203 CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS) 204 touch $@ 205 206$(BUILD)/release/ld_so: $(BUILD)/release/ld_so.o $(BUILD)/release/crti.o $(BUILD)/release/libc.a $(BUILD)/release/crtn.o 207 $(LD) --no-relax -T src/ld_so/ld_script/$(TARGET).ld --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@ 208 209# Other targets 210 211$(BUILD)/openlibm: openlibm 212 rm -rf $@ $@.partial 213 mkdir -p $(BUILD) 214 cp -r $< $@.partial 215 mv $@.partial $@ 216 touch $@ 217 218$(BUILD)/openlibm/libopenlibm.a: $(BUILD)/openlibm $(BUILD)/release/librelibc.a 219 $(MAKE) AR=$(AR) CC=$(CC) LD=$(LD) CPPFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libopenlibm.a 220 221$(BUILD)/pthreads-emb: pthreads-emb 222 rm -rf $@ $@.partial 223 mkdir -p $(BUILD) 224 cp -r $< $@.partial 225 mv $@.partial $@ 226 touch $@ 227 228$(BUILD)/pthreads-emb/libpthread.a: $(BUILD)/pthreads-emb $(BUILD)/release/librelibc.a 229 $(MAKE) AR=$(AR) CC=$(CC) LD=$(LD) CFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libpthread.a 230