From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DD5FC18BBBA for ; Thu, 12 Sep 2024 20:13:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726172032; cv=none; b=gqk4ChnI9emWC0w0rcIC+Yr4NCbQiLjp7mG1+V7knv+S0UNODpRBrZHo76Q+rl17SD4j73GtNfBIwbOSsCpogyGNLx+/O+V0+KClGHk9Z/aGKdJ/Leh59urHLEqOUdsJibSZ4VrZlgacQtgsCkfNhTzkvtlMVoXs44/YluJPC2U= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726172032; c=relaxed/simple; bh=TY3zSrbtZfaGKpr9fHSdk8OQIK4eTv9laHpuZJqM2Uo=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: In-Reply-To:Content-Type:Content-Disposition; b=F4bE9RhaeNGGernWEI0pVwuOees1HDrAfehJrkAy4w4aVxOZ7hzglveWmRBMlUSBS0CVtlSkRjArQzW7vpKYZmOCd403fYJybp4XVmaLOIKZXSztcPVLrNiLVaPO4BgxqXHlh8sx+WDpQhPld2XcwAjcFslQla9C6ExnpD/QrrM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=D/DksDs0; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="D/DksDs0" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1726172029; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=5vww/X+zTxV0pF/rlNMsY1gvJOjgu9shvygSsO8v0Ts=; b=D/DksDs0GnGZnFNFMf4lYTG6OcuDbb7rtk7MQ8NeXXivw/gcN3JhawNp1R7aLmYbYkxpuF zgxXiYEf2hKC1J8vczNxuhburkzw5SNIvPGp8QXtsZf2bvzkiBjiccTSsU+Vvqot0xUbf/ De1zFXb3JTUsp/43R7rK1mxxd9t3jOk= Received: from mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-333-meqGQlHDNJWnVLA6upgNKg-1; Thu, 12 Sep 2024 16:13:46 -0400 X-MC-Unique: meqGQlHDNJWnVLA6upgNKg-1 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 5759D19560B0; Thu, 12 Sep 2024 20:13:45 +0000 (UTC) Received: from aion.redhat.com (unknown [10.22.64.160]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id AF23D3001D10; Thu, 12 Sep 2024 20:13:44 +0000 (UTC) Received: by aion.redhat.com (Postfix, from userid 1000) id A89CA1F20C5; Thu, 12 Sep 2024 16:13:42 -0400 (EDT) Date: Thu, 12 Sep 2024 16:13:42 -0400 From: Scott Mayhew To: cel@kernel.org Cc: kdevops@lists.linux.dev, Chuck Lever Subject: Re: [RFC PATCH] scripts: Copy scripts/config from the Linux kernel repo Message-ID: References: <20240912195512.354585-1-cel@kernel.org> Precedence: bulk X-Mailing-List: kdevops@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 In-Reply-To: <20240912195512.354585-1-cel@kernel.org> X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Thu, 12 Sep 2024, cel@kernel.org wrote: > From: Chuck Lever > > scripts/config is a scriptable way to modify .config files. > > I find this script useful for making the same small change > repeatedly to a number of kdevops or kernel .config files, or for > having a set-up script that can poke a bunch of settings into a > .config automatically. > > Signed-off-by: Chuck Lever > --- > scripts/config | 230 +++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 230 insertions(+) > create mode 100755 scripts/config > > diff --git a/scripts/config b/scripts/config > new file mode 100755 > index 000000000000..ff88e2faefd3 > --- /dev/null > +++ b/scripts/config > @@ -0,0 +1,230 @@ > +#!/usr/bin/env bash > +# SPDX-License-Identifier: GPL-2.0 > +# Manipulate options in a .config file from the command line > + > +myname=${0##*/} > + > +# If no prefix forced, use the default CONFIG_ > +CONFIG_="${CONFIG_-CONFIG_}" > + > +# We use an uncommon delimiter for sed substitutions > +SED_DELIM=$(echo -en "\001") > + > +usage() { > + cat >&2 < +Manipulate options in a .config file from the command line. > +Usage: > +$myname options command ... > +commands: > + --enable|-e option Enable option > + --disable|-d option Disable option > + --module|-m option Turn option into a module > + --set-str option string > + Set option to "string" > + --set-val option value > + Set option to value > + --undefine|-u option Undefine option > + --state|-s option Print state of option (n,y,m,undef) > + > + --enable-after|-E beforeopt option > + Enable option directly after other option > + --disable-after|-D beforeopt option > + Disable option directly after other option > + --module-after|-M beforeopt option > + Turn option into module directly after other option > + > + commands can be repeated multiple times > + > +options: > + --file config-file .config file to change (default .config) > + --keep-case|-k Keep next symbols' case (dont' upper-case it) > + > +$myname doesn't check the validity of the .config file. This is done at next > +make time. > + > +By default, $myname will upper-case the given symbol. Use --keep-case to keep > +the case of all following symbols unchanged. > + > +$myname uses 'CONFIG_' as the default symbol prefix. Set the environment > +variable CONFIG_ to the prefix to use. Eg.: CONFIG_="FOO_" $myname ... > +EOL > + exit 1 > +} > + > +checkarg() { > + ARG="$1" > + if [ "$ARG" = "" ] ; then > + usage > + fi > + case "$ARG" in > + ${CONFIG_}*) > + ARG="${ARG/${CONFIG_}/}" > + ;; > + esac > + if [ "$MUNGE_CASE" = "yes" ] ; then > + ARG="`echo $ARG | tr a-z A-Z`" > + fi > +} > + > +txt_append() { > + local anchor="$1" > + local insert="$2" > + local infile="$3" > + local tmpfile="$infile.swp" > + > + # sed append cmd: 'a\' + newline + text + newline > + cmd="$(printf "a\\%b$insert" "\n")" > + > + sed -e "/$anchor/$cmd" "$infile" >"$tmpfile" > + # replace original file with the edited one > + mv "$tmpfile" "$infile" > +} > + > +txt_subst() { > + local before="$1" > + local after="$2" > + local infile="$3" > + local tmpfile="$infile.swp" > + > + sed -e "s$SED_DELIM$before$SED_DELIM$after$SED_DELIM" "$infile" >"$tmpfile" > + # replace original file with the edited one > + mv "$tmpfile" "$infile" > +} > + > +txt_delete() { > + local text="$1" > + local infile="$2" > + local tmpfile="$infile.swp" > + > + sed -e "/$text/d" "$infile" >"$tmpfile" > + # replace original file with the edited one > + mv "$tmpfile" "$infile" > +} > + > +set_var() { > + local name=$1 new=$2 before=$3 > + > + name_re="^($name=|# $name is not set)" > + before_re="^($before=|# $before is not set)" > + if test -n "$before" && grep -Eq "$before_re" "$FN"; then > + txt_append "^$before=" "$new" "$FN" > + txt_append "^# $before is not set" "$new" "$FN" > + elif grep -Eq "$name_re" "$FN"; then > + txt_subst "^$name=.*" "$new" "$FN" > + txt_subst "^# $name is not set" "$new" "$FN" > + else > + echo "$new" >>"$FN" > + fi > +} > + > +undef_var() { > + local name=$1 > + > + txt_delete "^$name=" "$FN" > + txt_delete "^# $name is not set" "$FN" > +} > + > +if [ "$1" = "--file" ]; then > + FN="$2" > + if [ "$FN" = "" ] ; then > + usage > + fi > + shift 2 > +else > + FN=.config > +fi > + > +if [ "$1" = "" ] ; then > + usage > +fi > + > +MUNGE_CASE=yes > +while [ "$1" != "" ] ; do > + CMD="$1" > + shift > + case "$CMD" in > + --keep-case|-k) > + MUNGE_CASE=no > + continue > + ;; > + --refresh) > + ;; > + --*-after|-E|-D|-M) > + checkarg "$1" > + A=$ARG > + checkarg "$2" > + B=$ARG > + shift 2 > + ;; > + -*) > + checkarg "$1" > + shift > + ;; > + esac > + case "$CMD" in > + --enable|-e) > + set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=y" > + ;; > + > + --disable|-d) > + set_var "${CONFIG_}$ARG" "# ${CONFIG_}$ARG is not set" > + ;; > + > + --module|-m) > + set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=m" > + ;; > + > + --set-str) > + # sed swallows one level of escaping, so we need double-escaping > + set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=\"${1//\"/\\\\\"}\"" > + shift > + ;; > + > + --set-val) > + set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=$1" > + shift > + ;; > + --undefine|-u) > + undef_var "${CONFIG_}$ARG" > + ;; > + > + --state|-s) > + if grep -q "# ${CONFIG_}$ARG is not set" $FN ; then > + echo n > + else > + V="$(grep "^${CONFIG_}$ARG=" $FN)" > + if [ $? != 0 ] ; then > + echo undef > + else > + V="${V/#${CONFIG_}$ARG=/}" > + V="${V/#\"/}" > + V="${V/%\"/}" > + V="${V//\\\"/\"}" > + echo "${V}" > + fi > + fi > + ;; > + > + --enable-after|-E) > + set_var "${CONFIG_}$B" "${CONFIG_}$B=y" "${CONFIG_}$A" > + ;; > + > + --disable-after|-D) > + set_var "${CONFIG_}$B" "# ${CONFIG_}$B is not set" "${CONFIG_}$A" > + ;; > + > + --module-after|-M) > + set_var "${CONFIG_}$B" "${CONFIG_}$B=m" "${CONFIG_}$A" > + ;; > + > + # undocumented because it ignores --file (fixme) > + --refresh) > + yes "" | make oldconfig > + ;; > + > + *) > + echo "bad command: $CMD" >&2 > + usage > + ;; > + esac > +done > -- > 2.46.0 > Acked-by: Scott Mayhew I've been manually copying this over to several of my kdevops instances for a while now.