2
1

config 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #!/bin/bash
  2. # Manipulate options in a .config file from the command line
  3. myname=${0##*/}
  4. # If no prefix forced, use the default BR2_
  5. BR2_PREFIX="${BR2_PREFIX-BR2_}"
  6. usage() {
  7. cat >&2 <<EOL
  8. Manipulate options in a .config file from the command line.
  9. Usage:
  10. $myname options command ...
  11. commands:
  12. --enable|-e option Enable option
  13. --disable|-d option Disable option
  14. --set-str option string
  15. Set option to "string"
  16. --set-val option value
  17. Set option to value
  18. --undefine|-u option Undefine option
  19. --state|-s option Print state of option (n,y,m,undef)
  20. --enable-after|-E beforeopt option
  21. Enable option directly after other option
  22. --disable-after|-D beforeopt option
  23. Disable option directly after other option
  24. commands can be repeated multiple times
  25. options:
  26. --file config-file .config file to change (default .config)
  27. --keep-case|-k Keep next symbols' case (don't upper-case it)
  28. --package|-p Operate on package (set prefix to BR2_PACKAGE_)
  29. $myname doesn't check the validity of the .config file. This is done at next
  30. make time.
  31. By default, $myname will upper-case the given symbol. Use --keep-case to keep
  32. the case of all following symbols unchanged.
  33. $myname uses 'BR2_' as the default symbol prefix. Set the environment
  34. variable BR2_PREFIX to the prefix to use. Eg.: BR2_PREFIX="FOO_" $myname ...
  35. EOL
  36. exit 1
  37. }
  38. checkarg() {
  39. ARG="$1"
  40. if [ "$ARG" = "" ] ; then
  41. usage
  42. fi
  43. if [ "$MUNGE_CASE" = "yes" ] ; then
  44. ARG="$(echo "$ARG" | tr a-z- A-Z_)"
  45. fi
  46. case "$ARG" in
  47. ${BR2_PREFIX}*)
  48. ARG="${ARG/${BR2_PREFIX}/}"
  49. ;;
  50. esac
  51. }
  52. txt_append() {
  53. local anchor="$1"
  54. local insert="$2"
  55. local infile="$3"
  56. # sed append cmd: 'a\' + newline + text + newline
  57. cmd="$(printf "a\\%b$insert" "\n")"
  58. sed -i -e "/$anchor/$cmd" "$infile"
  59. }
  60. txt_subst() {
  61. local before="$1"
  62. local after="$2"
  63. local infile="$3"
  64. sed -i -e "s:$before:$after:" "$infile"
  65. }
  66. txt_delete() {
  67. local text="$1"
  68. local infile="$2"
  69. sed -i -e "/$text/d" "$infile"
  70. }
  71. set_var() {
  72. local name=$1 new=$2 before=$3
  73. name_re="^($name=|# $name is not set)"
  74. before_re="^($before=|# $before is not set)"
  75. if test -n "$before" && grep -Eq "$before_re" "$FN"; then
  76. txt_append "^$before=" "$new" "$FN"
  77. txt_append "^# $before is not set" "$new" "$FN"
  78. elif grep -Eq "$name_re" "$FN"; then
  79. txt_subst "^$name=.*" "$new" "$FN"
  80. txt_subst "^# $name is not set" "$new" "$FN"
  81. else
  82. echo "$new" >>"$FN"
  83. fi
  84. }
  85. undef_var() {
  86. local name=$1
  87. txt_delete "^$name=" "$FN"
  88. txt_delete "^# $name is not set" "$FN"
  89. }
  90. if [ "$1" = "--file" ]; then
  91. FN="$2"
  92. if [ "$FN" = "" ] ; then
  93. usage
  94. fi
  95. shift 2
  96. else
  97. FN=.config
  98. fi
  99. if [ "$1" = "" ] ; then
  100. usage
  101. fi
  102. MUNGE_CASE=yes
  103. while [ "$1" != "" ] ; do
  104. CMD="$1"
  105. shift
  106. case "$CMD" in
  107. --keep-case|-k)
  108. MUNGE_CASE=no
  109. continue
  110. ;;
  111. --package|-p)
  112. BR2_PREFIX="BR2_PACKAGE_"
  113. continue
  114. ;;
  115. --*-after|-E|-D|-M)
  116. checkarg "$1"
  117. A=$ARG
  118. checkarg "$2"
  119. B=$ARG
  120. shift 2
  121. ;;
  122. -*)
  123. checkarg "$1"
  124. shift
  125. ;;
  126. esac
  127. case "$CMD" in
  128. --enable|-e)
  129. set_var "${BR2_PREFIX}$ARG" "${BR2_PREFIX}$ARG=y"
  130. ;;
  131. --disable|-d)
  132. set_var "${BR2_PREFIX}$ARG" "# ${BR2_PREFIX}$ARG is not set"
  133. ;;
  134. --set-str)
  135. # sed swallows one level of escaping, so we need double-escaping
  136. set_var "${BR2_PREFIX}$ARG" "${BR2_PREFIX}$ARG=\"${1//\"/\\\\\"}\""
  137. shift
  138. ;;
  139. --set-val)
  140. set_var "${BR2_PREFIX}$ARG" "${BR2_PREFIX}$ARG=$1"
  141. shift
  142. ;;
  143. --undefine|-u)
  144. undef_var "${BR2_PREFIX}$ARG"
  145. ;;
  146. --state|-s)
  147. if grep -q "# ${BR2_PREFIX}$ARG is not set" "$FN" ; then
  148. echo n
  149. else
  150. if V="$(grep "^${BR2_PREFIX}$ARG=" "$FN")"; then
  151. V="${V/#${BR2_PREFIX}$ARG=/}"
  152. V="${V/#\"/}"
  153. V="${V/%\"/}"
  154. V="${V//\\\"/\"}"
  155. echo "${V}"
  156. else
  157. echo undef
  158. fi
  159. fi
  160. ;;
  161. --enable-after|-E)
  162. set_var "${BR2_PREFIX}$B" "${BR2_PREFIX}$B=y" "${BR2_PREFIX}$A"
  163. ;;
  164. --disable-after|-D)
  165. set_var "${BR2_PREFIX}$B" "# ${BR2_PREFIX}$B is not set" "${BR2_PREFIX}$A"
  166. ;;
  167. *)
  168. usage
  169. ;;
  170. esac
  171. done