# $NetBSD: configure.mk,v 1.37 2024/08/25 16:57:18 wiz Exp $
#
# = Package-settable variables =
#
# CONFIGURE_ENV is the shell environment that is exported to the
#	configure script.
#
# CONFIG_SHELL is the shell that is used for interpreting the
#	configure script.
#
# CONFIGURE_SCRIPT is the path to the script to run in order to
#	configure the software for building.  If the path is relative,
#	then it is assumed to be relative to each directory listed in
#	CONFIGURE_DIRS.
#
# CONFIGURE_ARGS is the list of arguments that is passed to the
#	configure script.
#
# INSTALL_SH_OVERRIDE is a list of files relative to WRKSRC which
#	should be overridden by the install-sh script from
#	sysutils/install-sh.  If not defined or set to "no", then
#	no files are overridden.
#
#	Possible values: no, defined, undefined.
#
#	Default value: defined when GNU_CONFIGURE is defined, undefined
#	otherwise.
#
# OVERRIDE_GNU_CONFIG_SCRIPTS
#	Whether to override the GNU config.guess and config.sub scripts
#	with the pkgsrc versions.
#
#	Possible values: defined, undefined.
#
#	Default value: defined when GNU_CONFIGURE is defined, undefined
#	otherwise.
#
# Command-line variables:
#
# CONFIG_SHELL_FLAGS
#	Set this to -x when you really need to see all commands that the
#	configure script executes.
#
# Keywords: config.guess config.sub
#

_VARGROUPS+=		configure
_USER_VARS.configure=	CONFIG_SHELL_FLAGS
_PKG_VARS.configure= \
	CONFIGURE_DIRS CONFIGURE_ENV CONFIG_SHELL CONFIGURE_SCRIPT \
	CONFIGURE_ARGS OVERRIDE_GNU_CONFIG_SCRIPTS HAS_CONFIGURE \
	GNU_CONFIGURE PKGCONFIG_OVERRIDE USE_PKGLOCALEDIR \
	CMAKE_CONFIGURE_ARGS CMAKE_ARG_PATH
_SORTED_VARS.configure=	*_ENV *_OVERRIDE
_LISTED_VARS.configure=	*_ARGS *_SCRIPTS

CONFIGURE_SCRIPT?=	./configure
CONFIGURE_ENV+=		${ALL_ENV}
CONFIGURE_ARGS?=	# empty
CONFIG_SHELL?=		${SH}
CONFIG_SHELL_FLAGS?=	# none
CMAKE_CONFIGURE_ARGS?=		# empty
CMAKE_ARG_PATH?=	.
_BUILD_DEFS+=		CONFIGURE_ENV CONFIGURE_ARGS CMAKE_CONFIGURE_ARGS

.if defined(GNU_CONFIGURE)
.  include "gnu-configure.mk"
.endif
.if defined(OVERRIDE_GNU_CONFIG_SCRIPTS)
.  include "config-override.mk"
.endif
.if defined(INSTALL_SH_OVERRIDE) && empty(INSTALL_SH_OVERRIDE:M[Nn][Oo])
.  include "install-sh-override.mk"
.endif
.if defined(USE_LIBTOOL)
.  include "libtool-override.mk"
.endif
.if defined(PKGCONFIG_OVERRIDE)
.  include "pkg-config-override.mk"
.endif
.include "replace-interpreter.mk"
.if defined(USE_PKGLOCALEDIR)
.  include "replace-localedir.mk"
.endif
.if defined(USE_CMAKE)
.if ${PKG_DEVELOPER:Uno} != "no"
WARNINGS+= 		"USE_CMAKE is deprecated; use devel/cmake/build.mk instead."
.endif
.  include "cmake.mk"
.endif
.if defined(_CMAKE_CONFIGURE_SETTINGS)
.  include "../../devel/cmake/configure-settings.mk"
.endif

######################################################################
### configure (PUBLIC)
######################################################################
### configure is a public target to configure the sources for building.
###
_CONFIGURE_TARGETS+=	check-vulnerable
_CONFIGURE_TARGETS+=	wrapper
_CONFIGURE_TARGETS+=	acquire-configure-lock
_CONFIGURE_TARGETS+=	${_COOKIE.configure}
_CONFIGURE_TARGETS+=	release-configure-lock

.PHONY: configure
.if !target(configure)
.  if exists(${_COOKIE.configure}) && !${_CLEANING}
configure:
	@${DO_NADA}
