Radix cross Linux Toolchains

Toolchains for all supported by Radix cross Linux devices

42 Commits   1 Branch   8 Tags

# include once
ifndef CORE_MK

#######
####### helpful variables
#######

comma := ,
empty :=
space := $(empty) $(empty)


#######
####### Set up TOP_BUILD_DIR, TOP_BUILD_DIR_ABS and BUILDSYSTEM variables
#######

ifndef MAKEFILE_LIST

# Work-around for GNU make pre-3.80, which lacks MAKEFILE_LIST and $(eval ...)

TOP_BUILD_DIR := $(shell perl -e 'for ($$_ = "$(CURDIR)"; ! -d "$$_/build-system"; s!(.*)/(.*)!\1!) { $$q .= "../"; } chop $$q; print "$$q"')
ifeq ($(TOP_BUILD_DIR),)
TOP_BUILD_DIR=.
endif
export TOP_BUILD_DIR_ABS := $(shell perl -e 'for ($$_ = "$(CURDIR)"; ! -d "$$_/build-system"; s!(.*)/(.*)!\1!) { } print')
export BUILDSYSTEM := $(TOP_BUILD_DIR_ABS)/build-system

else

# Normal operation for GNU make 3.80 and above

__pop = $(patsubst %/,%,$(dir $(1)))
__tmp := $(call __pop,$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)))
# Special case for build-system/Makefile
ifeq ($(__tmp),.)
__tmp := ../$(notdir $(CURDIR))
endif

ifndef TOP_BUILD_DIR
TOP_BUILD_DIR := $(call __pop,$(__tmp))
endif

ifndef TOP_BUILD_DIR_ABS
TOP_BUILD_DIR_ABS := $(CURDIR)
ifneq ($(TOP_BUILD_DIR),.)
$(foreach ,$(subst /, ,$(TOP_BUILD_DIR)),$(eval TOP_BUILD_DIR_ABS := $(call __pop,$(TOP_BUILD_DIR_ABS))))
endif
export TOP_BUILD_DIR_ABS
endif

ifndef BUILDSYSTEM
export BUILDSYSTEM := $(TOP_BUILD_DIR_ABS)/$(notdir $(__tmp))
endif

endif

#######
####### Set up SOURCE PACKAGE directory:
#######

export SRC_PACKAGE_DIR      := sources
export SRC_PACKAGE_PATH     := $(TOP_BUILD_DIR)/$(SRC_PACKAGE_DIR)
export SRC_PACKAGE_PATH_ABS := $(TOP_BUILD_DIR_ABS)/$(SRC_PACKAGE_DIR)



#######
####### Config:
#######

include $(BUILDSYSTEM)/config.mk

TOOLCHAIN_ALL = $(strip $(foreach t, $(filter TOOLCHAIN_%,       \
                                 $(filter-out TOOLCHAIN_ALL      \
                                              TOOLCHAIN_NAMES    \
                                              TOOLCHAIN_DIR      \
                                              TOOLCHAIN_PATH     \
                                              TOOLCHAIN_VERSION, \
                                              $(.VARIABLES))), $($(t))))

TOOLCHAIN_NAMES = $(filter-out $(TOOLCHAIN_NOARCH), $(TOOLCHAIN_ALL))

COMPONENT_TOOLCHAINS = $(TOOLCHAIN_ALL)


#######
####### Set up targets etc
#######

ifneq ($(wildcard $(BUILDSYSTEM)/targets-config.mk),)
include $(BUILDSYSTEM)/targets-config.mk
else
include $(BUILDSYSTEM)/targets-config.mk.template
endif

# Reading targets-config.mk:

# BUILD_NOARCH always enabled:
BUILD_NOARCH = true

enabled = $(filter BUILD_%, $(filter-out BUILD_TARGETS BUILD_ARCH, $(.VARIABLES)))

toolchain_filter = $(strip $(foreach t, \
                     $(strip $(foreach b, \
                       $(enabled), $(if $(filter true, $($(b))), \
                         $(subst BUILD_, TOOLCHAIN_, $(b))))), $($(t))))


# If no TOOLCHAIN set
ifeq ($(TOOLCHAIN),)

# COMPONENT_TARGETS must have a value specified in the Makefile
ifeq ($(COMPONENT_TARGETS),)
$(error Error: COMPONENT_TARGETS must have a value)
endif

# End if no TARGET set
endif

# Error ff TOOLCHAIN is invalid
ifneq ($(TOOLCHAIN),)
ifeq ($(filter $(TOOLCHAIN), $(TOOLCHAIN_ALL)),)
$(error Error: TOOLCHAIN is invalid)
endif
endif


#######
####### Filter out disabled targets
#######

COMPONENT_TARGETS := $(filter $(toolchain_filter), $(COMPONENT_TARGETS))


#######
####### Targets setup:
#######

COMPONENT_TOOLCHAINS := $(filter $(COMPONENT_TARGETS),$(COMPONENT_TOOLCHAINS))


#
# TARGET, TOOLCHAIN_PATH variables should be set up for each makefile
#

# If toolchain version is not exported then we use default one 
ifeq ($(TOOLCHAIN_VERSION),)
TOOLCHAIN_VERSION = $(TOOLCHAINS_VERSION)
endif

#
# Setup current toolchain variables
#

TOOLCHAIN_DIR  = $($(shell echo $(TOOLCHAIN) | tr '[a-z-]' '[A-Z_]')_DIR)
TOOLCHAIN_PATH = $($(shell echo $(TOOLCHAIN) | tr '[a-z-]' '[A-Z_]')_PATH)/$(TOOLCHAIN_VERSION)
TARGET         = $($(shell echo $(TOOLCHAIN) | tr '[a-z-]' '[A-Z_]')_ARCH)


#######
####### Configuration:
#######

# Build environment:

DEST_DIR_ABS           = $(TOP_BUILD_DIR_ABS)/dist

ifeq ($(NEEDS_ABS_PATHS),)
DEST_DIR               = $(TOP_BUILD_DIR)/dist
else
DEST_DIR               = $(DEST_DIR_ABS)
endif

TARGET_DEST_DIR        = $(DEST_DIR)/$(TOOLCHAIN)


################################################################
# Check the list of available targets for current Makefile
#
__available_targets =                                                                 \
  $(foreach arch, $(shell echo $(COMPONENT_TOOLCHAINS) | sed -e 's/x86_64/x86-64/g'), \
    $(if $(FLAVOURS),                                                                 \
      $(foreach flavour, $(FLAVOURS),                                                 \
        .target_$(arch)_$(flavour)                                                    \
       ) .target_$(arch),                                                             \
      .target_$(arch)                                                                 \
     )                                                                                \
   )

__available_targets := $(strip $(__available_targets))
__available_targets := $(sort $(__available_targets))
#
#
################################################################



#######
####### Number of CPU cores:
#######

NUMPROCS := 1
OS       := $(shell uname -s)

ifeq ($(OS),Linux)
NUMPROCS := $(shell grep -c ^processor /proc/cpuinfo)
endif


#######
####### Parallel control:
#######

ifneq ($(NO_PARALLEL),)
MAKEFLAGS += -j1
.NOTPARALLEL:
endif

ifeq ($(VERBOSE),)
guiet = @
else
quiet =
endif



#######
####### Default PREFIX:
#######

PREFIX ?= $(DEST_DIR)


#######
####### Setup ccache:
#######

ifeq ($(NO_CCACHE),)
CCACHE = /usr/bin/ccache$(space)

