summaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
authorVladimir Azarov <avm@intermediate-node.net>2024-10-01 18:33:41 +0200
committerVladimir Azarov <avm@intermediate-node.net>2024-10-01 18:33:41 +0200
commit47a781f03119d360ef2b2936234d381fd2f4c85d (patch)
tree0dd1cb1305b10a2f551c4a30f48589aca4324d87 /Makefile
parent4abab5ad6c8465a7528ccdd5f49367da05f78bbd (diff)
Rewritten Makefile
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile107
1 files changed, 107 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..aeb1325
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,107 @@
+AR = ar
+CC = gcc
+CFLAGS = -Wall -g -O3 -march=native
+
+arch = x86_64
+
+cflags = -pipe -std=c99 -nostdinc -D_XOPEN_SOURCE=700 \
+ -ffreestanding -fexcess-precision=standard -fno-strict-aliasing \
+ -frounding-math -fno-pic -fno-stack-protector \
+ -fno-unwind-tables -fno-asynchronous-unwind-tables \
+ -ffunction-sections -fdata-sections \
+ -Iarch/$(arch) -Iarch/generic -Isrc/include -Isrc/internal \
+ -Igenerated/include -Iinclude $(CFLAGS)
+
+prefix = /
+includedir = $(prefix)/include
+libdir = $(prefix)/lib
+
+src_dirs = src/* src/mallocng crt
+common_src = $(wildcard $(addsuffix /*.c, $(src_dirs)))
+arch_src = $(wildcard $(addsuffix /$(arch)/*.[csS], $(src_dirs)))
+
+common_obj = $(common_src:.c=.o)
+arch_obj = $(patsubst %, %.o, $(basename $(arch_src)))
+replaced_obj = $(subst /$(arch)/,/, $(arch_obj))
+all_obj = $(filter-out $(replaced_obj), $(common_obj) $(arch_obj))
+memops_obj = $(filter %/memcpy.o %/memmove.o %/memcmp.o %/memset.o, $(all_obj))
+crt_obj = $(filter crt/%, $(all_obj))
+
+generated_headers = $(addprefix generated/include/bits/, \
+ alltypes.h syscall.h)
+implementation_headers = $(addprefix src/internal/, \
+ stdio_impl.h pthread_impl.h locale_impl.h libc.h)
+
+lib_obj = libc.a crt1.o crti.o crtn.o
+
+arch_inc = $(wildcard arch/$(arch)/bits/*.h)
+generic_inc = $(wildcard arch/generic/bits/*.h)
+inc = $(wildcard include/*.h include/*/*.h)
+all_inc = $(sort $(inc) $(generated_headers:generated/%=%) \
+ $(arch_inc:arch/$(arch)/%=include/%) \
+ $(generic_inc:arch/generic/%=include/%))
+
+default: $(lib_obj)
+
+generated_dirs:
+ mkdir -p $(dir $(generated_headers))
+
+$(generated_headers): | generated_dirs
+
+generated/include/bits/alltypes.h: arch/$(arch)/bits/alltypes.h.in \
+ include/alltypes.h.in
+ sed -f tools/mkalltypes.sed $^ >$@
+
+generated/include/bits/syscall.h: arch/$(arch)/bits/syscall.h.in
+ cp $< $@
+ sed -n -e 's/__NR_/SYS_/p' < $< >>$@
+
+src/internal/version.o: cflags += -DVERSION=\"$(shell cat VERSION)\"
+crt/crt1.o: arch/$(arch)/crt_arch.h
+$(memops_obj): cflags += -fno-tree-loop-distribute-patterns
+$(crt_obj): cflags += -DCRT
+
+cc_cmd = $(CC) $(cflags) -c -o $@ $<
+as_cmd = $(cc_cmd)
+install_cmd = install -D -m 644 $< $@
+
+%.o: %.s
+ $(as_cmd)
+
+%.o: %.S
+ $(cc_cmd)
+
+%.o: %.c $(generated_headers) $(implementation_headers)
+ $(cc_cmd)
+
+%.o: crt/$(arch)/%.o
+ cp $< $@
+%.o: crt/%.o
+ cp $< $@
+
+libc.a: $(all_obj)
+ rm -f $@
+ $(AR) rcs $@ $^
+
+$(DESTDIR)$(libdir)/%: %
+ $(install_cmd)
+
+$(DESTDIR)$(includedir)/bits/%: arch/$(arch)/bits/%
+ $(install_cmd)
+
+$(DESTDIR)$(includedir)/bits/%: arch/generic/bits/%
+ $(install_cmd)
+
+$(DESTDIR)$(includedir)/bits/%: generated/include/bits/%
+ $(install_cmd)
+
+$(DESTDIR)$(includedir)/%: include/%
+ $(install_cmd)
+
+install-libs: $(addprefix $(DESTDIR)$(libdir)/, $(lib_obj))
+install-headers: $(all_inc:include/%=$(DESTDIR)$(includedir)/%)
+install: install-libs install-headers
+
+clean:
+ rm -rf generated
+ rm -f crt/*.o src/*/*.o libc.a crt1.o crti.o crtn.o