xref: /optee_os/mk/lib.mk (revision 9f34db38245c9b3a4e6e7e63eb78a75e23ab2da3)
1# Input
2#
3# libname	the name of the lib
4# libdir	directory of lib which also is used as input to
5#		mk/subdir.mk
6# conf-file     [optional] if set, all objects will depend on $(conf-file)
7# [if CFG_ULIBS_SHARED==y]
8#   libuuid	the UUID of the shared lib
9#   libl	other libraries this library depends on; used to generate the
10#               proper link arguments (-Lxxx -lyyy) and to add dependencies
11#               on the needed .so files
12# [endif]
13#
14# Output
15#
16# updated cleanfiles and
17# updated libfiles, libdirs, libnames and libdeps
18
19
20subdirs = $(libdir)
21include mk/subdir.mk
22ifeq ($(filter $(sm), core ldelf),) # TA
23ifeq ($(CFG_ULIBS_MCOUNT),y)
24cflags-lib$(libname)-$(sm) += -pg
25endif
26endif
27include mk/compile.mk
28
29lib-libfile	:= $(out-dir)/$(base-prefix)$(libdir)/lib$(libname).a
30ifeq ($(CFG_ULIBS_SHARED),y)
31lib-shlibfile	:= $(out-dir)/$(base-prefix)$(libdir)/lib$(libname).so
32lib-shlibstrippedfile := $(out-dir)/$(base-prefix)$(libdir)/lib$(libname).stripped.so
33lib-shlibtafile	:= $(out-dir)/$(base-prefix)$(libdir)/$(libuuid).ta
34lib-libuuidln	:= $(out-dir)/$(base-prefix)$(libdir)/$(libuuid).elf
35lib-shlibfile-$(libname)-$(sm) := $(lib-shlibfile)
36lib-libdir-$(libname)-$(sm) := $(out-dir)/$(base-prefix)$(libdir)
37lib-needed-so-files := $(foreach l,$(libl),$(lib-shlibfile-$(l)-$(sm)))
38lib-Ll-args := $(foreach l,$(libl),-L$(lib-libdir-$(l)-$(sm)) -l$(l))
39endif
40cleanfiles	:= $(lib-libfile) $(lib-shlibfile) $(lib-shlibstrippedfile) $(lib-shlibtafile) $(lib-libuuidln) $(cleanfiles)
41libfiles	:= $(lib-libfile) $(lib-shlibfile) $(lib-shlibstrippedfile) $(lib-shlibtafile) $(lib-libuuidln) $(libfiles)
42libdirs 	:= $(out-dir)/$(base-prefix)$(libdir) $(libdirs)
43ifneq (,$(objs))
44libnames	:= $(libname) $(libnames)
45libdeps		:= $(lib-libfile) $(libdeps)
46endif
47
48SIGN = scripts/sign_encrypt.py
49TA_SIGN_KEY ?= keys/default_ta.pem
50
51define process-lib
52ifeq ($(lib-use-ld), y)
53$(lib-libfile): $(objs)
54	@echo '  LD      $$@'
55	@mkdir -p $$(dir $$@)
56	$$(q)$$(LD$(sm)) $(lib-ldflags) -o $$@ $$^
57else
58$(lib-libfile): $(objs)
59	@$(cmd-echo-silent) '  AR      $$@'
60	@mkdir -p $$(dir $$@)
61	$$(q)rm -f $$@ && $$(AR$(sm)) rcs $$@ $$^
62endif
63ifeq ($(CFG_ULIBS_SHARED),y)
64ifeq ($(sm)-$(CFG_TA_BTI),ta_arm64-y)
65lib-ldflags$(lib-shlibfile) += $$(call ld-option,-z force-bti) --fatal-warnings
66endif
67$(lib-shlibfile): $(objs) $(lib-needed-so-files)
68	@$(cmd-echo-silent) '  LD      $$@'
69	@mkdir -p $$(dir $$@)
70	$$(q)$$(LD$(sm)) $(lib-ldflags) -shared -z max-page-size=4096 \
71		$(call ld-option,-z separate-loadable-segments) \
72		$$(lib-ldflags$(lib-shlibfile)) \
73		--soname=$(libuuid) -o $$@ $$(filter-out %.so,$$^) $(lib-Ll-args)
74
75$(lib-shlibstrippedfile): $(lib-shlibfile)
76	@$(cmd-echo-silent) '  OBJCOPY $$@'
77	$$(q)$$(OBJCOPY$(sm)) --strip-unneeded $$< $$@
78
79$(lib-shlibtafile): $(lib-shlibstrippedfile) $(TA_SIGN_KEY)
80	@$(cmd-echo-silent) '  SIGN    $$@'
81	$$(q)$$(PYTHON3) $$(SIGN) --key $(TA_SIGN_KEY) --uuid $(libuuid) --in $$< --out $$@
82
83$(lib-libuuidln): $(lib-shlibfile)
84	@$(cmd-echo-silent) '  LN      $$@'
85	$$(q)ln -sf lib$(libname).so $$@
86endif
87endef #process-lib
88
89$(eval $(call process-lib))
90
91$(objs): $(conf-file)
92
93# Clean residues from processing
94objs		:=
95libname		:=
96libuuid		:=
97lib-use-ld	:=
98lib-shlibfile	:=
99lib-shlibstrippedfile :=
100lib-shlibtafile	:=
101lib-libuuidln	:=
102lib-needed-so-files :=
103libl :=
104