xref: /relibc/Makefile (revision 5e1004a8a8b67cbcb3f7dca814f778ba462eada3)
16fd98d55Slongjin# TARGET?=$(shell rustc -Z unstable-options --print target-spec-json | grep llvm-target | cut -d '"' -f4)
26fd98d55SlongjinTARGET=x86_64-unknown-dragonos
3ae137dbcSJeremy Soller
48a972542SJeremy SollerCARGO?=cargo
526299181SJeremy SollerCARGO_TEST?=$(CARGO)
62186cd1fS4lDO2CARGO_COMMON_FLAGS=-Z build-std=core,alloc,compiler_builtins
72186cd1fS4lDO2CARGOFLAGS?=$(CARGO_COMMON_FLAGS)
8604f1c11SJeremy SollerRUSTCFLAGS?=
93c1300e8SJeremy Sollerexport OBJCOPY?=objcopy
10604f1c11SJeremy Soller
1147ee733aSJeremy SollerBUILD="target/$(TARGET)"
12604f1c11SJeremy SollerCARGOFLAGS+="--target=$(TARGET)"
1347ee733aSJeremy Soller
1447ee733aSJeremy Sollerifeq ($(TARGET),aarch64-unknown-linux-gnu)
15e102c234SAlexander Theißen	export CC=aarch64-linux-gnu-gcc
165c0b37a2SJeremy Soller	export LD=aarch64-linux-gnu-ld
170be4208aSsamuela	export AR=aarch64-linux-gnu-ar
182073d2a8SJeremy Soller	export OBJCOPY=aarch64-linux-gnu-objcopy
1947ee733aSJeremy Sollerendif
2047ee733aSJeremy Soller
210a44d454SJeremy Sollerifeq ($(TARGET),aarch64-unknown-redox)
220a44d454SJeremy Soller	export CC=aarch64-unknown-redox-gcc
235c0b37a2SJeremy Soller	export LD=aarch64-unknown-redox-ld
240be4208aSsamuela	export AR=aarch64-unknown-redox-ar
252073d2a8SJeremy Soller	export OBJCOPY=aarch64-unknown-redox-objcopy
260a44d454SJeremy Sollerendif
270a44d454SJeremy Soller
283c1300e8SJeremy Sollerifeq ($(TARGET),x86_64-unknown-linux-gnu)
293c1300e8SJeremy Soller	export CC=x86_64-linux-gnu-gcc
303c1300e8SJeremy Soller	export LD=x86_64-linux-gnu-ld
313c1300e8SJeremy Soller	export AR=x86_64-linux-gnu-ar
323c1300e8SJeremy Soller	export OBJCOPY=x86_64-linux-gnu-objcopy
333c1300e8SJeremy Sollerendif
343c1300e8SJeremy Soller
35559387ccSJeremy Sollerifeq ($(TARGET),i686-unknown-redox)
36559387ccSJeremy Soller	export CC=i686-unknown-redox-gcc
37559387ccSJeremy Soller	export LD=i686-unknown-redox-ld
38559387ccSJeremy Soller	export AR=i686-unknown-redox-ar
39559387ccSJeremy Soller	export OBJCOPY=i686-unknown-redox-objcopy
40559387ccSJeremy Sollerendif
41559387ccSJeremy Soller
4247ee733aSJeremy Sollerifeq ($(TARGET),x86_64-unknown-redox)
43e102c234SAlexander Theißen	export CC=x86_64-unknown-redox-gcc
445c0b37a2SJeremy Soller	export LD=x86_64-unknown-redox-ld
450be4208aSsamuela	export AR=x86_64-unknown-redox-ar
462073d2a8SJeremy Soller	export OBJCOPY=x86_64-unknown-redox-objcopy
47ae137dbcSJeremy Sollerendif
48ae137dbcSJeremy Soller
496fd98d55Slongjinifeq ($(TARGET),x86_64-unknown-dragonos)
50*5e1004a8Slogin# 如果存在x86_64-dragonos-gcc,就用它,否则用gcc
51*5e1004a8Slogin
52*5e1004a8Sloginifeq ($(shell which x86_64-dragonos-gcc),)
5339989b48Slongjin	export CC=gcc
546fd98d55Slongjin# export LD=ld
5539989b48Slongjin	export LD=ld
566fd98d55Slongjin	export AR=ar
576fd98d55Slongjin# export AR=x86_64-dragonos-ar
586fd98d55Slongjin	export OBJCOPY=objcopy
596fd98d55Slongjin# export OBJCOPY=x86_64-dragonos-objcopy
60*5e1004a8Sloginelse
61*5e1004a8Slogin	export CC=x86_64-dragonos-gcc
62*5e1004a8Slogin	export LD=x86_64-dragonos-ld
63*5e1004a8Slogin	export AR=x86_64-dragonos-ar
64*5e1004a8Slogin	export OBJCOPY=x86_64-dragonos-objcopy
65*5e1004a8Sloginendif
666fd98d55Slongjinendif
676fd98d55Slongjin
68adcd0c99SJeremy SollerSRC=\
699eef8d7eSJeremy Soller	Cargo.* \
707f702720SjD91mZM2	$(shell find src -type f)
71adcd0c99SJeremy Soller
722186cd1fS4lDO2BUILTINS_VERSION=0.1.70
733a0d2177SJeremy Soller
74e5539a57Shasheddan.PHONY: all clean fmt install install-headers libs submodules test
75d9e4622fSJeremy Soller
762253ef60SGraham MacDonaldall: | libs
77d9e4622fSJeremy Soller
78d9e4622fSJeremy Sollerclean:
79c36ee723SJeremy Soller	$(CARGO) clean
80cee4449fSJeremy Soller	$(MAKE) -C tests clean
81950b4526SJeremy Soller	rm -rf sysroot
82d9e4622fSJeremy Soller
83729709a8SJeremy Sollercheck:
84c36ee723SJeremy Soller	$(CARGO) check
85729709a8SJeremy Soller
86d9e4622fSJeremy Sollerfmt:
87d9e4622fSJeremy Soller	./fmt.sh
88d9e4622fSJeremy Soller
892253ef60SGraham MacDonaldinstall-headers: libs
9078c8c217SJeremy Soller	mkdir -pv "$(DESTDIR)/include"
9178c8c217SJeremy Soller	cp -rv "include"/* "$(DESTDIR)/include"
922253ef60SGraham MacDonald	cp -rv "target/include"/* "$(DESTDIR)/include"
93950b4526SJeremy Soller	cp -v "openlibm/include"/*.h "$(DESTDIR)/include"
94950b4526SJeremy Soller	cp -v "openlibm/src"/*.h "$(DESTDIR)/include"
95be035f88SJeremy Soller	cp -v "pthreads-emb/"*.h "$(DESTDIR)/include"
962fdca9bdSJeremy Soller
97ed193815Slongjin# $(BUILD)/release/libc.so
986a162758SJeremy Sollerlibs: \
996a162758SJeremy Soller	$(BUILD)/release/libc.a \
1006a162758SJeremy Soller	$(BUILD)/release/crt0.o \
1016a162758SJeremy Soller	$(BUILD)/release/crti.o \
102ed193815Slongjin	$(BUILD)/release/crtn.o
103ed193815Slongjin#$(BUILD)/release/ld_so
1042b56f288SJeremy Soller
1052b56f288SJeremy Sollerinstall-libs: libs
106950b4526SJeremy Soller	mkdir -pv "$(DESTDIR)/lib"
1074e3b6732SJeremy Soller	cp -v "$(BUILD)/release/libc.a" "$(DESTDIR)/lib"
108ed193815Slongjin# cp -v "$(BUILD)/release/libc.so" "$(DESTDIR)/lib"
109ed193815Slongjin# ln -frsv "$(DESTDIR)/lib/libc.so" "$(DESTDIR)/lib/libc.so.6"
1104e3b6732SJeremy Soller	cp -v "$(BUILD)/release/crt0.o" "$(DESTDIR)/lib"
1117f7d73deSJeremy Soller	ln -frsv "$(DESTDIR)/lib/crt0.o" "$(DESTDIR)/lib/crt1.o"
112d659377bSjD91mZM2	cp -v "$(BUILD)/release/crti.o" "$(DESTDIR)/lib"
113d659377bSjD91mZM2	cp -v "$(BUILD)/release/crtn.o" "$(DESTDIR)/lib"
114ed193815Slongjin# cp -v "$(BUILD)/release/ld_so" "$(DESTDIR)/lib/ld64.so.1"
11555378175SjD91mZM2	cp -v "$(BUILD)/openlibm/libopenlibm.a" "$(DESTDIR)/lib/libm.a"
116be035f88SJeremy Soller	cp -v "$(BUILD)/pthreads-emb/libpthread.a" "$(DESTDIR)/lib/libpthread.a"
117ba87e489SJeremy Soller	# Empty libraries for dl and rt
118ba87e489SJeremy Soller	$(AR) -rcs "$(DESTDIR)/lib/libdl.a"
119ba87e489SJeremy Soller	$(AR) -rcs "$(DESTDIR)/lib/librt.a"
12078c8c217SJeremy Soller
1212fdca9bdSJeremy Sollerinstall: install-headers install-libs
1222fdca9bdSJeremy Soller
123e5539a57Shasheddansubmodules:
124e5539a57Shasheddan	git submodule sync
125e5539a57Shasheddan	git submodule update --init --recursive
126e5539a57Shasheddan
12728f4da52SJeremy Sollersysroot: all
1281acc2a1aSjD91mZM2	rm -rf $@
12982b9715fSJeremy Soller	rm -rf $@.partial
13082b9715fSJeremy Soller	mkdir -p $@.partial
131cee4449fSJeremy Soller	$(MAKE) install DESTDIR=$@.partial
13282b9715fSJeremy Soller	mv $@.partial $@
13382b9715fSJeremy Soller	touch $@
13482b9715fSJeremy Soller
135d659377bSjD91mZM2test: sysroot
136d827c0f1SjD91mZM2	# TODO: Fix SIGILL when running cargo test
137d827c0f1SjD91mZM2	# $(CARGO_TEST) test
1385c0b37a2SJeremy Soller	$(MAKE) -C tests verify
139d9e4622fSJeremy Soller
140084b69b3SJeremy Soller# Debug targets
141084b69b3SJeremy Soller
142084b69b3SJeremy Soller$(BUILD)/debug/libc.a: $(BUILD)/debug/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
1430c5abf03SJeremy Soller	echo "create $@" > "$@.mri"
1440c5abf03SJeremy Soller	for lib in $^; do\
1450c5abf03SJeremy Soller		echo "addlib $$lib" >> "$@.mri"; \
1460c5abf03SJeremy Soller	done
1470c5abf03SJeremy Soller	echo "save" >> "$@.mri"
1480c5abf03SJeremy Soller	echo "end" >> "$@.mri"
1490be4208aSsamuela	$(AR) -M < "$@.mri"
1500c5abf03SJeremy Soller
1512606266cSJeremy Soller$(BUILD)/debug/libc.so: $(BUILD)/debug/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
1529826cea0Soddcoder	$(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -Wl,-soname,libc.so.6 -o $@
1532b56f288SJeremy Soller
1540c5abf03SJeremy Soller$(BUILD)/debug/librelibc.a: $(SRC)
15527cebdd6SJeremy Soller	CARGO_INCREMENTAL=0 $(CARGO) rustc $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS)
1562186cd1fS4lDO2	./renamesyms.sh $@ $(BUILD)/debug/deps/
157afdc8062SJeremy Soller	touch $@
158d9e4622fSJeremy Soller
1598c218b16SJeremy Soller$(BUILD)/debug/crt0.o: $(SRC)
160bee72373SJeremy Soller	CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
161afdc8062SJeremy Soller	touch $@
162d9e4622fSJeremy Soller
1630c5abf03SJeremy Soller$(BUILD)/debug/crti.o: $(SRC)
164bee72373SJeremy Soller	CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
1650c5abf03SJeremy Soller	touch $@
1660c5abf03SJeremy Soller
1670c5abf03SJeremy Soller$(BUILD)/debug/crtn.o: $(SRC)
168bee72373SJeremy Soller	CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
1690c5abf03SJeremy Soller	touch $@
1700c5abf03SJeremy Soller
171084b69b3SJeremy Soller$(BUILD)/debug/ld_so.o: $(SRC)
172084b69b3SJeremy Soller	CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
173084b69b3SJeremy Soller	touch $@
174084b69b3SJeremy Soller
175084b69b3SJeremy Soller$(BUILD)/debug/ld_so: $(BUILD)/debug/ld_so.o $(BUILD)/debug/crti.o $(BUILD)/debug/libc.a $(BUILD)/debug/crtn.o
1763c1300e8SJeremy Soller	$(LD) --no-relax -T src/ld_so/ld_script/$(TARGET).ld --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@
177084b69b3SJeremy Soller
178084b69b3SJeremy Soller# Release targets
179084b69b3SJeremy Soller
180084b69b3SJeremy Soller$(BUILD)/release/libc.a: $(BUILD)/release/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
181084b69b3SJeremy Soller	echo "create $@" > "$@.mri"
182084b69b3SJeremy Soller	for lib in $^; do\
183084b69b3SJeremy Soller		echo "addlib $$lib" >> "$@.mri"; \
184084b69b3SJeremy Soller	done
185084b69b3SJeremy Soller	echo "save" >> "$@.mri"
186084b69b3SJeremy Soller	echo "end" >> "$@.mri"
1870be4208aSsamuela	$(AR) -M < "$@.mri"
188084b69b3SJeremy Soller
1892606266cSJeremy Soller$(BUILD)/release/libc.so: $(BUILD)/release/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
1909826cea0Soddcoder	$(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -Wl,-soname,libc.so.6 -o $@
191084b69b3SJeremy Soller
1920c5abf03SJeremy Soller$(BUILD)/release/librelibc.a: $(SRC)
19327cebdd6SJeremy Soller	CARGO_INCREMENTAL=0 $(CARGO) rustc --release $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS)
1942186cd1fS4lDO2	# TODO: Better to only allow a certain whitelisted set of symbols? Perhaps
1952186cd1fS4lDO2	# use some cbindgen hook, specify them manually, or grep for #[no_mangle].
1962186cd1fS4lDO2	./renamesyms.sh $@ $(BUILD)/release/deps/
197afdc8062SJeremy Soller	touch $@
19847ee733aSJeremy Soller
1998c218b16SJeremy Soller$(BUILD)/release/crt0.o: $(SRC)
200bee72373SJeremy Soller	CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
201afdc8062SJeremy Soller	touch $@
20247ee733aSJeremy Soller
203d659377bSjD91mZM2$(BUILD)/release/crti.o: $(SRC)
204bee72373SJeremy Soller	CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
205d659377bSjD91mZM2	touch $@
206d659377bSjD91mZM2
207d659377bSjD91mZM2$(BUILD)/release/crtn.o: $(SRC)
208bee72373SJeremy Soller	CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
209d659377bSjD91mZM2	touch $@
210d659377bSjD91mZM2
211084b69b3SJeremy Soller$(BUILD)/release/ld_so.o: $(SRC)
212084b69b3SJeremy Soller	CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
213084b69b3SJeremy Soller	touch $@
214084b69b3SJeremy Soller
215084b69b3SJeremy Soller$(BUILD)/release/ld_so: $(BUILD)/release/ld_so.o $(BUILD)/release/crti.o $(BUILD)/release/libc.a $(BUILD)/release/crtn.o
2163c1300e8SJeremy Soller	$(LD) --no-relax -T src/ld_so/ld_script/$(TARGET).ld --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@
217084b69b3SJeremy Soller
218084b69b3SJeremy Soller# Other targets
219084b69b3SJeremy Soller
220ae137dbcSJeremy Soller$(BUILD)/openlibm: openlibm
221ae137dbcSJeremy Soller	rm -rf $@ $@.partial
22269993639SJeremy Soller	mkdir -p $(BUILD)
223ae137dbcSJeremy Soller	cp -r $< $@.partial
224ae137dbcSJeremy Soller	mv $@.partial $@
225afdc8062SJeremy Soller	touch $@
226ae137dbcSJeremy Soller
2272253ef60SGraham MacDonald$(BUILD)/openlibm/libopenlibm.a: $(BUILD)/openlibm $(BUILD)/release/librelibc.a
2283c1300e8SJeremy Soller	$(MAKE) AR=$(AR) CC=$(CC) LD=$(LD) CPPFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libopenlibm.a
2298aae8e15SJeremy Soller
2308aae8e15SJeremy Soller$(BUILD)/pthreads-emb: pthreads-emb
2318aae8e15SJeremy Soller	rm -rf $@ $@.partial
2328aae8e15SJeremy Soller	mkdir -p $(BUILD)
2338aae8e15SJeremy Soller	cp -r $< $@.partial
2348aae8e15SJeremy Soller	mv $@.partial $@
2358aae8e15SJeremy Soller	touch $@
2368aae8e15SJeremy Soller
2372253ef60SGraham MacDonald$(BUILD)/pthreads-emb/libpthread.a: $(BUILD)/pthreads-emb $(BUILD)/release/librelibc.a
2383c1300e8SJeremy Soller	$(MAKE) AR=$(AR) CC=$(CC) LD=$(LD) CFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libpthread.a
239