Support for building all libs via 'make lib'

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.
This commit is contained in:
Norman Feske 2012-01-24 18:56:35 +01:00
parent 91f59690c4
commit b1b59fe8a6
2 changed files with 54 additions and 0 deletions

View File

@ -73,7 +73,28 @@ endif
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

33
base/src/lib/target.mk Normal file
View File

@ -0,0 +1,33 @@
#
# This is a dummy target description file with the sole purpose of building
# all libraries.
#
TARGET = libs
#
# Determine all 'lib/mk' sub directories residing within the repositories.
# Use 'wildcard' to handle the case when a repository does not host any
# 'lib/mk' sub directory.
#
LIB_MK_DIRS := $(wildcard $(addsuffix /lib/mk,$(REPOSITORIES)))
#
# Scan the 'lib/mk' directories of all repositories for library description
# files.
#
ALL_LIB_MK_FILES := $(notdir $(foreach DIR,$(LIB_MK_DIRS),$(shell find $(DIR) -name "*.mk")))
#
# Make the pseudo target depend on all libraries, for which an lib.mk file
# exists. Discard the '.mk' suffix and remove duplicates (via 'sort').
#
LIBS = $(sort $(ALL_LIB_MK_FILES:.mk=))
#
# Among all libraries found above, there may be several libraries with
# unsatisfied build requirements. Normally, the build system won't attempt to
# build the target (and its library dependencies) if one or more libraries
# cannot be built. By enabling 'FORCE_BUILD_LIBS', we let the build system
# visit all non-invalid libraries even in the presence of invalid libraries.
#
FORCE_BUILD_LIBS = yes