config 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  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 (dont' 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. local tmpfile="$infile.swp"
  57. # sed append cmd: 'a\' + newline + text + newline
  58. cmd="$(printf "a\\%b$insert" "\n")"
  59. sed -i -e "/$anchor/$cmd" "$infile"
  60. }
  61. txt_subst() {
  62. local before="$1"
  63. local after="$2"
  64. local infile="$3"
  65. local tmpfile="$infile.swp"
  66. sed -i -e "s:$before:$after:" "$infile"
  67. }
  68. txt_delete() {
  69. local text="$1"
  70. local infile="$2"
  71. local tmpfile="$infile.swp"
  72. sed -i -e "/$text/d" "$infile"
  73. }
  74. set_var() {
  75. local name=$1 new=$2 before=$3
  76. name_re="^($name=|# $name is not set)"
  77. before_re="^($before=|# $before is not set)"
  78. if test -n "$before" && grep -Eq "$before_re" "$FN"; then
  79. txt_append "^$before=" "$new" "$FN"
  80. txt_append "^# $before is not set" "$new" "$FN"
  81. elif grep -Eq "$name_re" "$FN"; then
  82. txt_subst "^$name=.*" "$new" "$FN"
  83. txt_subst "^# $name is not set" "$new" "$FN"
  84. else
  85. echo "$new" >>"$FN"
  86. fi
  87. }
  88. undef_var() {
  89. local name=$1
  90. txt_delete "^$name=" "$FN"
  91. txt_delete "^# $name is not set" "$FN"
  92. }
  93. if [ "$1" = "--file" ]; then
  94. FN="$2"
  95. if [ "$FN" = "" ] ; then
  96. usage
  97. fi
  98. shift 2
  99. else
  100. FN=.config
  101. fi
  102. if [ "$1" = "" ] ; then
  103. usage
  104. fi
  105. MUNGE_CASE=yes
  106. while [ "$1" != "" ] ; do
  107. CMD="$1"
  108. shift
  109. case "$CMD" in
  110. --keep-case|-k)
  111. MUNGE_CASE=no
  112. continue
  113. ;;
  114. --package|-p)
  115. BR2_PREFIX="BR2_PACKAGE_"
  116. continue
  117. ;;
  118. --*-after|-E|-D|-M)
  119. checkarg "$1"
  120. A=$ARG
  121. checkarg "$2"
  122. B=$ARG
  123. shift 2
  124. ;;
  125. -*)
  126. checkarg "$1"
  127. shift
  128. ;;
  129. esac
  130. case "$CMD" in
  131. --enable|-e)
  132. set_var "${BR2_PREFIX}$ARG" "${BR2_PREFIX}$ARG=y"
  133. ;;
  134. --disable|-d)
  135. set_var "${BR2_PREFIX}$ARG" "# ${BR2_PREFIX}$ARG is not set"
  136. ;;
  137. --set-str)
  138. # sed swallows one level of escaping, so we need double-escaping
  139. set_var "${BR2_PREFIX}$ARG" "${BR2_PREFIX}$ARG=\"${1//\"/\\\\\"}\""
  140. shift
  141. ;;
  142. --set-val)
  143. set_var "${BR2_PREFIX}$ARG" "${BR2_PREFIX}$ARG=$1"
  144. shift
  145. ;;
  146. --undefine|-u)
  147. undef_var "${BR2_PREFIX}$ARG"
  148. ;;
  149. --state|-s)
  150. if grep -q "# ${BR2_PREFIX}$ARG is not set" $FN ; then
  151. echo n
  152. else
  153. V="$(grep "^${BR2_PREFIX}$ARG=" $FN)"
  154. if [ $? != 0 ] ; then
  155. echo undef
  156. else
  157. V="${V/#${BR2_PREFIX}$ARG=/}"
  158. V="${V/#\"/}"
  159. V="${V/%\"/}"
  160. V="${V//\\\"/\"}"
  161. echo "${V}"
  162. fi
  163. fi
  164. ;;
  165. --enable-after|-E)
  166. set_var "${BR2_PREFIX}$B" "${BR2_PREFIX}$B=y" "${BR2_PREFIX}$A"
  167. ;;
  168. --disable-after|-D)
  169. set_var "${BR2_PREFIX}$B" "# ${BR2_PREFIX}$B is not set" "${BR2_PREFIX}$A"
  170. ;;
  171. *)
  172. usage
  173. ;;
  174. esac
  175. done