mirror of
https://github.com/crosstool-ng/crosstool-ng.git
synced 2024-12-23 14:42:26 +00:00
d2bc2be8db
On OS X, Apple supply an old gperf (3.0.3) with xcode and xcode commandline tools which causes build failures: ./zconf.hash.c:183:17: error: expected expression {offsetof(struct kconf_id_strings_t, kconf_id_strings_str2), .. upgrading to gperf 3.0.4 was sufficient to fix this, so this option allows the user to specify the gperf program that they wish to use. To install gperf 3.0.4 from homebrew, I did: brew tap homebrew/dupes brew install homebrew/dupes/gperf .. then passed --with-gperf=$BREWFIX/Cellar/gperf/3.0.4/bin/gperf to configure Signed-off-by: Ray Donnelly <mingw.android@gmail.com> Message-Id: <CAOYw7dtCmcJ9WiqmQ81MmZeRPcV-tDOqe9=kRDW4uQGuZNd2Ng@mail.gmail.com> Patchwork-Id: 274892
407 lines
13 KiB
Makefile
407 lines
13 KiB
Makefile
# Makefile.in for building crosstool-NG
|
|
# This file serves as source for the ./configure operation
|
|
|
|
# This series of test is here because GNU make 3.81 will *not* use MAKEFLAGS
|
|
# to set additional flags in the current Makfile ( see:
|
|
# http://savannah.gnu.org/bugs/?20501 ), although the make manual says it
|
|
# should ( see: http://www.gnu.org/software/make/manual/make.html#Options_002fRecursion )
|
|
# so we have to work it around by calling ourselves back if needed
|
|
|
|
# So why do we need not to use the built rules and variables? Because we
|
|
# need to generate scripts/crosstool-NG.sh from scripts/crosstool-NG.sh.in
|
|
# and there is a built-in implicit rule '%.sh:' that has neither a pre-requisite
|
|
# nor a command associated, and that built-in implicit rule takes precedence
|
|
# over our non-built-in implicit rule '%: %.in', below.
|
|
|
|
# CT_MAKEFLAGS will be used later, below...
|
|
|
|
# Do not print directories as we descend into them
|
|
ifeq ($(filter --no-print-directory,$(MAKEFLAGS)),)
|
|
CT_MAKEFLAGS += --no-print-directory
|
|
endif
|
|
|
|
# Use neither builtin rules, nor builtin variables
|
|
# Note: dual test, because if -R and -r are given on the command line
|
|
# (who knows?), MAKEFLAGS contains 'Rr' instead of '-Rr', while adding
|
|
# '-Rr' to MAKEFLAGS adds it literaly ( and does not add 'Rr' )
|
|
# Further: quad test because the flags 'rR' and '-rR' can be reordered.
|
|
ifeq ($(filter Rr,$(MAKEFLAGS)),)
|
|
ifeq ($(filter -Rr,$(MAKEFLAGS)),)
|
|
ifeq ($(filter rR,$(MAKEFLAGS)),)
|
|
ifeq ($(filter -rR,$(MAKEFLAGS)),)
|
|
CT_MAKEFLAGS += -Rr
|
|
endif # No -rR
|
|
endif # No rR
|
|
endif # No -Rr
|
|
endif # No Rr
|
|
|
|
# Remove any suffix rules
|
|
.SUFFIXES:
|
|
|
|
all: Makefile build
|
|
|
|
###############################################################################
|
|
# Configuration variables
|
|
|
|
# Stuff found by ./configure
|
|
export DATE := @DATE@
|
|
export LOCAL := @enable_local@
|
|
export PROG_SED := @program_transform_name@
|
|
export PACKAGE_TARNAME := @PACKAGE_TARNAME@
|
|
export VERSION := @PACKAGE_VERSION@
|
|
export prefix := @prefix@
|
|
export exec_prefix := @exec_prefix@
|
|
export bindir := @bindir@
|
|
export libdir := @libdir@@sublibdir@
|
|
export docdir := @docdir@@subdocdir@
|
|
export mandir := @mandir@
|
|
export datarootdir := @datarootdir@
|
|
export install := @INSTALL@
|
|
export bash := @_BASH@
|
|
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@
|
|
export gperf := @GPERF@
|
|
export CC := @CC@
|
|
export CPP := @CPP@
|
|
export CPPFLAGS := @CPPFLAGS@
|
|
export CFLAGS := @CFLAGS@
|
|
export LDFLAGS := @LDFLAGS@
|
|
export LIBS := @LIBS@
|
|
export curses_hdr := @ac_ct_curses_hdr@
|
|
export gettext := @gettext@
|
|
|
|
# config options to push down to kconfig
|
|
KCONFIG:= @kconfig_options@
|
|
|
|
###############################################################################
|
|
# Non-configure variables
|
|
MAN_SECTION := 1
|
|
MAN_SUBDIR := /man$(MAN_SECTION)
|
|
|
|
PROG_NAME := $(shell echo 'ct-ng' |$(sed) -r -e '$(PROG_SED)' )
|
|
|
|
###############################################################################
|
|
# Sanity checks
|
|
|
|
# Check if Makefile is up to date:
|
|
Makefile: Makefile.in
|
|
@echo "$< did changed: you must re-run './configure'"
|
|
@false
|
|
|
|
# If installing with DESTDIR, check it's an absolute path
|
|
ifneq ($(strip $(DESTDIR)),)
|
|
ifneq ($(DESTDIR),$(abspath /$(DESTDIR)))
|
|
$(error DESTDIR is not an absolute PATH: '$(DESTDIR)')
|
|
endif
|
|
endif
|
|
|
|
###############################################################################
|
|
# Global make rules
|
|
|
|
# If any extra MAKEFLAGS were added, re-run ourselves
|
|
# See top of file for an explanation of why this is needed...
|
|
ifneq ($(strip $(CT_MAKEFLAGS)),)
|
|
|
|
# Somehow, the new auto-completion for make in the recent distributions
|
|
# trigger a behavior where our Makefile calls itself recursively, in a
|
|
# never-ending loop (except on lack of ressources, swap, PIDs...)
|
|
# Avoid this situation by cutting the recursion short at the first
|
|
# level.
|
|
# This has the side effect of only showing the real targets, and hiding our
|
|
# internal ones. :-)
|
|
ifneq ($(MAKELEVEL),0)
|
|
$(error Recursion detected, bailing out...)
|
|
endif
|
|
|
|
MAKEFLAGS += $(CT_MAKEFLAGS)
|
|
build install clean distclean mrproper uninstall:
|
|
@$(MAKE) $@
|
|
|
|
else
|
|
# There were no additional MAKEFLAGS to add, do the job
|
|
|
|
TARGETS := bin lib lib-kconfig doc man
|
|
|
|
build: $(patsubst %,build-%,$(TARGETS))
|
|
|
|
install: build real-install
|
|
|
|
clean: $(patsubst %,clean-%,$(TARGETS))
|
|
|
|
distclean: clean
|
|
@echo " RM 'Makefile'"
|
|
@rm -f Makefile
|
|
|
|
mrproper: distclean
|
|
@echo " RM 'autostuff'"
|
|
@ rm -rf autom4te.cache config.log config.status configure
|
|
|
|
uninstall: real-uninstall
|
|
|
|
###############################################################################
|
|
# Specific make rules
|
|
|
|
#--------------------------------------
|
|
# Build rules
|
|
|
|
build-bin: $(PROG_NAME) \
|
|
scripts/crosstool-NG.sh \
|
|
scripts/saveSample.sh \
|
|
scripts/showTuple.sh
|
|
@chmod 755 $^
|
|
|
|
build-lib: config/configure.in \
|
|
paths.mk \
|
|
paths.sh
|
|
|
|
build-lib-kconfig:
|
|
@$(MAKE) -C kconfig
|
|
|
|
build-doc:
|
|
|
|
build-man: docs/$(PROG_NAME).1.gz
|
|
|
|
docs/$(PROG_NAME).1.gz: docs/$(PROG_NAME).1
|
|
@echo " GZIP '$@'"
|
|
@gzip -c9 $< >$@
|
|
|
|
define sed_it
|
|
@echo " SED '$@'"
|
|
@$(sed) -r -e 's,@@CT_BINDIR@@,$(bindir),g;' \
|
|
-e 's,@@CT_LIBDIR@@,$(libdir),g;' \
|
|
-e 's,@@CT_DOCDIR@@,$(docdir),g;' \
|
|
-e 's,@@CT_MANDIR@@,$(mandir),g;' \
|
|
-e 's,@@CT_PROG_NAME@@,$(PROG_NAME),g;' \
|
|
-e 's,@@CT_VERSION@@,$(VERSION),g;' \
|
|
-e 's,@@CT_DATE@@,$(DATE),g;' \
|
|
-e 's,@@CT_make@@,$(make),g;' \
|
|
-e 's,@@CT_bash@@,$(bash),g;' \
|
|
-e 's,@@CT_awk@@,$(awk),g;' \
|
|
$< >$@
|
|
endef
|
|
|
|
docs/$(PROG_NAME).1: docs/ct-ng.1.in Makefile
|
|
$(call sed_it)
|
|
|
|
$(PROG_NAME): ct-ng.in Makefile
|
|
$(call sed_it)
|
|
|
|
%: %.in Makefile
|
|
$(call sed_it)
|
|
|
|
# We create a script fragment that is parseable from inside a Makefile,
|
|
# and one from inside a shell script
|
|
paths.mk: FORCE
|
|
@echo " GEN '$@'"
|
|
@(echo 'export install=$(install)'; \
|
|
echo 'export bash=$(bash)'; \
|
|
echo 'export awk=$(awk)'; \
|
|
echo 'export grep=$(grep)'; \
|
|
echo 'export make=$(make)'; \
|
|
echo 'export sed=$(sed)'; \
|
|
echo 'export libtool=$(libtool)'; \
|
|
echo 'export libtoolize=$(libtoolize)'; \
|
|
echo 'export objcopy=$(objcopy)'; \
|
|
echo 'export objdump=$(objdump)'; \
|
|
echo 'export readelf=$(readelf)'; \
|
|
echo 'export patch=$(patch)'; \
|
|
echo 'export gperf=$(gperf)'; \
|
|
) >$@
|
|
|
|
paths.sh: FORCE
|
|
@echo " GEN '$@'"
|
|
@(echo 'export install="$(install)"'; \
|
|
echo 'export bash="$(bash)"'; \
|
|
echo 'export awk="$(awk)"'; \
|
|
echo 'export grep="$(grep)"'; \
|
|
echo 'export make="$(make)"'; \
|
|
echo 'export sed="$(sed)"'; \
|
|
echo 'export libtool="$(libtool)"'; \
|
|
echo 'export libtoolize="$(libtoolize)"'; \
|
|
echo 'export objcopy="$(objcopy)"'; \
|
|
echo 'export objdump="$(objdump)"'; \
|
|
echo 'export readelf="$(readelf)"'; \
|
|
echo 'export patch="$(patch)"'; \
|
|
echo 'export gperf="$(gperf)"'; \
|
|
) >$@
|
|
|
|
config/configure.in: FORCE
|
|
@echo " GEN '$@'"
|
|
@{ printf "# Generated file, do not edit\n"; \
|
|
printf "# Default values as found by ./configure\n"; \
|
|
for var in $(KCONFIG); do \
|
|
printf "\n"; \
|
|
printf "config CONFIGURE_$${var%%=*}\n"; \
|
|
if [ "$${var#*=}" = "y" ]; then \
|
|
printf " def_bool y\n"; \
|
|
else \
|
|
printf " bool\n"; \
|
|
fi; \
|
|
done; \
|
|
} >$@
|
|
|
|
FORCE:
|
|
|
|
#--------------------------------------
|
|
# Clean rules
|
|
|
|
clean-bin:
|
|
@echo " RM '$(PROG_NAME)'"
|
|
@rm -f $(PROG_NAME)
|
|
@echo " RM 'scripts/crosstool-NG.sh'"
|
|
@rm -f scripts/crosstool-NG.sh
|
|
@echo " RM 'scripts/saveSample.sh'"
|
|
@rm -f scripts/saveSample.sh
|
|
@echo " RM 'scripts/showTuple.sh'"
|
|
@rm -f scripts/showTuple.sh
|
|
|
|
clean-lib:
|
|
@echo " RM 'paths'"
|
|
@rm -f paths.mk paths.sh
|
|
@echo " RM 'config/configure.in'"
|
|
@rm -f config/configure.in
|
|
|
|
clean-lib-kconfig:
|
|
@$(MAKE) -C kconfig clean
|
|
|
|
clean-doc:
|
|
|
|
clean-man:
|
|
@echo " RM 'docs/$(PROG_NAME).1'"
|
|
@rm -f docs/$(PROG_NAME).1
|
|
@echo " RM 'docs/$(PROG_NAME).1.gz'"
|
|
@rm -f docs/$(PROG_NAME).1.gz
|
|
|
|
#--------------------------------------
|
|
# Check for --local setup
|
|
|
|
ifeq ($(strip $(LOCAL)),yes)
|
|
|
|
real-install:
|
|
@true
|
|
|
|
real-uninstall:
|
|
@true
|
|
|
|
else
|
|
|
|
#--------------------------------------
|
|
# Install rules
|
|
|
|
real-install: $(patsubst %,install-%,$(TARGETS)) install-post
|
|
|
|
install-bin: $(DESTDIR)$(bindir)
|
|
@echo " INST '$(PROG_NAME)'"
|
|
@$(install) -m 755 $(PROG_NAME) "$(DESTDIR)$(bindir)/$(PROG_NAME)"
|
|
|
|
# If one is hacking crosstool-NG, the patch set might change between any two
|
|
# installations of the same VERSION, thus the patches must be removed prior
|
|
# to being installed. It is the responsibility of the user to call uninstall
|
|
# first, if (s)he deems it necessary
|
|
install-lib: $(DESTDIR)$(libdir) \
|
|
install-lib-main \
|
|
install-lib-samples
|
|
|
|
LIB_SUB_DIR := config contrib patches scripts
|
|
$(patsubst %,install-lib-%-copy,$(LIB_SUB_DIR)): $(DESTDIR)$(libdir)
|
|
@echo " INSTDIR '$(patsubst install-lib-%-copy,%,$(@))/'"
|
|
@tar cf - --exclude='*.sh.in' $(patsubst install-lib-%-copy,%,$(@)) \
|
|
|(cd "$(DESTDIR)$(libdir)"; tar xf -)
|
|
|
|
# Huh? It seems we need at least one command to make this rule kick-in.
|
|
install-lib-%: install-lib-%-copy; @true
|
|
|
|
# Huh? that one does not inherit the -opy dependency, above...
|
|
install-lib-scripts: install-lib-scripts-copy
|
|
@chmod a+x $(DESTDIR)$(libdir)/scripts/crosstool-NG.sh
|
|
@chmod a+x $(DESTDIR)$(libdir)/scripts/saveSample.sh
|
|
@rm -f "$(DESTDIR)$(libdir)/scripts/addToolVersion.sh"
|
|
|
|
install-lib-main: $(DESTDIR)$(libdir) $(patsubst %,install-lib-%,$(LIB_SUB_DIR))
|
|
@echo " INST 'steps.mk'"
|
|
@$(install) -m 644 steps.mk "$(DESTDIR)$(libdir)/steps.mk"
|
|
@echo " INST 'paths'"
|
|
@$(install) -m 644 paths.mk paths.sh "$(DESTDIR)$(libdir)"
|
|
|
|
# Samples need a little love:
|
|
# - change every occurrence of CT_TOP_DIR to CT_LIB_DIR
|
|
install-lib-samples: $(DESTDIR)$(libdir) install-lib-main
|
|
@echo " INSTDIR 'samples/'"
|
|
@for samp_dir in samples/*/; do \
|
|
mkdir -p "$(DESTDIR)$(libdir)/$${samp_dir}"; \
|
|
$(sed) -r -e 's:\$$\{CT_TOP_DIR\}:\$$\{CT_LIB_DIR\}:;' \
|
|
-e 's:^(CT_WORK_DIR)=.*:\1="\$${CT_TOP_DIR}/.build":;' \
|
|
$${samp_dir}/crosstool.config \
|
|
>"$(DESTDIR)$(libdir)/$${samp_dir}/crosstool.config"; \
|
|
$(install) -m 644 "$${samp_dir}/reported.by" \
|
|
"$(DESTDIR)$(libdir)/$${samp_dir}"; \
|
|
for libc_cfg in "$${samp_dir}/"*libc*.config; do \
|
|
[ -f "$${libc_cfg}" ] || continue; \
|
|
$(install) -m 644 "$${libc_cfg}" \
|
|
"$(DESTDIR)$(libdir)/$${samp_dir}"; \
|
|
done; \
|
|
done
|
|
@$(install) -m 644 samples/samples.mk "$(DESTDIR)$(libdir)/samples/samples.mk"
|
|
|
|
KCONFIG_FILES := conf mconf nconf kconfig.mk
|
|
install-lib-kconfig: $(DESTDIR)$(libdir) install-lib-main
|
|
@echo " INST 'kconfig/'"
|
|
@mkdir -p "$(DESTDIR)$(libdir)/kconfig"
|
|
@for f in $(KCONFIG_FILES); do \
|
|
install "kconfig/$${f}" "$(DESTDIR)$(libdir)/kconfig/$${f}"; \
|
|
done
|
|
|
|
install-doc: $(DESTDIR)$(docdir)
|
|
@echo " INST 'docs/*.txt'"
|
|
@for doc_file in docs/*.txt; do \
|
|
$(install) -m 644 "$${doc_file}" "$(DESTDIR)$(docdir)"; \
|
|
done
|
|
|
|
install-man: $(DESTDIR)$(mandir)$(MAN_SUBDIR)
|
|
@echo " INST '$(PROG_NAME).1.gz'"
|
|
@$(install) -m 644 docs/$(PROG_NAME).1.gz "$(DESTDIR)$(mandir)$(MAN_SUBDIR)"
|
|
|
|
$(sort $(DESTDIR)$(bindir) $(DESTDIR)$(libdir) $(DESTDIR)$(docdir) $(DESTDIR)$(mandir)$(MAN_SUBDIR)):
|
|
@echo " MKDIR '$@/'"
|
|
@$(install) -m 755 -d "$@"
|
|
|
|
install-post:
|
|
@echo
|
|
@echo "For auto-completion, do not forget to install '$(PROG_NAME).comp' into"
|
|
@echo "your bash completion directory (usually /etc/bash_completion.d)"
|
|
|
|
#--------------------------------------
|
|
# Uninstall rules
|
|
|
|
real-uninstall: $(patsubst %,uninstall-%,$(TARGETS))
|
|
|
|
uninstall-bin:
|
|
@echo " RM '$(DESTDIR)$(bindir)/$(PROG_NAME)'"
|
|
@rm -f "$(DESTDIR)$(bindir)/$(PROG_NAME)"
|
|
|
|
uninstall-lib:
|
|
@echo " RMDIR '$(DESTDIR)$(libdir)/'"
|
|
@rm -rf "$(DESTDIR)$(libdir)"
|
|
|
|
uninstall-doc:
|
|
@echo " RMDIR '$(DESTDIR)$(docdir)/'"
|
|
@rm -rf "$(DESTDIR)$(docdir)"
|
|
|
|
uninstall-man:
|
|
@echo " RM '$(DESTDIR)$(mandir)$(MAN_SUBDIR)/$(PROG_NAME).1.gz'"
|
|
@rm -f "$(DESTDIR)$(mandir)$(MAN_SUBDIR)/$(PROG_NAME).1"{,.gz}
|
|
|
|
endif # Not --local
|
|
|
|
endif # No extra MAKEFLAGS were added
|
|
|
|
.PHONY: build $(patsubst %,build-%,$(TARGETS)) install
|