xref: /relibc/Makefile (revision 9529e09568a890f35e1ba19f14ff15c2544d7105)
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 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
99sysroot: all
100	rm -rf $@
101	rm -rf $@.partial
102	mkdir -p $@.partial
103	$(MAKE) install DESTDIR=$@.partial
104	mv $@.partial $@
105	touch $@
106
107test: sysroot
108	# TODO: Fix SIGILL when running cargo test
109	# $(CARGO_TEST) test
110	$(MAKE) -C tests verify
111
112# Debug targets
113
114$(BUILD)/debug/libc.a: $(BUILD)/debug/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
115	echo "create $@" > "$@.mri"
116	for lib in $^; do\
117		echo "addlib $$lib" >> "$@.mri"; \
118	done
119	echo "save" >> "$@.mri"
120	echo "end" >> "$@.mri"
121	$(AR) -M < "$@.mri"
122
123$(BUILD)/debug/libc.so: $(BUILD)/debug/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
124	$(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -Wl,-soname,libc.so.6 -o $@
125
126$(BUILD)/debug/librelibc.a: $(SRC)
127	CARGO_INCREMENTAL=0 $(CARGO) rustc $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS)
128	# 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.
129	$(OBJCOPY) $@ $(WEAKEN_SYMBOLS)
130	touch $@
131
132$(BUILD)/debug/crt0.o: $(SRC)
133	CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
134	touch $@
135
136$(BUILD)/debug/crti.o: $(SRC)
137	CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
138	touch $@
139
140$(BUILD)/debug/crtn.o: $(SRC)
141	CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
142	touch $@
143
144$(BUILD)/debug/ld_so.o: $(SRC)
145	CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
146	touch $@
147
148$(BUILD)/debug/ld_so: $(BUILD)/debug/ld_so.o $(BUILD)/debug/crti.o $(BUILD)/debug/libc.a $(BUILD)/debug/crtn.o
149	$(LD) --no-relax -T src/ld_so/ld_script --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@
150
151# Release targets
152
153$(BUILD)/release/libc.a: $(BUILD)/release/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
154	echo "create $@" > "$@.mri"
155	for lib in $^; do\
156		echo "addlib $$lib" >> "$@.mri"; \
157	done
158	echo "save" >> "$@.mri"
159	echo "end" >> "$@.mri"
160	$(AR) -M < "$@.mri"
161
162$(BUILD)/release/libc.so: $(BUILD)/release/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
163	$(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -Wl,-soname,libc.so.6 -o $@
164
165$(BUILD)/release/librelibc.a: $(SRC)
166	CARGO_INCREMENTAL=0 $(CARGO) rustc --release $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS)
167	$(OBJCOPY) $@ $(WEAKEN_SYMBOLS)
168	touch $@
169
170$(BUILD)/release/crt0.o: $(SRC)
171	CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
172	touch $@
173
174$(BUILD)/release/crti.o: $(SRC)
175	CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
176	touch $@
177
178$(BUILD)/release/crtn.o: $(SRC)
179	CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
180	touch $@
181
182$(BUILD)/release/ld_so.o: $(SRC)
183	CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
184	touch $@
185
186$(BUILD)/release/ld_so: $(BUILD)/release/ld_so.o $(BUILD)/release/crti.o $(BUILD)/release/libc.a $(BUILD)/release/crtn.o
187	$(LD) --no-relax -T src/ld_so/ld_script --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@
188
189# Other targets
190
191$(BUILD)/openlibm: openlibm
192	rm -rf $@ $@.partial
193	mkdir -p $(BUILD)
194	cp -r $< $@.partial
195	mv $@.partial $@
196	touch $@
197
198$(BUILD)/openlibm/libopenlibm.a: $(BUILD)/openlibm $(BUILD)/release/librelibc.a
199	$(MAKE) CC=$(CC) CPPFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libopenlibm.a
200
201$(BUILD)/pthreads-emb: pthreads-emb
202	rm -rf $@ $@.partial
203	mkdir -p $(BUILD)
204	cp -r $< $@.partial
205	mv $@.partial $@
206	touch $@
207
208$(BUILD)/pthreads-emb/libpthread.a: $(BUILD)/pthreads-emb $(BUILD)/release/librelibc.a
209	$(MAKE) CC=$(CC) CFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libpthread.a
210