#!/usr/bin/make -rf
# Makefile for crosstool-NG.
# Copyright 2006 Yann E. MORIN <yann.morin.1998@anciens.enib.fr>

# Don't print directory as we descend into them
# Don't use built-in rules, we know what we're doing
MAKEFLAGS += --no-print-directory --no-builtin-rules

# Don't go parallel
.NOTPARALLEL:

# This is where ct-ng is:
export CT_NG:=$(lastword $(MAKEFILE_LIST))
# and this is where we're working in:
export CT_TOP_DIR:=$(shell pwd)

# Paths and values set by ./configure
# Don't bother to change it other than with a new ./configure!
export CT_LIB_DIR:=/usr/local/google/apenwarr/athena/out.mstc/host/usr/lib/ct-ng-1.13.4
export CT_DOC_DIR:=/usr/local/google/apenwarr/athena/out.mstc/host/usr/share/doc/ct-ng-1.13.4

# This is crosstool-NG version string
export CT_VERSION:=1.13.4

# Paths found by ./configure
include $(CT_LIB_DIR)/paths.mk

# Some distributions (eg. Ubuntu) thought it wise to point /bin/sh to
# a truly POSIX-conforming shell, ash in this case. This is not so good
# as we, smart (haha!) developers (as smart we ourselves think we are),
# got used to bashisms, and are enclined to easiness... So force use of
# bash.
export SHELL=$(bash)

# GREP_OPTIONS=--color=always will break the generated .in files
# We do not need any GREP_OPTIONS anyway, so set it to empty.
export GREP_OPTIONS=

# Make the restart/stop steps availabe to scripts/crostool-NG.sh
export CT_STOP:=$(STOP)
export CT_RESTART:=$(RESTART)

SILENT=@
ECHO=echo
ifeq ($(strip $(origin V)),command line)
  ifeq ($(strip $(V)),0)
    SILENT=@
    ECHO=:
  else
    ifeq ($(strip $(V)),1)
      SILENT=
      ECHO=:
    else
      ifeq ($(strip $(V)),2)
        SILENT=
        ECHO=echo
      endif # V == 2
    endif # V== 1
  endif # V == 0
endif # origin V
export V SILENT ECHO

all: help

.PHONY: $(PHONY)
PHONY += all
FORCE:

# Help system
help:: help-head help-config help-samples help-build help-clean help-distrib help-env help-tail

help-head:: version
	@echo  'See below for a list of available actions, listed by category:'

help-config::
	@echo
	@echo  'Configuration actions:'

help-samples::
	@echo
	@echo  'Preconfigured toolchains (#: force number of // jobs):'

help-build::
	@echo
	@echo  'Build actions (#: force number of // jobs):'

help-clean::
	@echo
	@echo  'Clean actions:'

help-distrib::
	@echo
	@echo  'Distribution actions:'

help-env::
	@echo
	@echo  'Environement variables (see /usr/local/google/apenwarr/athena/out.mstc/host/usr/share/doc/ct-ng-1.13.4/0 - Table of content.txt):'

help-tail::
	@echo
	@echo  'Use action "menuconfig" to configure your toolchain'
	@echo  'Use action "build" to build your toolchain'
	@echo  'Use action "version" to see the version'
	@echo  'See "man 1 $(notdir $(CT_NG))" for some help as well'

help-build::
	@echo  '  build[.#]          - Build the currently configured toolchain'

help-clean::
	@echo  '  clean              - Remove generated files'
	@echo  '  distclean          - Remove generated files, configuration and build directories'

include $(CT_LIB_DIR)/config/config.mk
include $(CT_LIB_DIR)/kconfig/kconfig.mk
include $(CT_LIB_DIR)/steps.mk
include $(CT_LIB_DIR)/samples/samples.mk
include $(CT_LIB_DIR)/scripts/scripts.mk

help-config::
	@echo  '  show-tuple         - Print the tuple of the currently configured toolchain'

help-distrib::
	@echo  '  tarball            - Build a tarball of the configured toolchain'

help-env::
	@echo  '  V=0|1|2            - 0 => show only human-readable messages (default)'
	@echo  '                       1 => show only the commands being executed'
	@echo  '                       2 => show both'

# End help system

.config:
	@echo "There is no existing .config file!"
	@echo "You need to either run 'menuconfig',"
	@echo "or configure an existing sample."
	@false

.config.2: .config
	$(SILENT)$(sed) -r -e 's/^([^=]+_ARRAY)="(.*)"$$/\1=( \2 )/;'   \
	                   -e '/^[^=]+_ARRAY=/s/\\(.)/\1/g;'            \
	                $< >$@

show-tuple: .config.2
	$(SILENT)$(bash) $(CT_LIB_DIR)/scripts/showTuple.sh

# Actual build
build: .config.2
	$(SILENT)$(CT_LIB_DIR)/scripts/crosstool-NG.sh

build.%:
	$(SILENT)$(MAKE) -rf $(CT_NG) $(shell echo "$(@)" |$(sed) -r -e 's|^([^.]+)\.([[:digit:]]+)$$|\1 CT_JOBS=\2|;')

PHONY += tarball
#tarball:
#	@$(CT_LIB_DIR)/scripts/tarball.sh
tarball:
	@echo 'Tarball creation disabled for now... Sorry.'
	@true

PHONY += version
version:
	@echo 'This is crosstool-NG version $(CT_VERSION)'
	@echo
	@echo 'Copyright (C) 2008  Yann E. MORIN <yann.morin.1998@anciens.enib.fr>'
	@echo 'This is free software; see the source for copying conditions.'
	@echo 'There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A'
	@echo 'PARTICULAR PURPOSE.'
	@echo

PHONY += clean
clean::
	@$(ECHO) "  CLEAN log"
	$(SILENT)rm -f build.log .config.* ..config*

PHONY += distclean
distclean:: clean
	@$(ECHO) "  CLEAN .config"
	$(SILENT)rm -f .config .config.* ..config*
	@$(ECHO) "  CLEAN build dir"
	$(SILENT)[ ! -d targets ] || chmod -R u+w targets
	$(SILENT)[ ! -d .build  ] || chmod -R u+w .build
	$(SILENT)rm -rf targets .build
