forked from riscv-software-src/librpmi
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
323 lines (287 loc) · 10.6 KB
/
Makefile
File metadata and controls
323 lines (287 loc) · 10.6 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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
#
# SPDX-License-Identifier: BSD-2-Clause
#
# Copyright (c) 2024 Ventana Micro Systems Inc.
#
# Select Make Options:
MAKEFLAGS += -r --no-print-directory
# Readlink -f requires GNU readlink
ifeq ($(shell uname -s),Darwin)
READLINK ?= greadlink
else
READLINK ?= readlink
endif
# Find out source, build, and install directories
src_dir=$(CURDIR)
ifdef O
build_dir=$(shell $(READLINK) -f $(O))
else
build_dir=$(CURDIR)/build
endif
ifeq ($(build_dir),$(CURDIR))
$(error Build directory is same as source directory.)
endif
install_root_dir_default=$(CURDIR)/install
ifdef I
install_root_dir=$(shell $(READLINK) -f $(I))
else
install_root_dir=$(install_root_dir_default)
endif
ifeq ($(install_root_dir),$(CURDIR))
$(error Install root directory is same as source directory.)
endif
ifeq ($(install_root_dir),$(build_dir))
$(error Install root directory is same as build directory.)
endif
docs_dir=$(build_dir)/docs
install_docs_dir=$(install_root_dir)/docs
LIBRPMI_HEADER := $(src_dir)/include/librpmi.h
LIBRPMI_IMPL_VERSION_MAJOR := $(strip $(shell sed -n 's/^#define[[:space:]]\+LIBRPMI_IMPL_VERSION_MAJOR[[:space:]]\+\([0-9][0-9]*\).*/\1/p' $(LIBRPMI_HEADER)))
LIBRPMI_IMPL_VERSION_MINOR := $(strip $(shell sed -n 's/^#define[[:space:]]\+LIBRPMI_IMPL_VERSION_MINOR[[:space:]]\+\([0-9][0-9]*\).*/\1/p' $(LIBRPMI_HEADER)))
ifeq ($(LIBRPMI_IMPL_VERSION_MAJOR),)
$(error Failed to parse LIBRPMI_IMPL_VERSION_MAJOR from $(LIBRPMI_HEADER))
endif
ifeq ($(LIBRPMI_IMPL_VERSION_MINOR),)
$(error Failed to parse LIBRPMI_IMPL_VERSION_MINOR from $(LIBRPMI_HEADER))
endif
LIBRPMI_PATCH_VERSION ?= 0
LIBRPMI_VERSION ?= $(LIBRPMI_IMPL_VERSION_MAJOR).$(LIBRPMI_IMPL_VERSION_MINOR).$(LIBRPMI_PATCH_VERSION)
LIBRPMI_SOVERSION ?= 0
LIBRPMI_LIBDIR ?= lib
LIBRPMI_PKGCONFIG_LIBDIR ?= /$(LIBRPMI_LIBDIR)
install_lib_dir=$(install_root_dir)/$(LIBRPMI_LIBDIR)
pkgconfig_dir=$(install_lib_dir)/pkgconfig
# Check if verbosity is ON for build process
CMD_PREFIX_DEFAULT := @
ifeq ($(V), 1)
CMD_PREFIX :=
else
CMD_PREFIX := $(CMD_PREFIX_DEFAULT)
endif
# Setup path of directories
export include_dir=$(src_dir)/include
export lib_dir=$(src_dir)/lib
export test_dir=$(src_dir)/test
ifeq ($(LLVM),1)
CC = clang
AR = llvm-ar
AS = llvm-as
LD = ld.lld
OBJCOPY = llvm-objcopy
else
# Setup compilation commands
ifdef CROSS_COMPILE
CC = $(CROSS_COMPILE)gcc
AR = $(CROSS_COMPILE)ar
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
else
CC ?= gcc
AR ?= ar
AS ?= as
LD ?= ld
endif
endif
CPP = $(CC) -E
# Setup list of objects.mk files
lib-object-mks=$(shell if [ -d $(lib_dir)/ ]; then find $(lib_dir) -iname "objects.mk" | sort -r; fi)
test-object-mks=$(shell if [ -d $(test_dir)/ ]; then find $(test_dir) -iname "objects.mk" | sort -r; fi)
# Include all object.mk files
include $(lib-object-mks)
include $(test-object-mks)
# Setup list of objects
lib-objs-path-y=$(foreach obj,$(lib-objs-y),$(build_dir)/lib/$(obj))
test-elfs-path-y=$(foreach elf,$(test-elfs-y),$(build_dir)/test/$(elf).elf)
test-objs-path-y=$(foreach elf,$(test-elfs-y),$(build_dir)/test/$(elf).o)
test-objs-path-y+=$(foreach elf,$(test-elfs-y),$(foreach obj,$($(elf)-objs-y),$(build_dir)/$(obj)))
# Setup list of deps files for objects
deps-y=$(lib-objs-path-y:.o=.dep)
ifeq ($(LIBRPMI_TEST),y)
deps-y+=$(test-objs-path-y:.o=.dep)
endif
# Setup compilation commands flags
GENFLAGS = -Wall -Werror -g
GENFLAGS += -I$(include_dir) -I$(lib_dir)
ifeq ($(LIBRPMI_DEBUG),y)
GENFLAGS += -O0 -DLIBRPMI_DEBUG
else
GENFLAGS += -O2
endif
EXTRA_CFLAGS += -Wsign-compare
CFLAGS = $(GENFLAGS)
CFLAGS += $(EXTRA_CFLAGS)
CFLAGS += -fPIC
CPPFLAGS += $(GENFLAGS)
ARFLAGS = rcs
ifneq ($(shell uname -s),Darwin)
ELFFLAGS += -static
endif
ELFFLAGS += -L$(build_dir) -lrpmi
ELFFLAGS += $(EXTRA_ELFFLAGS)
# Setup functions for compilation
define dynamic_flags
-I$(shell dirname $(2)) -D__OBJNAME__=$(subst -,_,$(shell basename $(1) .o))
endef
copy_file = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
echo " COPY $(subst $(build_dir)/,,$(1))"; \
cp -f $(2) $(1)
inst_file = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
echo " INSTALL $(subst $(install_root_dir)/,,$(1))"; \
cp -f $(2) $(1)
inst_file_list = $(CMD_PREFIX)if [ ! -z "$(4)" ]; then \
mkdir -p $(1)"/"$(3); \
for rel_file in $(4) ; do \
dest_file=$(1)"/"$(3)"/"`echo $$rel_file`; \
dest_dir=`dirname $$dest_file`; \
src_file=$(2)"/"`echo $$rel_file`; \
echo " INSTALL "$(3)"/"`echo $$rel_file`; \
mkdir -p $$dest_dir; \
cp -f $$src_file $$dest_file; \
done \
fi
inst_dir = $(CMD_PREFIX)mkdir -p $(1); \
echo " INSTALL $(subst $(install_root_dir)/,,$(1))"; \
rm -rf $(1); \
cp -rf $(2) $(1)
compile_cpp = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
echo " CPP $(subst $(build_dir)/,,$(1))"; \
$(CPP) $(CPPFLAGS) -x c $(2) | grep -v "\#" > $(1)
compile_cc_dep = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
echo " CC-DEP $(subst $(build_dir)/,,$(1))"; \
printf %s `dirname $(1)`/ > $(1) && \
$(CC) $(CFLAGS) $(call dynamic_flags,$(1),$(2)) \
-MM $(2) >> $(1) || rm -f $(1)
compile_cc = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
echo " CC $(subst $(build_dir)/,,$(1))"; \
$(CC) $(CFLAGS) $(call dynamic_flags,$(1),$(2)) -c $(2) -o $(1)
compile_elf = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
echo " ELF $(subst $(build_dir)/,,$(1))"; \
$(CC) $(CFLAGS) $(2) $(3) $(4) $(ELFFLAGS) -o $(1)
compile_ar = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
echo " AR $(subst $(build_dir)/,,$(1))"; \
$(AR) $(ARFLAGS) $(1) $(2)
compile_so = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
echo " SO $(subst $(build_dir)/,,$(1))"; \
$(CC) -shared -Wl,-soname,librpmi.so.$(LIBRPMI_SOVERSION) \
$(LDFLAGS) $(EXTRA_LDFLAGS) -o $(1) $(2)
gen_pkgconfig = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \
echo " GEN $(subst $(build_dir)/,,$(1))"; \
printf '%s\n' \
'prefix=/usr' \
'libdir=$${prefix}$(LIBRPMI_PKGCONFIG_LIBDIR)' \
'includedir=$${prefix}/include' \
'' \
'Name: librpmi' \
'Description: RISC-V Platform Management Interface (RPMI) protocol helper library' \
'Version: $(LIBRPMI_VERSION)' \
'Libs: -L$${libdir} -lrpmi' \
'Cflags: -I$${includedir}' > $(1)
blobs-y = $(build_dir)/librpmi.a
blobs-y += $(build_dir)/librpmi.so.$(LIBRPMI_VERSION)
blobs-y += $(build_dir)/librpmi.pc
blobs-$(LIBRPMI_TEST) += $(test-elfs-path-y)
# Default rule "make" should always be first rule
.PHONY: all
all: printdetails $(blobs-y)
.PHONY: printdetails
printdetails:
$(info )
$(info ------------------ LIBRPMI BUILD INFO --------------------)
$(info CC: ($(CC)))
$(info CPP: ($(CPP)))
$(info AS: ($(AS)))
$(info AR: ($(AR)))
$(info LD: ($(LD)))
$(info ARFLAGS: ($(ARFLAGS)))
$(info CFLAGS: ($(CFLAGS)))
$(info LDFLAGS: ($(LDFLAGS)))
$(info --------------------------------------------------)
# Preserve all intermediate files
.SECONDARY:
$(build_dir)/%.elf: $(build_dir)/%.o $(test-objs-path-y) $(build_dir)/librpmi.a
$(call compile_elf,$@,$<,$(foreach obj,$($(*F)-objs-y),$(build_dir)/$(obj)),$($(*F)-cflags-y))
$(build_dir)/librpmi.a: $(lib-objs-path-y)
$(call compile_ar,$@,$^)
$(build_dir)/librpmi.so.$(LIBRPMI_VERSION): $(lib-objs-path-y)
$(call compile_so,$@,$^)
$(CMD_PREFIX)ln -sf librpmi.so.$(LIBRPMI_VERSION) $(build_dir)/librpmi.so.$(LIBRPMI_SOVERSION)
$(CMD_PREFIX)ln -sf librpmi.so.$(LIBRPMI_SOVERSION) $(build_dir)/librpmi.so
$(build_dir)/librpmi.pc: Makefile
$(call gen_pkgconfig,$@)
$(build_dir)/%.dep: $(src_dir)/%.c
$(call compile_cc_dep,$@,$<)
$(build_dir)/%.o: $(src_dir)/%.c
$(call compile_cc,$@,$<)
# Dependency files should only be included after default Makefile rules
# They should not be included for any "xxxconfig" or "xxxclean" rule
all-deps-1 = $(if $(findstring config,$(MAKECMDGOALS)),,$(deps-y))
all-deps-2 = $(if $(findstring clean,$(MAKECMDGOALS)),,$(all-deps-1))
-include $(all-deps-2)
# Rule for "make install"
.PHONY: install
install: $(blobs-y) $(src_dir)/COPYING.BSD
$(call inst_dir,$(install_root_dir)/include,$(include_dir))
$(call inst_file,$(install_lib_dir)/librpmi.a,$(build_dir)/librpmi.a)
$(call inst_file,$(install_lib_dir)/librpmi.so.$(LIBRPMI_VERSION),$(build_dir)/librpmi.so.$(LIBRPMI_VERSION))
$(CMD_PREFIX)rm -f $(install_lib_dir)/librpmi.so.$(LIBRPMI_SOVERSION)
$(CMD_PREFIX)ln -sf librpmi.so.$(LIBRPMI_VERSION) $(install_lib_dir)/librpmi.so.$(LIBRPMI_SOVERSION)
$(CMD_PREFIX)rm -f $(install_lib_dir)/librpmi.so
$(CMD_PREFIX)ln -sf librpmi.so.$(LIBRPMI_SOVERSION) $(install_lib_dir)/librpmi.so
$(call inst_file,$(pkgconfig_dir)/librpmi.pc,$(build_dir)/librpmi.pc)
$(call inst_file,$(install_root_dir)/COPYING.BSD,$(src_dir)/COPYING.BSD)
# Rule for "make clean"
.PHONY: clean
clean:
$(CMD_PREFIX)mkdir -p $(build_dir)
$(if $(V), @echo " RM $(build_dir)/*.o")
$(CMD_PREFIX)find $(build_dir) -type f -name "*.o" -exec rm -rf {} +
$(if $(V), @echo " RM $(build_dir)/*.a")
$(CMD_PREFIX)find $(build_dir) -type f -name "*.a" -exec rm -rf {} +
$(if $(V), @echo " RM $(build_dir)/*.so*")
$(CMD_PREFIX)find $(build_dir) -type f -name "*.so*" -exec rm -rf {} +
$(CMD_PREFIX)find $(build_dir) -type l -name "*.so*" -exec rm -rf {} +
$(CMD_PREFIX)find $(build_dir) -type f -name "*.pc" -exec rm -rf {} +
$(if $(V), @echo " RM $(build_dir)/*.o")
$(CMD_PREFIX)find $(build_dir) -type f -name "*.elf" -exec rm -rf {} +
# Rule for "make distclean"
.PHONY: distclean
distclean: clean
$(CMD_PREFIX)mkdir -p $(build_dir)
$(if $(V), @echo " RM $(build_dir)/*.dep")
$(CMD_PREFIX)find $(build_dir) -type f -name "*.dep" -exec rm -rf {} +
ifeq ($(build_dir),$(CURDIR)/build)
$(if $(V), @echo " RM $(build_dir)")
$(CMD_PREFIX)rm -rf $(build_dir)
endif
ifeq ($(install_root_dir),$(install_root_dir_default))
$(if $(V), @echo " RM $(install_root_dir_default)")
$(CMD_PREFIX)rm -rf $(install_root_dir_default)
endif
.PHONY: docs
docs:
$(CMD_PREFIX)mkdir -p $(docs_dir)
$(CMD_PREFIX)cat docs/doxygen/Doxyfile | sed -e "s#@@SRC_DIR@@#.#" -e "s#@@BUILD_DIR@@#$(build_dir)#" > $(docs_dir)/Doxyfile
$(CMD_PREFIX)doxygen $(docs_dir)/Doxyfile
$(CMD_PREFIX)make -C $(docs_dir)/latex
# Rule for make cleandocs
.PHONY: cleandocs
cleandocs:
$(CMD_PREFIX)rm -rf $(build_dir)/docs
.PHONY: check
check: all
$(CMD_PREFIX)NFAIL=0; \
for test_elf in $(test-elfs-path-y); do \
if [ -f "$$test_elf" ]; then \
echo "--------------------------------------------------"; \
$$test_elf; \
RESULT=$$?; \
if [ $$RESULT -ne 0 ]; then \
NFAIL=$$((NFAIL + 1)); \
fi; \
fi; \
done; \
if [ $$NFAIL -ne 0 ]; then \
exit 1; \
fi
.PHONY: FORCE
FORCE: