xref: /relibc/Makefile (revision 5efaffe0f979593bf08bd11e8ce11c36859dcbe3)
1TARGET?=
2
3CARGO?=cargo
4CARGO_TEST?=$(CARGO)
5CARGOFLAGS?=
6RUSTCFLAGS?=
7
8# When using xargo, build it in local location
9export XARGO_HOME=$(CURDIR)/target/xargo
10
11export OBJCOPY=objcopy
12
13BUILD=target
14ifneq ($(TARGET),)
15	BUILD="target/$(TARGET)"
16	CARGOFLAGS+="--target=$(TARGET)"
17endif
18
19ifeq ($(TARGET),aarch64-unknown-linux-gnu)
20	export CC=aarch64-linux-gnu-gcc
21	export LD=aarch64-linux-gnu-ld
22	export AR=aarch64-linux-gnu-ar
23	export OBJCOPY=aarch64-linux-gnu-objcopy
24endif
25
26ifeq ($(TARGET),aarch64-unknown-redox)
27	export CC=aarch64-unknown-redox-gcc
28	export LD=aarch64-unknown-redox-ld
29	export AR=aarch64-unknown-redox-ar
30	export OBJCOPY=aarch64-unknown-redox-objcopy
31endif
32
33ifeq ($(TARGET),x86_64-unknown-redox)
34	export CC=x86_64-unknown-redox-gcc
35	export LD=x86_64-unknown-redox-ld
36	export AR=x86_64-unknown-redox-ar
37	export OBJCOPY=x86_64-unknown-redox-objcopy
38endif
39
40SRC=\
41	Cargo.* \
42	$(shell find src -type f)
43
44# FIXME: Remove the following line. It's only required since xargo automatically links with compiler_builtins, which conflicts with the compiler_builtins that rustc always links with.
45WEAKEN_SYMBOLS=\
46	-W __divti3 \
47	-W __fixdfti \
48	-W __floattidf \
49	-W __muloti4 \
50	-W __udivti3 \
51	-W __umodti3 \
52	-W __rust_probestack
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	cp -v "$(BUILD)/release/crti.o" "$(DESTDIR)/lib"
92	cp -v "$(BUILD)/release/crtn.o" "$(DESTDIR)/lib"
93	cp -v "$(BUILD)/release/ld_so" "$(DESTDIR)/lib/ld64.so.1"
94	cp -v "$(BUILD)/openlibm/libopenlibm.a" "$(DESTDIR)/lib/libm.a"
95	cp -v "$(BUILD)/pthreads-emb/libpthread.a" "$(DESTDIR)/lib/libpthread.a"
96
97install: install-headers install-libs
98
99submodules:
100	git submodule sync
101	git submodule update --init --recursive
102
103sysroot: all
104	rm -rf $@
105	rm -rf $@.partial
106	mkdir -p $@.partial
107	$(MAKE) install DESTDIR=$@.partial
108	mv $@.partial $@
109	touch $@
110
111test: sysroot
112	# TODO: Fix SIGILL when running cargo test
113	# $(CARGO_TEST) test
114	$(MAKE) -C tests verify
115
116# Debug targets
117
118$(BUILD)/debug/libc.a: $(BUILD)/debug/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
119	echo "create $@" > "$@.mri"
120	for lib in $^; do\
121		echo "addlib $$lib" >> "$@.mri"; \
122	done
123	echo "save" >> "$@.mri"
124	echo "end" >> "$@.mri"
125	$(AR) -M < "$@.mri"
126
127$(BUILD)/debug/libc.so: $(BUILD)/debug/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
128	$(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -Wl,-soname,libc.so.6 -o $@
129
130$(BUILD)/debug/librelibc.a: $(SRC)
131	CARGO_INCREMENTAL=0 $(CARGO) rustc $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS)
132	# FIXME: Remove the following line. It's only required since xargo automatically links with compiler_builtins, which conflicts with the compiler_builtins that rustc always links with.
133	$(OBJCOPY) $@ $(WEAKEN_SYMBOLS)
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 --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	$(OBJCOPY) $@ $(WEAKEN_SYMBOLS)
172	touch $@
173
174$(BUILD)/release/crt0.o: $(SRC)
175	CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
176	touch $@
177
178$(BUILD)/release/crti.o: $(SRC)
179	CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
180	touch $@
181
182$(BUILD)/release/crtn.o: $(SRC)
183	CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
184	touch $@
185
186$(BUILD)/release/ld_so.o: $(SRC)
187	CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
188	touch $@
189
190$(BUILD)/release/ld_so: $(BUILD)/release/ld_so.o $(BUILD)/release/crti.o $(BUILD)/release/libc.a $(BUILD)/release/crtn.o
191	$(LD) --no-relax -T src/ld_so/ld_script --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@
192
193# Other targets
194
195$(BUILD)/openlibm: openlibm
196	rm -rf $@ $@.partial
197	mkdir -p $(BUILD)
198	cp -r $< $@.partial
199	mv $@.partial $@
200	touch $@
201
202$(BUILD)/openlibm/libopenlibm.a: $(BUILD)/openlibm $(BUILD)/release/librelibc.a
203	$(MAKE) CC=$(CC) CPPFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libopenlibm.a
204
205$(BUILD)/pthreads-emb: pthreads-emb
206	rm -rf $@ $@.partial
207	mkdir -p $(BUILD)
208	cp -r $< $@.partial
209	mv $@.partial $@
210	touch $@
211
212$(BUILD)/pthreads-emb/libpthread.a: $(BUILD)/pthreads-emb $(BUILD)/release/librelibc.a
213	$(MAKE) CC=$(CC) CFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libpthread.a
214