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