xref: /relibc/Makefile (revision c02849dd73da0afd7ef8fc4b056be57e0dc700b4)
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
11BUILD=target
12ifneq ($(TARGET),)
13	BUILD="target/$(TARGET)"
14	CARGOFLAGS+="--target=$(TARGET)"
15endif
16
17ifeq ($(TARGET),aarch64-unknown-linux-gnu)
18	export CC=aarch64-linux-gnu-gcc
19	export LD=aarch64-linux-gnu-ld
20	export AR=aarch64-linux-gnu-ar
21endif
22
23ifeq ($(TARGET),aarch64-unknown-redox)
24	export CC=aarch64-unknown-redox-gcc
25	export LD=aarch64-unknown-redox-ld
26	export AR=aarch64-unknown-redox-ar
27endif
28
29ifeq ($(TARGET),x86_64-unknown-redox)
30	export CC=x86_64-unknown-redox-gcc
31	export LD=x86_64-unknown-redox-ld
32	export AR=x86_64-unknown-redox-ar
33endif
34
35SRC=\
36	Cargo.* \
37	$(shell find src -type f)
38
39.PHONY: all clean fmt install install-headers libs test
40
41all: | libs
42
43clean:
44	$(CARGO) clean
45	$(MAKE) -C tests clean
46	rm -rf sysroot
47
48check:
49	$(CARGO) check
50
51fmt:
52	./fmt.sh
53
54install-headers: libs
55	mkdir -pv "$(DESTDIR)/include"
56	cp -rv "include"/* "$(DESTDIR)/include"
57	cp -rv "target/include"/* "$(DESTDIR)/include"
58	cp -v "openlibm/include"/*.h "$(DESTDIR)/include"
59	cp -v "openlibm/src"/*.h "$(DESTDIR)/include"
60	cp -v "pthreads-emb/"*.h "$(DESTDIR)/include"
61
62libs: \
63	$(BUILD)/release/libc.a \
64	$(BUILD)/release/libc.so \
65	$(BUILD)/release/crt0.o \
66	$(BUILD)/release/crti.o \
67	$(BUILD)/release/crtn.o \
68	$(BUILD)/release/ld_so
69
70install-libs: libs
71	mkdir -pv "$(DESTDIR)/lib"
72	cp -v "$(BUILD)/release/libc.a" "$(DESTDIR)/lib"
73	cp -v "$(BUILD)/release/libc.so" "$(DESTDIR)/lib"
74	cp -v "$(BUILD)/release/crt0.o" "$(DESTDIR)/lib"
75	cp -v "$(BUILD)/release/crti.o" "$(DESTDIR)/lib"
76	cp -v "$(BUILD)/release/crtn.o" "$(DESTDIR)/lib"
77	cp -v "$(BUILD)/release/ld_so" "$(DESTDIR)/lib/ld64.so.1"
78	cp -v "$(BUILD)/openlibm/libopenlibm.a" "$(DESTDIR)/lib/libm.a"
79	cp -v "$(BUILD)/pthreads-emb/libpthread.a" "$(DESTDIR)/lib/libpthread.a"
80
81install: install-headers install-libs
82
83sysroot: all
84	rm -rf $@
85	rm -rf $@.partial
86	mkdir -p $@.partial
87	$(MAKE) install DESTDIR=$@.partial
88	mv $@.partial $@
89	touch $@
90
91test: sysroot
92	$(CARGO_TEST) test
93	$(MAKE) -C tests verify
94
95# Debug targets
96
97$(BUILD)/debug/libc.a: $(BUILD)/debug/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
98	echo "create $@" > "$@.mri"
99	for lib in $^; do\
100		echo "addlib $$lib" >> "$@.mri"; \
101	done
102	echo "save" >> "$@.mri"
103	echo "end" >> "$@.mri"
104	$(AR) -M < "$@.mri"
105
106$(BUILD)/debug/libc.so: $(BUILD)/debug/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
107	$(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -o $@
108
109$(BUILD)/debug/librelibc.a: $(SRC)
110	CARGO_INCREMENTAL=0 $(CARGO) rustc $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS)
111	touch $@
112
113$(BUILD)/debug/crt0.o: $(SRC)
114	CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
115	touch $@
116
117$(BUILD)/debug/crti.o: $(SRC)
118	CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
119	touch $@
120
121$(BUILD)/debug/crtn.o: $(SRC)
122	CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
123	touch $@
124
125$(BUILD)/debug/ld_so.o: $(SRC)
126	CARGO_INCREMENTAL=0 $(CARGO) rustc --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
127	touch $@
128
129$(BUILD)/debug/ld_so: $(BUILD)/debug/ld_so.o $(BUILD)/debug/crti.o $(BUILD)/debug/libc.a $(BUILD)/debug/crtn.o
130	$(LD) --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@
131
132# Release targets
133
134$(BUILD)/release/libc.a: $(BUILD)/release/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
135	echo "create $@" > "$@.mri"
136	for lib in $^; do\
137		echo "addlib $$lib" >> "$@.mri"; \
138	done
139	echo "save" >> "$@.mri"
140	echo "end" >> "$@.mri"
141	$(AR) -M < "$@.mri"
142
143$(BUILD)/release/libc.so: $(BUILD)/release/librelibc.a $(BUILD)/pthreads-emb/libpthread.a $(BUILD)/openlibm/libopenlibm.a
144	$(CC) -nostdlib -shared -Wl,--allow-multiple-definition -Wl,--whole-archive $^ -Wl,--no-whole-archive -o $@
145
146$(BUILD)/release/librelibc.a: $(SRC)
147	CARGO_INCREMENTAL=0 $(CARGO) rustc --release $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS)
148	touch $@
149
150$(BUILD)/release/crt0.o: $(SRC)
151	CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crt0/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
152	touch $@
153
154$(BUILD)/release/crti.o: $(SRC)
155	CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crti/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
156	touch $@
157
158$(BUILD)/release/crtn.o: $(SRC)
159	CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/crtn/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
160	touch $@
161
162$(BUILD)/release/ld_so.o: $(SRC)
163	CARGO_INCREMENTAL=0 $(CARGO) rustc --release --manifest-path src/ld_so/Cargo.toml $(CARGOFLAGS) -- --emit obj=$@ -C panic=abort $(RUSTCFLAGS)
164	touch $@
165
166$(BUILD)/release/ld_so: $(BUILD)/release/ld_so.o $(BUILD)/release/crti.o $(BUILD)/release/libc.a $(BUILD)/release/crtn.o
167	$(LD) --allow-multiple-definition --gc-sections --gc-keep-exported $^ -o $@
168
169# Other targets
170
171$(BUILD)/openlibm: openlibm
172	rm -rf $@ $@.partial
173	mkdir -p $(BUILD)
174	cp -r $< $@.partial
175	mv $@.partial $@
176	touch $@
177
178$(BUILD)/openlibm/libopenlibm.a: $(BUILD)/openlibm $(BUILD)/release/librelibc.a
179	$(MAKE) CC=$(CC) CPPFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libopenlibm.a
180
181$(BUILD)/pthreads-emb: pthreads-emb
182	rm -rf $@ $@.partial
183	mkdir -p $(BUILD)
184	cp -r $< $@.partial
185	mv $@.partial $@
186	touch $@
187
188$(BUILD)/pthreads-emb/libpthread.a: $(BUILD)/pthreads-emb $(BUILD)/release/librelibc.a
189	$(MAKE) CC=$(CC) CFLAGS="-fno-stack-protector -I $(shell pwd)/include -I $(shell pwd)/target/include" -C $< libpthread.a
190