-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathMakefile
More file actions
151 lines (103 loc) · 3.73 KB
/
Makefile
File metadata and controls
151 lines (103 loc) · 3.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
SYSTEM=linux
ARCH=x86_64
BUILD_FOLDER=$(shell realpath bin)
BASE_FOLDER=$(PWD)
MK_CONFIG=$(shell realpath config)
-include $(MK_CONFIG)/*.mk
export MK_CONFIG
# to rm in config folder
##############################################################################################
CC := clang
AR = ar
AR_FLAGS =
CFLAGS = -Wall -Wextra -O0 -MMD -MP -fPIC -gdwarf-2 -g3
CFLAGS += -fno-stack-protector -mno-red-zone -nostdlib -ffreestanding
VERSION_FLAGS = sse4 avx2
SINGLE_THREAD = true
ifdef NATIVE
SIMD_LEVEL := -m$(NATIVE)
else
SIMD_LEVEL := -fno-tree-vectorize -fno-builtin -mno-sse -mno-avx
endif
# for the compile_commands.json
# CFLAGS += -nostdinc
ifeq ($(VERBOSE), true)
CFLAGS += -DVERBOSE
endif
ifdef LIB
LIBS = $(LIB)
endif
CONFIG_INCLUDE := -I $(shell realpath lib/config)
BASE_INCLUDE := -I $(BUILD_INCLUDE_FOLDER)
CFLAGS += -DIN_libc
export CC
export AR
export AR_FLAGS
export CFLAGS
export SIMD_LEVEL
export VERSION_FLAGS
export BASE_INCLUDE
export CONFIG_INCLUDE
export BUILD_LIB_FOLDER
export SYSTEM
export ARCH
##############################################################################################
LIBS_SRC = $(addprefix lib/,$($(LIBS)_NAME))
all : setup libs
setup : init_build include crt custom_clang
# init phase
##############################################################################################
SYSDEPS_BITS = $(shell find $(LIBS_SRC) -type d -wholename '*/sysdeps/$(SYSTEM)/$(ARCH)/bits')
init_build:
mkdir -p $(BUILD_FOLDER)
rm -rf $(BUILD_INCLUDE_FOLDER)
mkdir -p $(BUILD_INCLUDE_FOLDER)/bits
mkdir -p $(BUILD_LIB_FOLDER)
mkdir -p $(BUILD_OBJ_FOLDER)
include: init_build
cp -r $(INCLUDE_FOLDER) $(BUILD_FOLDER)
for dir in $(SYSDEPS_BITS); do \
echo "cp $$dir/* -> $(BUILD_INCLUDE_FOLDER)/bits"; \
cp -r $$dir/* $(BUILD_INCLUDE_FOLDER)/bits/; \
done
##############################################################################################
# build lib
##############################################################################################
-include lib/lib.mk
##############################################################################################
# crt (start and fini file for .so lib)
##############################################################################################
crt: include $(BUILD_LIB_FOLDER)/crt1.o $(BUILD_LIB_FOLDER)/crti.o $(BUILD_LIB_FOLDER)/crtn.o
CRT_CFLAGS = -nostdlib
$(BUILD_LIB_FOLDER)/crt1.o : crt/$(SYSTEM)/$(ARCH)/crt1.S
$(CC) $(CRT_CFLAGS) -c $< -o $@
$(BUILD_LIB_FOLDER)/crti.o : crt/$(SYSTEM)/$(ARCH)/crti.S
$(CC) $(CRT_CFLAGS) -c $< -o $@
$(BUILD_LIB_FOLDER)/crtn.o : crt/$(SYSTEM)/$(ARCH)/crtn.S
$(CC) $(CRT_CFLAGS) -c $< -o $@
##############################################################################################
# custom clang for shared object
##############################################################################################
PATH := $(BUILD_FOLDER):$(PATH)
custom_clang : init_build
cp config/sclang $(BUILD_FOLDER)/sclang
echo "export PATH=$(BUILD_FOLDER):$$PATH" > $(BUILD_FOLDER)/clang_path
echo "export SLIBC_PATH=$(BUILD_FOLDER)" >> $(BUILD_FOLDER)/clang_path
chmod +x $(BUILD_FOLDER)/clang_path
##############################################################################################
# utils
##############################################################################################
# $(1) lib name
define clean_lib
@echo cleanning : $(1)
rm -rf $(BUILD_LIB_FOLDER)/$(1)
rm -rf $(BUILD_OBJ_FOLDER)/$(1)
@echo end of cleanning $(1)
endef
clean:
$(foreach lib,$(LIBS), $(call clean_lib,$($(lib)_NAME)))
fclean:
rm -rf $(BUILD_FOLDER)
re: clean all
.PHONY: all clean fclean re init_build include
##############################################################################################