genode/repos/base/mk/prg.mk
Martin Stein fb2398dbf2 run: target-specific config schemata
The run tool now by default checks configurations with target-specific
XML schemata. Each component may define a config schema file in its
target.mk via the CONFIG_XSD variable. When the run tool has checked an
configuration of an init instance, it additionally goes through the
start nodes of the config. For each start node it checks whether there
is an XSD file that matches. If so, the run tool also checks the config
of the start node (if existant). This is done recursively. I.e., also
the child configs of a sub-init of a sub-init of the top-level init
receive a config check.

Issue #2600
2017-12-21 15:01:36 +01:00

222 lines
5.9 KiB
Makefile

##
## Rules for building a program target
##
## The following variables must be passed when calling this file:
##
## BASE_DIR - base directory of the build system
## REP_DIR - source repository of the program
## PRG_REL_DIR - directory of the program relative to 'src/'
## REPOSITORIES - repositories providing libs and headers
## INSTALL_DIR - installation directory for stripped executables
## DEBUG_DIR - installation directory for unstripped executables
## VERBOSE - build verboseness modifier
## VERBOSE_DIR - verboseness modifier for changing directories
## VERBOSE_MK - verboseness of make calls
## SHARED_LIBS - shared-library dependencies of the target
## ARCHIVES - archive dependencies of the target
## LIB_CACHE_DIR - library build cache location
##
#
# Prevent target.mk rules to be executed as default rule
#
all:
#
# Include common utility functions
#
include $(BASE_DIR)/mk/util.inc
#
# Include target build instructions
#
PRG_DIR := $(REP_DIR)/src/$(PRG_REL_DIR)
include $(PRG_DIR)/target.mk
#
# Include lib-import description files
#
include $(foreach LIB,$(LIBS),$(call select_from_repositories,lib/import/import-$(LIB).mk))
#
# Include specifics for platforms, kernel APIs, etc.
#
include $(SPEC_FILES)
vpath % $(PRG_DIR)
include $(BASE_DIR)/mk/global.mk
#
# Assemble linker options for static and dynamic linkage
#
LD_TEXT_ADDR ?= 0x01000000
ifneq ($(LD_TEXT_ADDR),)
CXX_LINK_OPT += -Wl,-Ttext=$(LD_TEXT_ADDR)
endif
#
# Supply machine-dependent arguments to the linker
#
CXX_LINK_OPT += $(CC_MARCH)
#
# Generic linker script for statically linked binaries
#
ifneq ($(filter linux, $(SPECS)),)
LD_SCRIPT_STATIC ?= $(BASE_DIR)/src/ld/genode.ld \
$(call select_from_repositories,src/ld/stack_area.ld)
else
LD_SCRIPT_STATIC ?= $(BASE_DIR)/src/ld/genode.ld
endif
include $(BASE_DIR)/mk/generic.mk
include $(BASE_DIR)/mk/base-libs.mk
all: message $(TARGET)
ifneq ($(INSTALL_DIR),)
ifneq ($(DEBUG_DIR),)
all: message $(INSTALL_DIR)/$(TARGET) $(DEBUG_DIR)/$(TARGET)
endif
endif
all:
@true # prevent nothing-to-be-done message
.PHONY: message
message:
$(MSG_PRG)$(PRG_REL_DIR)/$(TARGET)
#
# Enforce unconditional call of gnatmake rule when compiling Ada sources
#
# Citation from texinfo manual for make:
#
# If a rule has no prerequisites or commands, and the target of the rule
# is a nonexistent file, then `make' imagines this target to have been
# updated whenever its rule is run. This implies that all targets
# depending on this one will always have their commands run.
#
FORCE:
$(SRC_ADA:.adb=.o): FORCE
#
# Use CXX for linking
#
LD_CMD ?= $(CXX)
LD_CMD += $(CXX_LINK_OPT)
ifeq ($(SHARED_LIBS),)
LD_SCRIPTS := $(LD_SCRIPT_STATIC)
else
#
# Add a list of symbols that shall always be added to the dynsym section
#
LD_OPT += --dynamic-list=$(BASE_DIR)/src/ld/genode_dyn.dl
LD_SCRIPTS := $(LD_SCRIPT_DYN)
LD_CMD += -Wl,--dynamic-linker=$(DYNAMIC_LINKER).lib.so \
-Wl,--eh-frame-hdr -Wl,-rpath-link=.
#
# Filter out the base libraries since they will be provided by the LDSO library
#
override ARCHIVES := $(filter-out $(BASE_LIBS:=.lib.a),$(ARCHIVES))
endif
#
# LD_SCRIPT_PREFIX is needed as 'addprefix' chokes on prefixes containing
# commas othwerwise. For compatibilty with older tool chains, we use two -Wl
# parameters for both components of the linker command line.
#
LD_SCRIPT_PREFIX := -Wl,-T -Wl,
#
# LD_SCRIPTS may be a list of linker scripts (e.g., in base-linux). Further,
# we use the default linker script if none was specified - 'addprefix' expands
# to empty string on empty input.
#
LD_CMD += $(addprefix $(LD_SCRIPT_PREFIX), $(LD_SCRIPTS))
STATIC_LIBS := $(foreach l,$(ARCHIVES:.lib.a=),$(LIB_CACHE_DIR)/$l/$l.lib.a)
#
# We need the linker option '--whole-archive' to make sure that all library
# constructors marked with '__attribute__((constructor))' end up int the
# binary. When not using this option, the linker goes through all libraries
# to resolve a symbol and, if it finds the symbol, stops searching. This way,
# object files that are never explicitly referenced (such as library
# constructors) would not be visited at all.
#
# Furthermore, the '--whole-archive' option reveals symbol ambiguities, which
# would go undetected if the search stops after the first match.
#
LINK_ITEMS := $(OBJECTS) $(STATIC_LIBS) $(SHARED_LIBS)
LINK_ITEMS_BRIEF := $(subst $(LIB_CACHE_DIR),$$libs,$(LINK_ITEMS))
#
# Trigger the build of host tools
#
$(LINK_ITEMS) $(TARGET): $(HOST_TOOLS)
LD_CMD += -Wl,--whole-archive -Wl,--start-group
LD_CMD += $(LINK_ITEMS_BRIEF)
LD_CMD += $(EXT_OBJECTS)
LD_CMD += -Wl,--no-whole-archive
LD_CMD += -Wl,--end-group
#
# Link libgcc to each program
#
LD_LIBGCC ?= $(shell $(CC) $(CC_MARCH) -print-libgcc-file-name)
LD_CMD += $(LD_LIBGCC)
#
# If available, link XML schema file for checking configurations
#
ifneq ($(CONFIG_XSD),)
all: $(INSTALL_DIR)/$(TARGET).xsd
$(INSTALL_DIR)/$(TARGET).xsd: $(PRG_DIR)/$(CONFIG_XSD)
$(VERBOSE)ln -sf $< $@
endif
#
# Skip final linking if no objects are involved, i.e. no 'SRC' files are
# specified in the 'target.mk' file. This applies for pseudo 'target.mk'
# files that invoke a 3rd-party build system by providing local rule for
# $(TARGET).
#
ifneq ($(OBJECTS),)
$(TARGET): $(LINK_ITEMS) $(wildcard $(LD_SCRIPTS)) $(LIB_SO_DEPS)
$(MSG_LINK)$(TARGET)
$(VERBOSE)libs=$(LIB_CACHE_DIR); $(LD_CMD) -o $@
STRIP_TARGET_CMD ?= $(STRIP) -o $@ $<
$(TARGET).stripped: $(TARGET)
$(VERBOSE)$(STRIP_TARGET_CMD)
$(INSTALL_DIR)/$(TARGET): $(TARGET).stripped
$(VERBOSE)ln -sf $(CURDIR)/$< $@
ifneq ($(DEBUG_DIR),)
$(DEBUG_DIR)/$(TARGET): $(TARGET)
$(VERBOSE)ln -sf $(CURDIR)/$< $@
endif
else
$(TARGET):
$(INSTALL_DIR)/$(TARGET): $(TARGET)
$(DEBUG_DIR)/$(TARGET): $(TARGET)
endif
clean_prg_objects:
$(MSG_CLEAN)$(PRG_REL_DIR)
$(VERBOSE)$(RM) -f $(OBJECTS) $(OBJECTS:.o=.d) $(TARGET) $(TARGET).stripped
$(VERBOSE)$(RM) -f *.d *.i *.ii *.s *.ali *.lib.so
clean: clean_prg_objects