.  elif defined(_PKGSRC_BARRIER)
configure: ${_CONFIGURE_TARGETS}
.  else
configure: barrier
.  endif
.endif

.PHONY: acquire-configure-lock release-configure-lock
acquire-configure-lock: acquire-lock
release-configure-lock: release-lock

.if exists(${_COOKIE.configure}) && !${_CLEANING}
${_COOKIE.configure}:
	@${DO_NADA}
.else
${_COOKIE.configure}: real-configure
.endif

######################################################################
### real-configure (PRIVATE)
######################################################################
### real-configure is a helper target onto which one can hook all of the
### targets that do the actual configuration of the sources.
###
#
# Note: pre-configure-checks-hook comes after pre-configure to allow
# packages for fixing bad files with SUBST_STAGE.* = pre-configure.
#
_REAL_CONFIGURE_TARGETS+=	configure-check-interactive
_REAL_CONFIGURE_TARGETS+=	configure-message
_REAL_CONFIGURE_TARGETS+=	configure-vars
_REAL_CONFIGURE_TARGETS+=	pre-configure
_REAL_CONFIGURE_TARGETS+=	do-configure-pre-hook
_REAL_CONFIGURE_TARGETS+=	pre-configure-checks-hook
_REAL_CONFIGURE_TARGETS+=	do-configure
_REAL_CONFIGURE_TARGETS+=	do-configure-post-hook
_REAL_CONFIGURE_TARGETS+=	post-configure
_REAL_CONFIGURE_TARGETS+=	_configure-cookie
_REAL_CONFIGURE_TARGETS+=	error-check

.PHONY: real-configure
real-configure: ${_REAL_CONFIGURE_TARGETS}

.PHONY: configure-message
configure-message:
	@${PHASE_MSG} "Configuring for ${PKGNAME}"

######################################################################
### configure-check-interactive (PRIVATE)
######################################################################
### configure-check-interactive checks whether we must do an interactive
### configuration or not.
###
configure-check-interactive:
.if !empty(INTERACTIVE_STAGE:Mconfigure) && defined(BATCH)
	@${ERROR_MSG} "The configure stage of this package requires user interaction"
	@${ERROR_MSG} "Please configure manually with:"
	@${ERROR_MSG} "    \"cd ${.CURDIR} && ${MAKE} configure\""
	${RUN} ${FALSE}
.else
	@${DO_NADA}
.endif

######################################################################
### do-configure-pre-hook (PRIVATE)
######################################################################
### do-configure-pre-hook is a helper target onto which one can hook
### all of the targets that should be run after pre-configure but before
### do-configure.  These targets typically edit the files used by the
### do-configure target.
###
.PHONY: do-configure-pre-hook
do-configure-pre-hook:
	@${DO_NADA}

######################################################################
### do-configure-post-hook (PRIVATE)
######################################################################
### do-configure-post-hook is a helper target onto which one can hook
### all of the targets that should be run after do-configure but before
### post-configure.  These targets typically edit the files generated
### by the do-configure target that are used during the build phase.
###
.PHONY: do-configure-post-hook
do-configure-post-hook:
	@${DO_NADA}

######################################################################
### do-configure-script (PRIVATE)
######################################################################
### do-configure-script runs the configure script to configure the
### software for building.
###
_CONFIGURE_SCRIPT_ENV+=	INSTALL=${INSTALL:Q}\ -c\ -o\ ${BINOWN}\ -g\ ${BINGRP}
_CONFIGURE_SCRIPT_ENV+=	INSTALL_PROGRAM=${INSTALL_PROGRAM:Q}
_CONFIGURE_SCRIPT_ENV+=	INSTALL_SCRIPT=${INSTALL_SCRIPT:Q}
_CONFIGURE_SCRIPT_ENV+=	INSTALL_DATA=${INSTALL_DATA:Q}
_CONFIGURE_SCRIPT_ENV+=	INSTALL_GAME=${INSTALL_GAME:Q}
_CONFIGURE_SCRIPT_ENV+=	INSTALL_GAME_DATA=${INSTALL_GAME_DATA:Q}
_CONFIGURE_SCRIPT_ENV+=	${CONFIGURE_ENV}

