mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-22 15:02:25 +00:00
b1b59fe8a6
Normally, the build system creates libraries as mere side effects of building targets. There is no way to explicitly trigger the build of libraries only. However, in some circumstances (for example for testing the thorough build of all libraries) a mechanism for explicitly building libraries would be convenient. This patch implements this feature. It consists of two changes. The new pseudo target at 'base/src/lib/target.mk' gathers all libraries that are available in all repositories specified for the build directory and makes its target depend on them. This way, by building 'lib', all libraries would be traversed. However, in the (likely) situation that those libraries include one or more invalid libraries (libraries with unsatisfied build requirements), the build system would skip the target. Hence, the second change introduces a new condition 'FORCE_BUILD_LIBS' to the build system. By setting this variable to 'yes' in the 'target.mk' file, we let the build system to traverse library dependencies for all valid libraries regardless of the presence of any invalid library.
101 lines
3.3 KiB
Makefile
101 lines
3.3 KiB
Makefile
#
|
|
# Prevent execution of any rule contained in $(TARGET_MK) as default rule
|
|
#
|
|
all:
|
|
|
|
#
|
|
# Utility for selecting files from the list of repositories
|
|
#
|
|
select_from_repositories = $(firstword $(foreach REP,$(REPOSITORIES),$(wildcard $(REP)/$(1))))
|
|
|
|
#
|
|
# Include target build instructions to aquire library dependecies
|
|
#
|
|
PRG_DIR := $(dir $(TARGET_MK))
|
|
include $(TARGET_MK)
|
|
|
|
#
|
|
# Enforce use of 'lx_hybrid' library for all targets when 'always_hybrid' is
|
|
# enabled
|
|
#
|
|
ifeq ($(filter-out $(SPECS),always_hybrid),)
|
|
LIBS += lx_hybrid
|
|
endif
|
|
|
|
#
|
|
# Include lib-import description files
|
|
#
|
|
include $(foreach LIB,$(LIBS),$(call select_from_repositories,lib/import/import-$(LIB).mk))
|
|
|
|
#
|
|
# Add globally defined library supplements
|
|
#
|
|
include $(SPEC_FILES)
|
|
LIBS += $(PRG_LIBS)
|
|
|
|
#
|
|
# Determine location of $(TARGET_MK) within 'src/', remove trailing slash
|
|
#
|
|
PRG_REL_DIR := $(subst $(REP_DIR)/src/,,$(PRG_DIR))
|
|
PRG_REL_DIR := $(PRG_REL_DIR:/=)
|
|
|
|
#
|
|
# Prevent generation of program rule if requirements are unsatisfied
|
|
#
|
|
UNSATISFIED_REQUIREMENTS = $(filter-out $(SPECS),$(REQUIRES))
|
|
ifneq ($(UNSATISFIED_REQUIREMENTS),)
|
|
all:
|
|
@$(ECHO) "Skip target $(PRG_REL_DIR) because it requires $(DARK_COL)$(UNSATISFIED_REQUIREMENTS)$(DEFAULT_COL)"
|
|
else
|
|
all: gen_prg_rule
|
|
endif
|
|
|
|
include $(LIB_PROGRESS_LOG)
|
|
LIBS_TO_VISIT = $(filter-out $(LIBS_READY),$(LIBS))
|
|
|
|
#
|
|
# Generate program rule
|
|
#
|
|
gen_prg_rule:
|
|
ifneq ($(LIBS),)
|
|
@(echo "DEP_$(TARGET).prg = $(foreach l,$(LIBS),$l.lib \$$(DEP_$l.lib))"; \
|
|
echo "") >> $(LIB_DEP_FILE)
|
|
endif
|
|
@(echo "$(TARGET).prg: $(addsuffix .lib,$(LIBS))"; \
|
|
echo " @\$$(MKDIR) -p $(PRG_REL_DIR)"; \
|
|
echo " \$$(VERBOSE_MK)\$$(MAKE) $(VERBOSE_DIR) -C $(PRG_REL_DIR) -f \$$(BASE_DIR)/mk/prg.mk \\"; \
|
|
echo " REP_DIR=$(REP_DIR) \\"; \
|
|
echo " PRG_REL_DIR=$(PRG_REL_DIR) \\"; \
|
|
echo " BUILD_BASE_DIR=$(BUILD_BASE_DIR) \\"; \
|
|
echo " DEPS=\"\$$(DEP_$(TARGET).prg)\" \\"; \
|
|
echo " SHELL=$(SHELL) \\"; \
|
|
echo " INSTALL_DIR=\"\$$(INSTALL_DIR)\""; \
|
|
echo "") >> $(LIB_DEP_FILE)
|
|
@for i in $(LIBS_TO_VISIT); do \
|
|
$(MAKE) $(VERBOSE_DIR) -f $(BASE_DIR)/mk/dep_lib.mk REP_DIR=$(REP_DIR) LIB=$$i; done
|
|
#
|
|
# Make 'all' depend on the target, which triggers the building of the target
|
|
# and the traversal of the target's library dependencies. But we only do so
|
|
# if the target does not depend on any library with unsatisfied build
|
|
# requirements. In such a case, the target cannot be linked anyway.
|
|
#
|
|
@(echo ""; \
|
|
echo "ifeq (\$$(filter \$$(DEP_$(TARGET).prg:.lib=),\$$(INVALID_DEPS)),)"; \
|
|
echo "all: $(TARGET).prg"; \
|
|
echo "endif") >> $(LIB_DEP_FILE)
|
|
#
|
|
# Normally, if the target depends on a library, which cannot be built (such
|
|
# libraries get recorded in the 'INVALID_DEPS' variable), we skip the target
|
|
# altogether. In some cases, however, we want to build all non-invalid
|
|
# libraries of a target regardless of whether the final target can be created
|
|
# or not. (i.e., for implementing the mechanism for building all libraries,
|
|
# see 'base/src/lib/target.mk'). This use case is supported via the
|
|
# 'FORCE_BUILD_LIBS' variable. If the 'target.mk' file assigns the value
|
|
# 'yes' to this variable, we build all non-invalid libraries regardless of
|
|
# the validity of the final target.
|
|
#
|
|
ifeq ($(FORCE_BUILD_LIBS),yes)
|
|
@(echo ""; \
|
|
echo "all: \$$(addsuffix .lib,\$$(filter-out \$$(INVALID_DEPS), $(LIBS)))") >> $(LIB_DEP_FILE)
|
|
endif
|