
Split the process to fetch GNU tools (until now embedded within tools/Makefile.gnuhost) into a new Makefile.fetchgnu, MINIX-specific hence relocated, which is to be also used to fetch sources even when not building the tools. Use it for binutils too. Improve documentation. Also do not run configure on each run when MKUPDATE=yes The .WAIT serialization instruction between fetching and other configure sources was raising a new run of configure at each compilation. Avoid it by using two rules. Change-Id: Ie24950ccbb5c5067f3c1ea57b7bd8294e4c9445e
147 lines
4.5 KiB
Makefile
147 lines
4.5 KiB
Makefile
# $NetBSD: Makefile.gnuhost,v 1.42 2013/08/13 20:41:25 drochner Exp $
|
|
#
|
|
# Rules used when building a GNU host package. Expects MODULE to be set.
|
|
#
|
|
# There's not a lot we can do to build reliably in the face of many
|
|
# available configuration options. To be as low-overhead as possible,
|
|
# we follow the following scheme:
|
|
#
|
|
# * Configuration is only re-run when an autoconf source file (such as
|
|
# "configure" or "config.sub") is changed.
|
|
#
|
|
# * "config.status" is run to rebuild Makefiles and .h files if an
|
|
# autoconf-parsed file (such as Makefile.in) is changed.
|
|
#
|
|
# * If MKUPDATE != "no", "make install" is only run if a build has happened
|
|
# since the last install in the current directory.
|
|
|
|
.include <bsd.own.mk>
|
|
|
|
# Disable use of pre-compiled headers on Darwin.
|
|
BUILD_OSTYPE!= uname -s
|
|
.if ${BUILD_OSTYPE} == "Darwin"
|
|
HOST_CFLAGS+=-O2 -no-cpp-precomp
|
|
.endif
|
|
MAKE_PROGRAM?= ${MAKE}
|
|
|
|
GNUHOSTDIST?= ${.CURDIR}/../../gnu/dist/${MODULE}
|
|
|
|
.if defined(__MINIX)
|
|
.include "../minix/Makefile.fetchgnu"
|
|
.endif # defined(__MINIX)
|
|
|
|
FIND_ARGS+= \! \( -type d \( \
|
|
-name 'CVS' -o \
|
|
-name 'config' -o \
|
|
-name 'doc' -o \
|
|
-name 'po' -o \
|
|
-name 'nbsd.mt' -o \
|
|
-name 'tests*' \
|
|
\) -prune \)
|
|
|
|
# Do this "find" only if actually building something.
|
|
# AL - ... and on MINIX, if the source has already being fetched
|
|
.if (${USETOOLS} == "yes") && empty(.MAKEFLAGS:M-V*) && \
|
|
(make(all) || make(realall) || (!make(clean) && !make(cleandir) && !make(obj))) && \
|
|
!defined(_GNU_CFGSRC) && exists(${GNUHOSTDIST}/configure)
|
|
|
|
_GNU_CFGSRC!= find ${GNUHOSTDIST} ${FIND_ARGS} \
|
|
-type f \( -name 'config*' -o -name '*.in' \) -print
|
|
.MAKEOVERRIDES+= _GNU_CFGSRC
|
|
.endif
|
|
|
|
CONFIGURE_ENV+= \
|
|
AR=${HOST_AR:Q} \
|
|
AWK=${TOOL_AWK:Q} \
|
|
CC=${HOST_CC:Q} \
|
|
CFLAGS=${HOST_CFLAGS:Q} \
|
|
CONFIG_SHELL=${HOST_SH:Q} \
|
|
CPPFLAGS=${HOST_CPPFLAGS:Q} \
|
|
CXX=${HOST_CXX:Q} \
|
|
CXXFLAGS=${HOST_CXXFLAGS:Q} \
|
|
INSTALL=${HOST_INSTALL_FILE:Q} \
|
|
LDFLAGS=${HOST_LDFLAGS:Q} \
|
|
LEX=${LEX:Q} \
|
|
M4=${TOOL_M4:Q} \
|
|
MAKE=${MAKE_PROGRAM:Q} \
|
|
PATH="${TOOLDIR}/bin:$$PATH" \
|
|
RANLIB=${HOST_RANLIB:Q} \
|
|
YACC=${YACC:Q}
|
|
|
|
BUILD_ENV+= ${CONFIGURE_ENV}
|
|
|
|
CONFIGURE_ARGS+=--prefix=${TOOLDIR}
|
|
.if ${MKPIC} == "no"
|
|
CONFIGURE_ARGS+=--disable-shared
|
|
.endif
|
|
|
|
.if ${MAKE_PROGRAM} == ${MAKE}
|
|
.ifndef _NOWRAPPER
|
|
# Some systems have a small ARG_MAX. On such systems, prevent Make
|
|
# variables set on the command line from being exported in the
|
|
# environment (they will still be set in MAKEOVERRIDES).
|
|
.if ${BUILD_OSTYPE} == "Darwin" || ${BUILD_OSTYPE} == "FreeBSD"
|
|
__noenvexport= -X
|
|
.endif
|
|
MAKE_ARGS:= ${__noenvexport} -f ${.PARSEDIR}/Makefile.gnuwrap ${MAKE_ARGS}
|
|
.else
|
|
MAKE_ARGS+= _NOWRAPPER=1
|
|
.endif
|
|
BUILD_COMMAND= ${BUILD_ENV} ${MAKE} ${MAKE_ARGS}
|
|
.else
|
|
|
|
# gmake version of this puts MAKE_ARGS in the environment to be sure that
|
|
# sub-gmake's get them, otherwise tools/gcc tries to build libgcc and
|
|
# fails. it also uses "env -i" to entirely clear out MAKEFLAGS.
|
|
GMAKE_J_ARGS?= ${MAKEFLAGS:[*]:M*-j*:C/.*(-j ?[0-9]*).*/\1/W}
|
|
BUILD_COMMAND= /usr/bin/env -i ${BUILD_ENV} ${MAKE_ARGS} ${TOOL_GMAKE} ${GMAKE_J_ARGS} -e ${MAKE_ARGS}
|
|
|
|
.endif
|
|
|
|
MAKE_ARGS+= BISON=true DESTDIR= INSTALL=${HOST_INSTALL_FILE:Q}
|
|
|
|
ALL_TARGET?= all
|
|
INSTALL_TARGET?=install
|
|
|
|
BUILD_PLATFORM!= uname -srm | tr ' ()' '-'
|
|
CONFIGURE_PLATFORM!= if [ -s .configure_done ]; then cat .configure_done; else echo none; fi
|
|
.if "${BUILD_PLATFORM}" != "${CONFIGURE_PLATFORM}"
|
|
configure_cleanup:
|
|
@mkdir build 2>/dev/null || true
|
|
@(echo "Cleaning stale cache files ${BUILD_PLATFORM} != ${CONFIGURE_PLATFORM}")
|
|
@(cd build && find . -name config.cache | xargs rm -f)
|
|
configure_cleanup=configure_cleanup
|
|
.endif
|
|
|
|
# AL For MINIX, fetch the source if not there
|
|
.configure_done: ${fetch_done} ${_GNU_CFGSRC} ${.CURDIR}/Makefile ${configure_cleanup}
|
|
@mkdir build 2>/dev/null || true
|
|
@(cd build && ${CONFIGURE_ENV} ${HOST_SH} ${GNUHOSTDIST}/configure ${CONFIGURE_ARGS})
|
|
@echo ${BUILD_PLATFORM} > $@
|
|
|
|
# The .build_done timestamp is only updated if a file actually changes
|
|
# in the build tree during "make all". This way, if nothing has changed,
|
|
# a "make install MKUPDATE=yes" will do nothing.
|
|
|
|
.build_done: .configure_done
|
|
@(cd build && ${BUILD_COMMAND} ${ALL_TARGET})
|
|
@if [ ! -f $@ ] || [ -n "$$(find build -type f -newer .build_done -print)" ]; \
|
|
then touch $@; fi
|
|
|
|
.install_done! ${BUILD:D.build_done}
|
|
@(cd ${.OBJDIR}/build && ${BUILD_COMMAND} ${INSTALL_TARGET})
|
|
@touch $@
|
|
|
|
# Mapping to standard targets.
|
|
|
|
.if ${USETOOLS} == "yes"
|
|
realall: .build_done
|
|
realinstall: .install_done
|
|
.endif
|
|
|
|
clean: clean.gnu
|
|
clean.gnu:
|
|
-rm -r -f .*_done build
|
|
|
|
.include <bsd.hostprog.mk>
|