.PHONY: do-configure-script
do-configure-script:
.for _dir_ in ${CONFIGURE_DIRS}
.  if ${CONFIGURE_DIRS:[#]} != 1
	${RUN} ${STEP_MSG} "Running "${CONFIGURE_SCRIPT:Q}" in "${_dir_:Q}
.  endif
	${RUN}${_ULIMIT_CMD}						\
	cd ${WRKSRC} && cd ${_dir_} &&					\
	${PKGSRC_SETENV} ${_CONFIGURE_SCRIPT_ENV}			\
		${CONFIG_SHELL} ${CONFIG_SHELL_FLAGS}			\
			${CONFIGURE_SCRIPT} ${CONFIGURE_ARGS}
.endfor

######################################################################
### do-configure-imake (PRIVATE)
######################################################################
### do-configure-imake runs xmkmf and imake to configure the software
### for building.
###
_CONFIGURE_IMAKE_ENV+=	XPROJECTROOT=${X11BASE:Q}
_CONFIGURE_IMAKE_ENV+=	${SCRIPTS_ENV}

.PHONY: do-configure-imake
do-configure-imake:
.for _dir_ in ${CONFIGURE_DIRS}
	${RUN}								\
	cd ${WRKSRC} && cd ${_dir_} &&					\
	${PKGSRC_SETENV} ${_CONFIGURE_IMAKE_ENV} ${XMKMF}
.endfor

######################################################################
### do-configure-cmake (PRIVATE)
######################################################################
### do-configure-cmake runs cmake to configure the software for
### building.
###
_CONFIGURE_CMAKE_ENV+=	BUILDLINK_DIR=${BUILDLINK_DIR}
_CONFIGURE_CMAKE_ENV+=	${CONFIGURE_ENV}


.PHONY: do-configure-cmake
do-configure-cmake:
.for _dir_ in ${CONFIGURE_DIRS}
	${RUN}${_ULIMIT_CMD}						\
	cd ${WRKSRC} && cd ${_dir_} &&					\
	${PKGSRC_SETENV} ${_CONFIGURE_CMAKE_ENV}			\
		cmake ${CMAKE_CONFIGURE_ARGS} ${CMAKE_ARG_PATH}
.endfor

######################################################################
### pre-configure, do-configure, post-configure (PUBLIC, override)
######################################################################
### {pre,do,post}-configure are the heart of the package-customizable
### configure targets, and may be overridden within a package Makefile.
###
.PHONY: pre-configure do-configure post-configure

_DO_CONFIGURE_TARGETS+=	${HAS_CONFIGURE:D	do-configure-script}
_DO_CONFIGURE_TARGETS+=	${USE_IMAKE:D		do-configure-imake}
_DO_CONFIGURE_TARGETS+=	${USE_CMAKE:D		do-configure-cmake}

.if !target(do-configure)
do-configure: ${_DO_CONFIGURE_TARGETS}
	@${DO_NADA}
.endif

.if !target(pre-configure)
pre-configure:
	@${DO_NADA}
.endif

.if !target(post-configure)
post-configure:
	@${DO_NADA}
.endif

# configure-help:
#	Runs ${CONFIGURE_SCRIPT} --help. It is mainly intended for
#	package developers so they can quickly see the options of the
#	configure script.
#
configure-help:
.for d in ${CONFIGURE_DIRS}
	${RUN} cd ${WRKSRC} && cd ${d} && ${PKGSRC_SETENV} ${_CONFIGURE_SCRIPT_ENV} ${CONFIG_SHELL} ${CONFIGURE_SCRIPT} --help
.endfor

# configure-env:
#	Runs an interactive shell in the same environment that is
#	also used for the configure scripts.
#
#	This is only used during development and testing of a package
#	to work in the same environment as the actual build.
#
# User-settable variables:
#
# CONFIGURE_ENV_SHELL
#	The shell to start.
#
#	Default: ${CONFIG_SHELL}
#
# Keywords: debug configure

configure-env: .PHONY ${_PKGSRC_BARRIER:Ubarrier:D_configure-env}
_configure-env: .PHONY wrapper
	@${STEP_MSG} "Entering the configure environment for ${PKGNAME}"
.if ${CONFIGURE_DIRS:[#]} > 1 || ${CONFIGURE_DIRS} != ${WRKSRC}
	@${ECHO_MSG} "The CONFIGURE_DIRS are:" \
		${CONFIGURE_DIRS:S,^${WRKSRC}$,.,:S,^${WRKSRC}/,,:Q}
.endif
	${RUN} cd ${WRKSRC} \
	&& ${PKGSRC_SETENV} ${_CONFIGURE_SCRIPT_ENV} \
		${CONFIGURE_ENV_SHELL:U${CONFIG_SHELL}}
