crosstool-ng/ct-ng.in
Alexey Neyman 355f6f03fb Cannot ignore 'make install' with automake
Automake does not allow us to place the hooks before its generated actions,
and does not allow us to check MAKECMDGOALS, and does not support a mechanism
for disabling make install (such as noinst_SUBDIRS, requested a few times
on automake mailing list). The only way I could preserve the current behavior
is to have a GNUmakefile wrapper that will convert MAKECMDGOAL into a variable
unknown to automake - which seems too convoluted a solution for the problem
being solved.

Hence the approach is to not override anything for --enable-local. It is now
fully handled by selecting different values for CT_xxx_DIR in ct-ng.in; but
at the build-system level, all the variables remain the same. We just don't
support 'make install' in that case anymore; but the ct-ng in the working
copy can be used after a regular 'make' (or 'make all').

Help message for --enable-local updated accordingly.

Signed-off-by: Alexey Neyman <stilor@att.net>
2018-04-07 12:03:17 -07:00

315 lines
10 KiB
Plaintext

#!@MAKE@ -rf
# Makefile for crosstool-NG.
# Copyright 2006 Yann E. MORIN <yann.morin.1998@free.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:=$(abspath $(lastword $(MAKEFILE_LIST)))
# and this is where we're working in:
export CT_TOP_DIR:=$(shell pwd)
ifeq (@enable_local@,yes)
# automake does not allow to set pkgxxxdir, they are always derived from
# a respective xxxdir. So, for enable-local case, set them directly here.
export CT_LIB_DIR:=$(CT_TOP_DIR)
export CT_LIBEXEC_DIR:=$(CT_TOP_DIR)/kconfig
export CT_DOC_DIR:=$(CT_TOP_DIR)/docs
else
# Paths and values set by ./configure
# Don't bother to change it other than with a new ./configure!
export CT_LIB_DIR:=@pkgdatadir@
export CT_LIBEXEC_DIR:=@pkglibexecdir@
export CT_DOC_DIR:=@docdir@
endif
# This is crosstool-NG version string
export CT_VERSION:=@PACKAGE_VERSION@
# Download agents used by scripts.mk
CT_WGET := @wget@
CT_CURL := @curl@
# Paths found by ./configure
export install = @INSTALL@
export bash = @BASH_SHELL@
export awk = @AWK@
export grep = @GREP@
export make = @MAKE@
export sed = @SED@
export libtool = @LIBTOOL@
export libtoolize = @LIBTOOLIZE@
export objcopy = @OBJCOPY@
export objdump = @OBJDUMP@
export readelf = @READELF@
export patch = @PATCH@
# 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 inclined to easiness... So force use of
# bash.
export SHELL=$(bash)
# Make the restart/stop steps available to scripts/crostool-NG.sh
export CT_STOP:=$(STOP)
export CT_RESTART:=$(RESTART)
SILENT=@
CT_ECHO=echo
ifeq ($(strip $(origin V)),command line)
ifeq ($(strip $(V)),0)
SILENT=@
CT_ECHO=:
else
ifeq ($(strip $(V)),1)
SILENT=
CT_ECHO=:
else
ifeq ($(strip $(V)),2)
SILENT=
CT_ECHO=echo
endif # V == 2
endif # V== 1
endif # V == 0
endif # origin V
export V SILENT CT_ECHO
all: help
.PHONY: $(PHONY)
PHONY += all
FORCE:
# Configuration rules. Currently, saveSample.sh uses some of the variables
# below - they should be passed explicitly.
# Top file of crosstool-NG configuration
export KCONFIG_TOP = $(CT_LIB_DIR)/config/config.in
# We need CONF for savedefconfig in scripts/saveSample.sh
export CONF := $(CT_LIBEXEC_DIR)/conf
MCONF := $(CT_LIBEXEC_DIR)/mconf
NCONF := $(CT_LIBEXEC_DIR)/nconf
# Used by conf/mconf/nconf to find the .in files
# TBD needed? We do supply the defconfig name explicitly below
export srctree=$(CT_LIB_DIR)
.PHONY: menuconfig nconfig oldconfig savedefconfig defconfig
menuconfig:
@$(CT_ECHO) " CONF $@"
$(SILENT)$(MCONF) $(KCONFIG_TOP)
nconfig:
@$(CT_ECHO) " CONF $@"
$(SILENT)$(NCONF) $(KCONFIG_TOP)
oldconfig: .config
@$(CT_ECHO) " CONF $@"
$(SILENT)$(sed) -i -r -f $(CT_LIB_DIR)/scripts/upgrade.sed $<
$(SILENT)$(CONF) --silent$@ $(KCONFIG_TOP)
savedefconfig: .config
@$(CT_ECHO) ' GEN $@'
$(SILENT)$(CONF) --savedefconfig=$${DEFCONFIG-defconfig} $(KCONFIG_TOP)
defconfig:
@$(CT_ECHO) ' CONF $@'
$(SILENT)$(CONF) --defconfig=$${DEFCONFIG-defconfig} $(KCONFIG_TOP)
# Always be silent, the stdout an be >.config
extractconfig:
@$(awk) 'BEGIN { dump=0; } \
dump==1 && $$0~/^\[.....\][[:space:]]+(# )?CT_/ { \
$$1=""; \
gsub("^[[:space:]]",""); \
print; \
} \
$$0~/Dumping user-supplied crosstool-NG configuration: done in/ { \
dump=0; \
} \
$$0~/Dumping user-supplied crosstool-NG configuration$$/ { \
dump=1; \
}'
# 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):'
@echo ' list-steps - List all build steps'
help-clean::
@echo
@echo 'Clean actions:'
help-distrib::
@echo
@echo 'Distribution actions:'
help-env::
@echo
@if [ -r "@docdir@/manual/4_Building.md" ]; then \
echo 'Environment variables (see @docdir@/0 - Table of content.txt):'; \
else \
echo 'Environment variables (see http://crosstool-ng.github.io/docs/build/)'; \
fi
@echo ' STOP=step - Stop the build just after this step (list with list-steps)'
@echo ' RESTART=step - Restart the build just before this step (list with list-steps)'
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 ' source - Download sources for currently configured toolchain'
@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)/samples/samples.mk
include $(CT_LIB_DIR)/scripts/scripts.mk
help-config::
@echo ' menuconfig - Update current config using a menu based program'
@echo ' nconfig - Update current config using a menu based program'
@echo ' oldconfig - Update current config using a provided .config as base'
@echo ' extractconfig - Extract to stdout the configuration items from a'
@echo ' build.log file piped to stdin'
@echo ' savedefconfig - Save current config as a mini-defconfig to $${DEFCONFIG}'
@echo ' defconfig - Update config from a mini-defconfig $${DEFCONFIG}'
@echo ' (default: $${DEFCONFIG}=./defconfig)'
@echo ' show-tuple - Print the tuple of the currently configured toolchain'
help-distrib::
help-env::
@echo ' V=0|1|2|<unset> - <unset> show only human-readable messages (default)'
@echo ' 0 => do not show commands or human-readable message'
@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
show-tuple: .config
$(SILENT)$(bash) $(CT_LIB_DIR)/scripts/show-tuple.sh '$${CT_TARGET}'
# Actual build
source: .config
$(SILENT)CT_SOURCE=y $(bash) $(CT_LIB_DIR)/scripts/crosstool-NG.sh
build: .config
$(SILENT)BUILD_NCPUS=`@@CT_cpucount@@ 2>/dev/null || echo 0` \
$(bash) $(CT_LIB_DIR)/scripts/crosstool-NG.sh
build.%:
$(SILENT)$(MAKE) -rf $(CT_NG) build CT_JOBS=$*
# The _for_build steps are noop for native and cross,
# but are actual steps for canadian and cross-native.
# Please keep the last line with a '\' and keep the following empty line:
# it helps when diffing and merging.
CT_STEPS := \
companion_tools_for_build \
companion_libs_for_build \
binutils_for_build \
companion_tools_for_host \
companion_libs_for_host \
binutils_for_host \
cc_core_pass_1 \
kernel_headers \
libc_start_files \
cc_core_pass_2 \
libc \
cc_for_build \
cc_for_host \
libc_post_cc \
companion_libs_for_target \
binutils_for_target \
debug \
test_suite \
finish \
# Keep an empty line above this comment, so the last
# back-slash terminated line works as expected.
# Make the list available to sub-processes (scripts/crosstool-NG.sh needs it)
export CT_STEPS
# Print the steps list
PHONY += list-steps
list-steps:
@echo 'Available build steps, in order:'
@for step in $(CT_STEPS); do \
echo " - $${step}"; \
done
@echo 'Use "<step>" as action to execute only that step.'
@echo 'Use "+<step>" as action to execute up to that step.'
@echo 'Use "<step>+" as action to execute from that step onward.'
# ----------------------------------------------------------
# This part deals with executing steps
$(CT_STEPS):
$(SILENT)$(MAKE) -rf $(CT_NG) V=$(V) RESTART=$@ STOP=$@ build
$(patsubst %,+%,$(CT_STEPS)):
$(SILENT)$(MAKE) -rf $(CT_NG) V=$(V) STOP=$(patsubst +%,%,$@) build
$(patsubst %,%+,$(CT_STEPS)):
$(SILENT)$(MAKE) -rf $(CT_NG) V=$(V) RESTART=$(patsubst %+,%,$@) build
PHONY += version
version:
@echo 'This is crosstool-NG version $(CT_VERSION)'
@echo
@echo 'Copyright (C) 2008 Yann E. MORIN <yann.morin.1998@free.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::
@$(CT_ECHO) " CLEAN log"
$(SILENT)rm -f build.log
@$(CT_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 .build-all
PHONY += distclean
distclean:: clean
@$(CT_ECHO) " CLEAN .config"
$(SILENT)rm -f .config .config.* ..config*