summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore7
-rw-r--r--Makefile107
-rw-r--r--crt/Scrt1.c1
-rw-r--r--crt/rcrt1.c14
-rw-r--r--src/internal/version.c1
-rw-r--r--tools/mkalltypes.sed15
6 files changed, 123 insertions, 22 deletions
diff --git a/.gitignore b/.gitignore
index 8043b6b..0a7aba4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,8 +1,3 @@
*.o
-*.lo
*.a
-*.so
-*.so.1
-config.mak
-lib/musl-gcc.specs
-/obj/
+generated
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
diff --git a/crt/Scrt1.c b/crt/Scrt1.c
deleted file mode 100644
index 822f10b..0000000
--- a/crt/Scrt1.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "crt1.c"
diff --git a/crt/rcrt1.c b/crt/rcrt1.c
deleted file mode 100644
index 901dff6..0000000
--- a/crt/rcrt1.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#define START "_start"
-#define _dlstart_c _start_c
-#include "../ldso/dlstart.c"
-
-int main();
-weak void _init();
-weak void _fini();
-int __libc_start_main(int (*)(), int, char **,
- void (*)(), void(*)(), void(*)());
-
-hidden void __dls2(unsigned char *base, size_t *sp)
-{
- __libc_start_main(main, *sp, (void *)(sp+1), _init, _fini, 0);
-}
diff --git a/src/internal/version.c b/src/internal/version.c
index 08bbf5b..5d56fb2 100644
--- a/src/internal/version.c
+++ b/src/internal/version.c
@@ -1,4 +1,3 @@
-#include "version.h"
#include "libc.h"
const char __libc_version[] = VERSION;
diff --git a/tools/mkalltypes.sed b/tools/mkalltypes.sed
new file mode 100644
index 0000000..fa15efc
--- /dev/null
+++ b/tools/mkalltypes.sed
@@ -0,0 +1,15 @@
+/^TYPEDEF/s/TYPEDEF \(.*\) \([^ ]*\);$/#if defined(__NEED_\2) \&\& !defined(__DEFINED_\2)\
+typedef \1 \2;\
+#define __DEFINED_\2\
+#endif\
+/
+/^STRUCT/s/STRUCT * \([^ ]*\) \(.*\);$/#if defined(__NEED_struct_\1) \&\& !defined(__DEFINED_struct_\1)\
+struct \1 \2;\
+#define __DEFINED_struct_\1\
+#endif\
+/
+/^UNION/s/UNION * \([^ ]*\) \(.*\);$/#if defined(__NEED_union_\1) \&\& !defined(__DEFINED_union_\1)\
+union \1 \2;\
+#define __DEFINED_union_\1\
+#endif\
+/