ifeq ($(wildcard $(CCACHE)),)
$(info )
$(info #######)
$(info ####### Please install 'ccache' package)
$(info ####### or disable ccache with "NO_CCACHE=1 make ...")
$(info #######)
$(info )
$(error Error: ccache not found)
endif

ifeq ($(wildcard $(CACHED_CC_OUTPUT)),)
$(info )
$(info #######)
$(info ####### Please create directory $(CACHED_CC_OUTPUT) for cached compiler output)
$(info ####### or disable ccache with "NO_CCACHE=1 make ...")
$(info #######)
$(info )
$(error Error: cached compiler output directory doesn't exist)
endif

export CCACHE_BASEDIR = $(TOP_BUILD_DIR_ABS)
export CCACHE_DIR     = $(CACHED_CC_OUTPUT)
export CCACHE_UMASK   = 000

unexport CCACHE_PREFIX
else
CCACHE =
endif



#######
####### Cleanup files:
#######

CLEANUP_FILES += .dist.*
CLEANUP_FILES += $(addprefix ., $(TOOLCHAIN))
CLEANUP_FILES += .*requires*
CLEANUP_FILES += $(SRC_DIR)
CLEANUP_FILES += $(SRC_DIR).back.??????


#######
####### Build rules:
#######

all: BUILD_TREE := true
export BUILD_TREE

all:
	@$(MAKE) local_all

#
# clean is equal to local_clean
#
clean:
	@$(MAKE) local_clean


__quick_targets := help configure_targets local_clean downloads_clean targets-config.mk $(HACK_TARGETS)


#
# GLOBAL setup targets:
# ====================
#   These targets are built before all targets. For example, source tarballs
#   have to be downloaded before starting the build.
#
#   NOTE:
#     BUILDSYSTEM is a setup target for other directories and the BUILDSYSTEM
#     requires only '.sources' target as a setup target.
#
ifeq ($(filter %_clean,$(MAKECMDGOALS)),)
ifeq ($(shell pwd),$(BUILDSYSTEM))
__setup_targets = .sources
else
__setup_targets = .sources .build_system
endif
endif



.setup:
ifeq ($(__final__),)
.setup: $(__setup_targets)
else
.setup: .makefile
endif


# Check if Makefile has been changed:

.makefile: Makefile
ifneq ($(shell pwd),$(TOP_BUILD_DIR_ABS))
ifneq ($(if $(MAKECMDGOALS),$(filter-out $(__quick_targets),$(MAKECMDGOALS)),true),)
	@touch $@
ifeq ($(shell pwd | grep $(TOP_BUILD_DIR_ABS)/$(SRC_PACKAGE_DIR))$(shell pwd | grep $(BUILDSYSTEM)/3pp/sources),)
	@echo -e "\n======= New makefile ($(<F)), clean! ======="
	@$(MAKE) dist_clean
	@if $(MAKE) local_clean ; then true ; else rm -f $@ ; fi
else
	@if $(MAKE) download_clean ; then true ; else rm -f $@; fi
endif
endif
endif



#######
####### Build directory dependencies into .src_requires  which
####### is used as a Makefile for srource tarballs downloading
#######

.sources: .src_requires

.src_requires_depend: .src_requires ;

.src_requires: .makefile
ifneq ($(shell pwd),$(TOP_BUILD_DIR_ABS))
ifeq ($(filter %_clean,$(MAKECMDGOALS)),)
ifeq ($(__final__),)
	@echo ""
	@echo -e "################################################################"
	@echo -e "#######"
	@echo -e "####### Start of building source requires for '$(subst $(TOP_BUILD_DIR_ABS)/,,$(CURDIR))':"
	@echo -e "#######"
	@$(BUILDSYSTEM)/build_src_requires $(TOP_BUILD_DIR_ABS)
	@__final__= TREE_RULE=local_all $(MAKE) TOOLCHAIN=$(TOOLCHAIN_NOARCH) FLAVOUR= -f .src_requires
	@echo -e "#######"
	@echo -e "####### End of building source requires for '$(subst $(TOP_BUILD_DIR_ABS)/,,$(CURDIR))'."
	@echo -e "#######"
	@echo -e "################################################################"
	@echo ""
	@touch $@
	@touch .src_requires_depend
endif
endif
endif



.build_system:
ifneq ($(shell pwd),$(TOP_BUILD_DIR_ABS))
ifeq ($(shell pwd | grep $(TOP_BUILD_DIR_ABS)/$(SRC_PACKAGE_DIR))$(shell pwd | grep $(BUILDSYSTEM)/3pp/sources),)
ifeq ($(shell pwd | grep $(BUILDSYSTEM)),)
	@echo -e "################################################################"
	@echo -e "#######"
	@echo -e "####### Start to Check the BUILDSYSTEM is ready:"
	@echo -e "#######"
	@( cd $(BUILDSYSTEM) ; __final__= $(MAKE) TOOLCHAIN=$(TOOLCHAIN_HOST) FLAVOUR= all )
	@echo -e "#######"
	@echo -e "####### End of checking the BUILDSYSTEM."
	@echo -e "#######"
	@echo -e "################################################################"
endif
endif
endif



#######
####### Clean up default rules (not depend of TOOLCHAIN):
#######

dist_clean:
	@if [ -f .dist ]; then $(BUILDSYSTEM)/dist_clean $(DEST_DIR); rm .dist; fi


# NOTE:
# ====
#   Do not create directories with names that match the names of architectures!!!
#
tree_clean: .tree_clean

.tree_clean:
	@echo "Tree Clean..."
	@$(BUILDSYSTEM)/tree_clean $(addprefix ., $(TOOLCHAIN_NAMES)) $(TOP_BUILD_DIR_ABS)


#######
####### Clean all downloaded source tarballs
#######

downloads_clean: .downloads_clean

.downloads_clean:
	@echo ""
	@echo -e "#######"
	@echo -e "####### Cleaning Up all downloaded sources..."
	@echo -e "#######"
	@$(BUILDSYSTEM)/downloads_clean $(addprefix ., $(TOOLCHAIN_NOARCH)) $(BUILDSYSTEM)/3pp/sources
ifneq ($(wildcard $(TOP_BUILD_DIR_ABS)/$(SRC_PACKAGE_DIR)),)
	@$(BUILDSYSTEM)/downloads_clean $(addprefix ., $(TOOLCHAIN_NOARCH)) $(TOP_BUILD_DIR_ABS)/$(SRC_PACKAGE_DIR)
endif

help:
	@echo ""
	@echo -e "You can build and install software using command line such as follow:"
	@echo ""
	@echo -e "   $$ [TOOLCHAIN_VERSION=version] [TOOLCHAIN=toolchain] [FLAVOUR=flavour] make [goal]"
	@echo ""
	@echo -e "The following MAKE goals are available:"
	@echo ""
	@echo -e "   all                - perform make build and install software in the all"
	@echo -e "                        required directories which defined by REQUIRES"
	@echo -e "                        variable in the local Makefile;"
	@echo -e "   local_all          - build and install software prepared onlu by local"
	@echo -e "                        Makefile;"
	@echo -e "   dist_clean,"
	@echo -e "   local_dist_clean   - remove distribution packages from target directory"
	@echo -e "                        defined by PRODUCTS_DEST_DIR variable. Note that"
	@echo -e "                        is depends from targets defined by COMPONENT_TARGETS"
	@echo -e "                        variable or command line;"
	@echo -e "   clean,"
	@echo -e "   local_clean        - clean up all built targets by this Makefile;"
	@echo ""
	@echo -e "   If the one from above goals has prefix 'local_' then this goal affects only"
	@echo -e "   current directory.  Otherwise this goal will be performed for all required"
	@echo -e "   directories which defined by REQUIRES variable."
	@echo ""
	@echo -e "   configure_targets  - select toolchains you want to built."
	@echo -e "                        This command edits the targets-config.mk file;"
	@echo ""
	@echo -e "   tree_clean         - clean up whole sourses tree excluding downloaded"
	@echo -e "                        source tarballs;"
	@echo -e "   downloads_clean    - remove all sourse tarball from 'sourses' directory;"
	@echo ""
	@echo -e "Local Makefile is prepared for following target toolchains:"
	@echo ""
	@for toolchain in $(COMPONENT_TARGETS) ; do \
	  echo -e "   $$toolchain"; \
	 done
	@echo ""
	@echo -e "Enjoy."
	@echo ""

configure_targets: $(BUILDSYSTEM)/targets-config.mk
	@BUILDSYSTEM=$(BUILDSYSTEM)              \
	 CONFIG=$(BUILDSYSTEM)/targets-config.mk \
	 CONSTANTS=$(BUILDSYSTEM)/config.mk \
	 $(BUILDSYSTEM)/configure-targets


#######
####### Source archive and patch handling
#######

# Patch dependency:
PATCHES_DEP = $(foreach patch,$(PATCHES),\
	$(shell $(BUILDSYSTEM)/apply_patches $(patch) -dep-))

SRC_DIR_BASE = $(dir $(SRC_DIR))

# Unpack SRC_ARCHIVE in SRC_DIR and backup old SRC_DIR:
UNPACK_SRC_ARCHIVE = \
	@echo "Expanding $(SRC_ARCHIVE)"; \
	if [ -d $(SRC_DIR) ]; then mv $(SRC_DIR) $$(mktemp -d $(SRC_DIR).bak.XXXXXX); fi; \
	mkdir -p $(SRC_DIR_BASE); \
	$(if $(findstring .rpm,$(SRC_ARCHIVE)), \
	  cd $(SRC_DIR_BASE) && rpm2cpio $(SRC_ARCHIVE) | cpio -id --quiet, \
	  $(if $(findstring .zip,$(SRC_ARCHIVE)), \
	    unzip -q -d $(SRC_DIR_BASE) $(SRC_ARCHIVE), \
	    tar $(if $(findstring .bz2,$(SRC_ARCHIVE)),-xjf, \
	             $(if $(findstring .xz,$(SRC_ARCHIVE)),-xJf, \
	             $(if $(findstring .txz,$(SRC_ARCHIVE)),-xJf,-xzf))) \
	      $(SRC_ARCHIVE) -C $(SRC_DIR_BASE))); \
	chmod -R u+w $(SRC_DIR)

# Apply patches in PATCHES on SRC_DIR_BASE:
APPLY_PATCHES = $(quiet)$(foreach patch,$(PATCHES),\
	$(BUILDSYSTEM)/apply_patches $(patch) $(SRC_DIR_BASE) &&) true

# Apply optional patches in OPT_PATCHES on SRC_DIR_BASE:
APPLY_OPT_PATCHES = $(quiet)$(foreach patch,$(OPT_PATCHES),\
	$(BUILDSYSTEM)/apply_patches $(patch) $(SRC_DIR_BASE) &&) true


# Example rule:
#
# src_done = $(SRC_DIR)/.source-done
#
# $(src_done): $(SRC_ARCHIVE) $(PATCHES_DEP)
# 	$(UNPACK_SRC_ARCHIVE)
# 	$(APPLY_PATCHES)
# 	 <other stuff that needs to be done to the source,
# 	   should be empty in most cases>
# 	@touch $@


################################################################
#######
####### Include files with references to BUILD-SYSTEM scripts:
#######

-include $(BUILDSYSTEM)/sbin/.config

#######
####### References to BUILD-SYSTEM scripts.
#######
################################################################




################################################################
#
# No '__final__' target selected:
# ==============================
#
# Parse TOOLCHAIN, HARDWARE, FLAVOUR selected in command line
# and build the list of '__final__' targets.
#
ifeq ($(__final__),)

#
# The FLAVOUR can be defined in command line.
# If command line defines empty flavour FLAVOUR= then
# we define that variable is set but has no values.
#
__cmdline_flavour_defined = $(if $(filter FLAVOUR,$(.VARIABLES)),true,false)
ifeq ($(__cmdline_flavour_defined),true)
__cmdline_flavour_value = $(FLAVOUR)
else
__cmdline_flavour_value =
endif


##################################################
# -----------+---------+-------------------+-----
#  TOOLCHAIN | FLAVOUR | FLAVOUR has VALUE | REF
# -----------+---------+-------------------+-----
#    defined | defined |         no        | (0)
#    defined | defined |         yes       | (1)
#    defined |    ~    |         ~         | (2)
#       ~    | defined |         no        | (3)
#       ~    | defined |         yes       | (4)
#       ~    |    ~    |         ~         | (5)
# -----------+---------+-------------------+-----
##################################################

ifeq ($(TOOLCHAIN),)
ifeq ($(__cmdline_flavour_defined),false)
ifeq ($(FLAVOUR),)
# (5) then we loop over all available flavours
__target_args = $(__available_targets)
endif
else
ifneq ($(FLAVOUR),)
# (4) then we use only one defined flavour
__target_args = $(foreach toolchain,                                                          \
                    $(shell echo $(COMPONENT_TOOLCHAINS) | sed -e 's/x86_64/x86-64/g'),       \
                    .target_$(toolchain)_$(FLAVOUR)                                           \
                 )
else
# (3) then we define flavour as empty
__target_args = $(foreach toolchain,                                                          \
                    $(shell echo $(COMPONENT_TOOLCHAINS) | sed -e 's/x86_64/x86-64/g'),       \
                    .target_$(toolchain)                                                      \
                 )
endif
endif
else
ifeq ($(__cmdline_flavour_defined),false)
ifeq ($(FLAVOUR),)
# (2) then we loop over all available flavours
__target_args = .target_$(shell echo $(TOOLCHAIN) | sed -e 's/x86_64/x86-64/g') $(if $(FLAVOURS), $(foreach flavour, $(FLAVOURS), .target_$(shell echo $(TOOLCHAIN) | sed -e 's/x86_64/x86-64/g')_$(flavour)),)
endif
else
ifneq ($(FLAVOUR),)
# (1) then we use only one defined flavour
__target_args = .target_$(shell echo $(TOOLCHAIN) | sed -e 's/x86_64/x86-64/g')_$(FLAVOUR)
else
# (0) then we define flavour as empty
__target_args = .target_$(shell echo $(TOOLCHAIN) | sed -e 's/x86_64/x86-64/g')
endif
endif
endif


__target_args := $(strip $(__target_args))


__targets = $(filter $(__target_args), $(__available_targets))

# Now we have to sort targets for that the main targets should be built before flavours!
__targets := $(sort $(__targets))


ifeq ($(__targets),)
$(error Error: Selected combination [TOOLCHAIN=$(TOOLCHAIN), FLAVOUR=$(FLAVOUR)] is invalid for this Makefile)
endif


$(__targets): .setup

local_all: GOAL = local_all
local_all: $(__targets)

local_clean: GOAL = local_clean
local_clean: $(__targets)


.target_%: TOOLCHAIN = $(shell echo $(word 2, $(subst _, , $@)) | sed -e 's/x86-64/x86_64/g')
.target_%: FLAVOUR = $(word 3, $(subst _, , $@))
.target_%:
	@echo ""
	@echo "======="
	@echo "======= TOOLCHAIN: $(TOOLCHAIN); FLAVOUR =$(if $(FLAVOUR), $(FLAVOUR));  ====="
	@echo "======="
	@__final__=true $(MAKE) TOOLCHAIN=$(TOOLCHAIN) FLAVOUR=$(FLAVOUR) $(GOAL)

else
#
################################################################
#
# The '__final__' target is defined, run the build process.


# Target is selected, build it

ifneq ($(NO_CREATE_DIST_FILES),true)
local_all: CREATE_DIST_FILES = 1
endif

ifneq ($(findstring $(TOOLCHAIN),$(TOOLCHAIN_NAMES)),)
ifeq ($(shell pwd),$(BUILDSYSTEM))
$(shell mkdir -p .$(TOOLCHAIN))
else
$(shell mkdir -p .$(TOOLCHAIN)$(if $(FLAVOUR),/$(FLAVOUR)))
endif
endif

# TOOLCHAIN/FLAVOUR depended directories

ifneq ($(TOOLCHAIN),$(TOOLCHAIN_NOARCH))
ifeq ($(shell pwd),$(BUILDSYSTEM))
targetflavour = .$(TOOLCHAIN)
else
targetflavour = .$(TOOLCHAIN)$(if $(FLAVOUR),/$(FLAVOUR))
endif
else
targetflavour = $(CURDIR)
endif

TARGET_BUILD_DIR = $(targetflavour)



ifeq ($(BUILD_TREE),true)
_tree := .tree_all
else
_tree := .requires_tree
endif


local_all: $(_tree) install

local_clean:


.tree_all: $(TARGET_BUILD_DIR)/.requires
ifneq ($(shell pwd),$(TOP_BUILD_DIR_ABS))
ifeq ($(shell pwd | grep $(TOP_BUILD_DIR_ABS)/$(SRC_PACKAGE_DIR))$(shell pwd | grep $(BUILDSYSTEM)/3pp/sources),)
	@echo -e "################################################################"
	@echo -e "#######"
ifeq ($(shell pwd),$(BUILDSYSTEM))
	@echo -e "####### Start of building requires for '$(subst $(TOP_BUILD_DIR_ABS)/,,$(CURDIR))':"
else
	@echo -e "####### Start of building requires for TOOLCHAIN=$(TOOLCHAIN) FLAVOUR=$(FLAVOUR) in '$(subst $(TOP_BUILD_DIR_ABS)/,,$(CURDIR))':"
endif
	@echo -e "#######"
ifeq ($(shell pwd),$(BUILDSYSTEM))
	@__final__=true TREE_RULE=local_all $(MAKE) TOOLCHAIN=$(TOOLCHAIN_HOST) FLAVOUR= -f $(TARGET_BUILD_DIR)/.requires
else
	@__final__=true TREE_RULE=local_all $(MAKE) TOOLCHAIN=$(TOOLCHAIN) FLAVOUR= -f $(TARGET_BUILD_DIR)/.requires
endif
	@echo -e "#######"
	@echo -e "####### End of building requires for '$(subst $(TOP_BUILD_DIR_ABS)/,,$(CURDIR))'."
	@echo -e "#######"
	@echo -e "################################################################"
endif
endif


.requires_tree: $(TARGET_BUILD_DIR)/.requires

#######
####### Build directory dependencies into $(TARGET_BUILD_DIR)/.requires
####### file which is used as a Makefile for tree builds.
#######

$(TARGET_BUILD_DIR)/.requires_depend: $(TARGET_BUILD_DIR)/.requires ;

$(TARGET_BUILD_DIR)/.requires: .makefile
ifeq ($(filter %_clean,$(MAKECMDGOALS)),)
ifneq ($(shell pwd),$(TOP_BUILD_DIR_ABS))
ifeq ($(shell pwd | grep $(TOP_BUILD_DIR_ABS)/$(SRC_PACKAGE_DIR))$(shell pwd | grep $(BUILDSYSTEM)/3pp/sources),)
ifeq ($(shell pwd),$(BUILDSYSTEM))
	@$(BUILDSYSTEM)/build_requires $(TOP_BUILD_DIR_ABS) $(TOOLCHAIN_HOST) ; wait
else
	@$(BUILDSYSTEM)/build_requires $(TOP_BUILD_DIR_ABS) $(TOOLCHAIN) $(FLAVOUR) ; wait
endif
endif
endif
endif




################################################################
#######
####### Waiting for build whole required tree:
#######

$(BUILD_TARGETS): | $(_tree)

#######
####### End of waiting for build whole required tree.
#######
################################################################

$(PRODUCT_TARGETS) : | $(BUILD_TARGETS)


#######
####### Install:
#######

install: .install
	@if [ "$$(echo .dist*)" != ".dist*" ]; then \
	  sort -o .dist.tmp -u .dist* && mv .dist.tmp .dist; \
	fi
	@rm -f .dist.*


.install: .install_builds .install_products




.install_builds: $(BUILD_TARGETS)
# Do nothing

.install_products: DO_CREATE_DIST_FILES = $(CREATE_DIST_FILES)
export DO_CREATE_DIST_FILES

.install_products: $(PRODUCT_TARGETS)
ifdef PRODUCT_TARGETS
	@$(BUILDSYSTEM)/install_targets $^ $(PREFIX)/products
endif




#######
####### Clean up default rules:
#######

clean: local_clean

local_clean: .local_clean

.local_clean:
ifeq ($(shell pwd | grep $(TOP_BUILD_DIR_ABS)/$(SRC_PACKAGE_DIR))$(shell pwd | grep $(BUILDSYSTEM)/3pp/sources),)
ifneq ($(wildcard .$(TOOLCHAIN)),)
	@echo "Cleaning... $(TOOLCHAIN)"
	@rm -rf $(CLEANUP_FILES)
endif
endif


-include .src_requires_depend
-include $(TARGET_BUILD_DIR)/.requires_depend


endif
#
# end of ifeq ($(__final__),)
#
################################################################

### Declare some targets as phony

.PHONY: .target*
.PHONY: .setup .sources .build_system .gnat_tools

.PHONY: .tree_all .requites_tree

.PHONY: all local_all .clean local_clean clean
.PHONY: .install

.PHONY: help
.PHONY: downloads_clean
.PHONY: .downloads_clean

.SUFFIXES:



CORE_MK = 1
endif