1# Copyright 2016 The Fuchsia Authors
2#
3# Use of this source code is governed by a MIT-style
4# license that can be found in the LICENSE file or at
5# https://opensource.org/licenses/MIT
6
7# check for disallowed options
8ifneq ($(MODULE_DEPS),)
9$(error $(MODULE) $(MODULE_TYPE) modules must use MODULE_{LIBS,STATIC_LIBS}, not MODULE_DEPS)
10endif
11ifneq ($(MODULE_HOST_LIBS)$(MODULE_HOST_SYSLIBS),)
12$(error $(MODULE) $(MODULE_TYPE) modules must not use MODULE_{LIBS,STATIC_LIBS}, not MODULE_HOST_{LIBS,SYSLIBS})
13endif
14
15# default install location
16ifeq ($(MODULE_INSTALL_PATH),)
17MODULE_INSTALL_PATH := bin
18endif
19
20MODULE_USERAPP_OBJECT := $(MODULE_OUTNAME).elf
21ALLUSER_APPS += $(MODULE_USERAPP_OBJECT)
22ALLUSER_MODULES += $(MODULE)
23
24ifeq ($(MODULE_GROUP),)
25$(error $(MODULE): $(MODULE_TYPE) modules must set MODULE_GROUP)
26endif
27
28USER_MANIFEST_LINES += $(MODULE_GROUP)$(MODULE_INSTALL_PATH)/$(MODULE_NAME)=$(addsuffix .strip,$(MODULE_USERAPP_OBJECT))
29
30# These debug info files go in the bootfs image.
31ifeq ($(and $(filter $(subst $(COMMA),$(SPACE),$(BOOTFS_DEBUG_MODULES)),$(MODULE)),yes),yes)
32USER_MANIFEST_DEBUG_INPUTS += $(MODULE_USERAPP_OBJECT)
33endif
34
35MODULE_ALIBS := $(foreach lib,$(MODULE_STATIC_LIBS) $(MODULE_FIDL_LIBS),$(call TOBUILDDIR,$(lib))/lib$(notdir $(lib)).a)
36
37# Link profile runtime into everything compiled with profile instrumentation.
38# The static profile runtime library must come after all static libraries
39# whose instrumented code might call into it.  It depends on libzircon, so
40# make sure we're linking that in if we're not already.
41ifeq ($(strip $(call TOBOOL,$(USE_PROFILE)) \
42	      $(filter $(NO_PROFILE),$(MODULE_COMPILEFLAGS))),true)
43MODULE_ALIBS += $(PROFILE_LIB)
44MODULE_LIBS := $(filter-out system/ulib/zircon,$(MODULE_LIBS)) \
45	       system/ulib/zircon
46endif
47
48MODULE_SOLIBS := $(foreach lib,$(MODULE_LIBS),$(call TOBUILDDIR,$(lib))/lib$(notdir $(lib)).so.abi)
49MODULE_EXTRA_OBJS += $(foreach lib,$(MODULE_FIDL_LIBS),$(call TOBUILDDIR,$(lib))/gen/obj/tables.cpp.o)
50
51# Include this in every link.
52MODULE_EXTRA_OBJS += scripts/dso_handle.ld
53
54# Link the ASan runtime into everything compiled with ASan.
55ifeq (,$(filter -fno-sanitize=all,$(MODULE_COMPILEFLAGS)))
56MODULE_EXTRA_OBJS += $(ASAN_SOLIB)
57endif
58
59$(MODULE_USERAPP_OBJECT): _OBJS := $(USER_SCRT1_OBJ) $(MODULE_OBJS) $(MODULE_EXTRA_OBJS)
60$(MODULE_USERAPP_OBJECT): _LIBS := $(MODULE_ALIBS) $(MODULE_SOLIBS)
61$(MODULE_USERAPP_OBJECT): _LDFLAGS := $(MODULE_LDFLAGS) $(USERAPP_LDFLAGS)
62$(MODULE_USERAPP_OBJECT): $(USER_SCRT1_OBJ) $(MODULE_OBJS) $(MODULE_EXTRA_OBJS) $(MODULE_ALIBS) $(MODULE_SOLIBS)
63	@$(MKDIR)
64	$(call BUILDECHO,linking userapp $@)
65	$(NOECHO)$(USER_LD) $(GLOBAL_LDFLAGS) $(ARCH_LDFLAGS) $(_LDFLAGS) \
66		$(_OBJS) --start-group $(_LIBS) --end-group $(LIBGCC) -o $@
67
68EXTRA_IDFILES += $(MODULE_USERAPP_OBJECT).id
69
70# build list and debugging files if asked to
71ifeq ($(ENABLE_BUILD_LISTFILES),true)
72EXTRA_BUILDDEPS += $(MODULE_USERAPP_OBJECT).lst
73EXTRA_BUILDDEPS += $(MODULE_USERAPP_OBJECT).sym
74GENERATED += $(MODULE_USERAPP_OBJECT).lst
75GENERATED += $(MODULE_USERAPP_OBJECT).sym
76endif
77