xref: /freebsd/contrib/bmake/mk/mkopt.sh (revision 0b46a53a2f50b5ab0f4598104119a049b9c42cc9)
13841c287SSimon J. Gerraty#!/bin/sh
23841c287SSimon J. Gerraty
3c59c3bf3SSimon J. Gerraty# SPDX-License-Identifier: BSD-2-Clause
4c59c3bf3SSimon J. Gerraty#
5*0b46a53aSSimon J. Gerraty# $Id: mkopt.sh,v 1.17 2025/05/22 22:35:14 sjg Exp $
6db29cad8SSimon J. Gerraty#
7*0b46a53aSSimon J. Gerraty#	@(#) Copyright (c) 2014-2025, Simon J. Gerraty
8db29cad8SSimon J. Gerraty#
9db29cad8SSimon J. Gerraty#	This file is provided in the hope that it will
10db29cad8SSimon J. Gerraty#	be of use.  There is absolutely NO WARRANTY.
11db29cad8SSimon J. Gerraty#	Permission to copy, redistribute or otherwise
12db29cad8SSimon J. Gerraty#	use this file is hereby granted provided that
13db29cad8SSimon J. Gerraty#	the above copyright notice and this notice are
14db29cad8SSimon J. Gerraty#	left intact.
15db29cad8SSimon J. Gerraty#
16db29cad8SSimon J. Gerraty#	Please send copies of changes and bug-fixes to:
17db29cad8SSimon J. Gerraty#	sjg@crufty.net
18db29cad8SSimon J. Gerraty#
19db29cad8SSimon J. Gerraty
20db29cad8SSimon J. Gerraty# handle WITH[OUT]_* options in a manner compatible with
21db29cad8SSimon J. Gerraty# options.mk and bsd.mkopt.mk in recent FreeBSD
22db29cad8SSimon J. Gerraty
23db29cad8SSimon J. Gerraty# no need to be included more than once
24db29cad8SSimon J. Gerraty_MKOPT_SH=:
25128a4105SSimon J. Gerraty_MKOPT_PREFIX=${_MKOPT_PREFIX:-MK_}
26db29cad8SSimon J. Gerraty
27db29cad8SSimon J. Gerraty#
28128a4105SSimon J. Gerraty# _mk_opt default OPT
29db29cad8SSimon J. Gerraty#
30db29cad8SSimon J. Gerraty# Set MK_$OPT
31db29cad8SSimon J. Gerraty#
32db29cad8SSimon J. Gerraty# The semantics are simple, if MK_$OPT has no value
33db29cad8SSimon J. Gerraty# WITHOUT_$OPT results in MK_$OPT=no
34db29cad8SSimon J. Gerraty# otherwise WITH_$OPT results in MK_$OPT=yes.
35db29cad8SSimon J. Gerraty# Note WITHOUT_$OPT overrides WITH_$OPT.
36db29cad8SSimon J. Gerraty#
37db29cad8SSimon J. Gerraty# For backwards compatability reasons we treat WITH_$OPT=no
38db29cad8SSimon J. Gerraty# the same as WITHOUT_$OPT.
39db29cad8SSimon J. Gerraty#
40db29cad8SSimon J. Gerraty_mk_opt() {
41db29cad8SSimon J. Gerraty    _d=$1
42128a4105SSimon J. Gerraty    _mo=${_MKOPT_PREFIX}$2 _wo=WITHOUT_$2 _wi=WITH_$2
43db29cad8SSimon J. Gerraty    eval "_mov=\$$_mo _wov=\$$_wo _wiv=\$$_wi"
44db29cad8SSimon J. Gerraty
45db29cad8SSimon J. Gerraty    case "$_wiv" in
46b46b9039SSimon J. Gerraty    [Nn][Oo]) _wov=no;;
47db29cad8SSimon J. Gerraty    esac
48db29cad8SSimon J. Gerraty    _v=${_mov:-${_wov:+no}}
49db29cad8SSimon J. Gerraty    _v=${_v:-${_wiv:+yes}}
50db29cad8SSimon J. Gerraty    _v=${_v:-$_d}
51db29cad8SSimon J. Gerraty    _opt_list="$_opt_list $_mo"
52db29cad8SSimon J. Gerraty    case "$_v" in
53db29cad8SSimon J. Gerraty    yes|no) ;;			# sane
54db29cad8SSimon J. Gerraty    0|[NnFf]*) _v=no;;		# they mean no
55db29cad8SSimon J. Gerraty    1|[YyTt]*) _v=yes;;		# they mean yes
56db29cad8SSimon J. Gerraty    *) _v=$_d;;			# ignore bogus value
57db29cad8SSimon J. Gerraty    esac
58db29cad8SSimon J. Gerraty    eval "$_mo=$_v"
59db29cad8SSimon J. Gerraty}
60db29cad8SSimon J. Gerraty
61db29cad8SSimon J. Gerraty#
62db29cad8SSimon J. Gerraty# _mk_opts default opt ... [default [opt] ...]
63db29cad8SSimon J. Gerraty#
64db29cad8SSimon J. Gerraty# see _mk_opts_defaults for example
65db29cad8SSimon J. Gerraty#
66db29cad8SSimon J. Gerraty_mk_opts() {
67db29cad8SSimon J. Gerraty    _d=no
68db29cad8SSimon J. Gerraty    for _o in "$@"
69db29cad8SSimon J. Gerraty    do
70db29cad8SSimon J. Gerraty	case "$_o" in
71128a4105SSimon J. Gerraty	*/*) # option is dirname default comes from basename
72128a4105SSimon J. Gerraty	    eval "_d=\$${_MKOPT_PREFIX}${_o#*/}"
73128a4105SSimon J. Gerraty	    _o=${_o%/*}
74128a4105SSimon J. Gerraty	    ;;
75db29cad8SSimon J. Gerraty	yes|no) _d=$_o; continue;;
76db29cad8SSimon J. Gerraty	esac
77db29cad8SSimon J. Gerraty	_mk_opt $_d $_o
78db29cad8SSimon J. Gerraty    done
79db29cad8SSimon J. Gerraty}
80db29cad8SSimon J. Gerraty
81128a4105SSimon J. Gerraty# handle either options.mk style OPTIONS_DEFAULT_*
82128a4105SSimon J. Gerraty# or FreeBSD's new bsd.mkopt.mk style __DEFAULT_*_OPTIONS
83db29cad8SSimon J. Gerraty_mk_opts_defaults() {
84128a4105SSimon J. Gerraty    _mk_opts no $OPTIONS_DEFAULT_NO $__DEFAULT_NO_OPTIONS \
85128a4105SSimon J. Gerraty	yes $OPTIONS_DEFAULT_YES $__DEFAULT_YES_OPTIONS \
86128a4105SSimon J. Gerraty	$OPTIONS_DEFAULT_DEPENDENT $__DEFAULT_DEPENDENT_OPTIONS
87db29cad8SSimon J. Gerraty}
88db29cad8SSimon J. Gerraty
89954401e6SSimon J. Gerraty# _mk_cmdline_opts opt ...
90954401e6SSimon J. Gerraty# look at the command line (saved in _cmdline)
91954401e6SSimon J. Gerraty# to see any options we care about are being set with -DWITH*
92*0b46a53aSSimon J. Gerraty# or MK_*= and WITH[OUT]_*= if 'opt' is '*' then all options are of interest.
93954401e6SSimon J. Gerraty_cmdline="$0 $@"
94954401e6SSimon J. Gerraty_mk_cmdline_opts() {
95954401e6SSimon J. Gerraty    for _x in $_cmdline
96954401e6SSimon J. Gerraty    do
97954401e6SSimon J. Gerraty	case "$_x" in
98*0b46a53aSSimon J. Gerraty	-DWITH*|WITH*=*|${_MKOPT_PREFIX:-MK_}*=*)
99954401e6SSimon J. Gerraty	    for _o in "$@"
100954401e6SSimon J. Gerraty	    do
101954401e6SSimon J. Gerraty		case "$_x" in
102954401e6SSimon J. Gerraty		-DWITH_$_o|-DWITHOUT_$_o) eval ${_x#-D}=1;;
103954401e6SSimon J. Gerraty		-DWITH_$_o=*|-DWITHOUT_$_o=*) eval ${_x#-D};;
104*0b46a53aSSimon J. Gerraty		WITH_$_o=*|WITHOUT_$_o=*) eval "$_x";;
105954401e6SSimon J. Gerraty		${_MKOPT_PREFIX:-MK_}$_o=*) eval "$_x";;
106954401e6SSimon J. Gerraty		esac
107954401e6SSimon J. Gerraty	    done
108954401e6SSimon J. Gerraty	    ;;
109954401e6SSimon J. Gerraty	esac
110954401e6SSimon J. Gerraty    done
111954401e6SSimon J. Gerraty}
112954401e6SSimon J. Gerraty
113954401e6SSimon J. Gerraty
114db29cad8SSimon J. Gerratycase "/$0" in
115db29cad8SSimon J. Gerraty*/mkopt*)
116db29cad8SSimon J. Gerraty    _list=no
117954401e6SSimon J. Gerraty    _mk_cmdline_opts '*'
118954401e6SSimon J. Gerraty    _mk_opts no DEBUG
119954401e6SSimon J. Gerraty    [ $MK_DEBUG = no ] || set -x
120db29cad8SSimon J. Gerraty    while :
121db29cad8SSimon J. Gerraty    do
122db29cad8SSimon J. Gerraty	case "$1" in
123db29cad8SSimon J. Gerraty	*=*) eval "$1"; shift;;
124db29cad8SSimon J. Gerraty	--no|no) _list="$_list no"; shift;;
125db29cad8SSimon J. Gerraty	--yes|yes) _list="$_list yes"; shift;;
126db29cad8SSimon J. Gerraty	-DWITH*) eval "${1#-D}=1"; shift;;
127db29cad8SSimon J. Gerraty	[A-Z]*) _list="$_list $1"; shift;;
128db29cad8SSimon J. Gerraty	*) break;;
129db29cad8SSimon J. Gerraty	esac
130db29cad8SSimon J. Gerraty    done
131db29cad8SSimon J. Gerraty    _mk_opts $_list
132db29cad8SSimon J. Gerraty    ;;
133db29cad8SSimon J. Gerratyesac
134db29cad8SSimon J. Gerraty
135