diff --git a/misc/tools-source/config_helper.c b/misc/tools-source/config_helper.c new file mode 100644 index 000000000..a617440d9 --- /dev/null +++ b/misc/tools-source/config_helper.c @@ -0,0 +1,257 @@ +/* Bash (wallclock-time) profiler. Written by Clifford Wolf. + * + * Usage: + * gcc -shared -fPIC -Wall -o config_helper.so config_helper.c + * enable -f ./config_helper.so cfghlp + * + * Note: This builtin trusts that it is called correctly. If it is + * called the wrong way, segfaults etc. are possible. + */ + + +/* Some declarations copied from bash-2.05b headers */ + +#include + +typedef struct word_desc { + char *word; + int flags; +} WORD_DESC; + +typedef struct word_list { + struct word_list *next; + WORD_DESC *word; +} WORD_LIST; + +typedef int sh_builtin_func_t(WORD_LIST *); + +#define BUILTIN_ENABLED 0x1 + +struct builtin { + char *name; + sh_builtin_func_t *function; + int flags; + char * const *long_doc; + const char *short_doc; + char *handle; +}; + + +/* my hellobash builtin */ + +#include +#include +#include +#include + +struct package; +struct package { + int status; + int stages[10]; + char *prio; + char *repository; + char *name; + char *alias; + char *version; + char *prefix; + char *flags; + struct package *next; +}; + +struct package *package_list = 0; + +int read_pkg_list(const char *file) { + FILE *f = fopen(file, "r"); + struct package *pkg = package_list; + struct package *pkg_tmp; + char line[1024], *tok; + int i; + + while (pkg) { + free(pkg->prio); + free(pkg->repository); + free(pkg->name); + free(pkg->alias); + free(pkg->version); + free(pkg->prefix); + free(pkg->flags); + pkg = (pkg_tmp=pkg)->next; + free(pkg_tmp); + } + + pkg = package_list = 0; + + while (fgets(line, 1024, f)) { + pkg_tmp = calloc(1, sizeof(struct package)); + + tok = strtok(line, " "); + pkg_tmp->status = line[0] == 'X'; + + tok = strtok(0, " "); + for (i=0; i<10; i++) + pkg_tmp->stages[i] = tok[i] != '-'; + + tok = strtok(0, " "); + pkg_tmp->prio = strdup(tok); + + tok = strtok(0, " "); + pkg_tmp->repository = strdup(tok); + + tok = strtok(0, " "); + pkg_tmp->name = strdup(tok); + pkg_tmp->alias = strdup(tok); + + tok = strtok(0, " "); + pkg_tmp->version = strdup(tok); + + tok = strtok(0, " "); + pkg_tmp->prefix = strdup(tok); + + tok = strtok(0, "\n"); + tok[strlen(tok)-2] = 0; + pkg_tmp->flags = strdup(tok); + + if ( !package_list ) + pkg=package_list=pkg_tmp; + else + pkg=pkg->next=pkg_tmp; + } + + fclose(f); + + return 0; +} + +int write_pkg_list(const char *file) { + FILE *f = fopen(file, "w"); + struct package *pkg = package_list; + int i; + + while (pkg) { + fprintf(f, "%c ", pkg->status ? 'X' : 'O'); + for (i=0; i<10; i++) + fprintf(f, "%c", pkg->stages[i] ? '0'+i : '-'); + fprintf(f, " %s %s %s", pkg->prio, pkg->repository, pkg->name); + if (strcmp(pkg->name, pkg->alias)) + fprintf(f, "=%s", pkg->alias); + fprintf(f, " %s %s %s 0\n", pkg->version, pkg->prefix, pkg->flags); + pkg = pkg->next; + } + + fclose(f); + return 0; +} + +int pkgcheck(const char *pattern, const char *mode) +{ + struct package *pkg = package_list; + char *pattern_copy = strdup(pattern); + char *pat_list[10]; + int i; + + pat_list[0] = strtok(pattern_copy, "|"); + for (i=1; i<10; i++) + if ( !(pat_list[1] = strtok(0, "|")) ) break; + + while (pkg) { + for (i=0; i<10 && pat_list[i]; i++) + if (!strcmp(pkg->alias, pat_list[i])) + switch (mode[0]) { + case 'X': + if (pkg->status) goto found; + break; + case 'O': + if (!pkg->status) goto found; + break; + case '.': + goto found; + } + pkg = pkg->next; + } + + free(pattern_copy); + return 1; + +found: + free(pattern_copy); + return 0; +} + +int pkgswitch(int mode, char **args) +{ + struct package *pkg = package_list; + struct package *last_pkg = 0; + struct package *pkg_tmp = 0; + int i; + + while (pkg) { + for (i=0; *args[i]; i++) + if (!strcmp(pkg->alias, args[i])) { + if ( !mode ) { + *(last_pkg ? &(last_pkg->next) : &package_list) = pkg->next; + free(pkg->prio); + free(pkg->repository); + free(pkg->name); + free(pkg->alias); + free(pkg->version); + free(pkg->prefix); + free(pkg->flags); + pkg = (pkg_tmp=pkg)->next; + free(pkg_tmp); + continue; + } else + pkg->status = mode == 1; + } + pkg = (last_pkg=pkg)->next; + } + + return 0; +} + +int cfghlp_builtin(WORD_LIST *list) +{ + char *args[10]; + int i; + + for (i=0; i<10 && list; i++) { + args[i] = list->word->word; + list = list->next; + } + for (; i<10 && list; i++) + args[i] = ""; + + if (!strcmp(args[0],"pkg_in")) + return read_pkg_list(args[1]); + + if (!strcmp(args[0],"pkg_out")) + return write_pkg_list(args[1]); + + if (!strcmp(args[0],"pkgcheck")) + return pkgcheck(args[1], args[2]); + + if (!strcmp(args[0],"pkgremove")) + return pkgswitch(0, args+1); + + if (!strcmp(args[0],"pkgenable")) + return pkgswitch(1, args+1); + + if (!strcmp(args[0],"pkgdisable")) + return pkgswitch(2, args+1); + + return 1; +} + +char *cfghlp_doc[] = { + "ROCK Linux Config Helper", + 0 +}; + +struct builtin cfghlp_struct = { + "cfghlp", + &cfghlp_builtin, + BUILTIN_ENABLED, + cfghlp_doc, + "ROCK Linux Config Helper", + 0 +}; + diff --git a/package/base/dietlibc/config-350.in b/package/base/dietlibc/config-350.in index 7f8d27525..637c91675 100644 --- a/package/base/dietlibc/config-350.in +++ b/package/base/dietlibc/config-350.in @@ -31,6 +31,7 @@ then bool 'Build all with dietlibc' ROCKCFG_DIETLIBC_ALL 1 if [ $ROCKCFG_DIETLIBC_ALL = 0 ]; then block_begin 2 + pkgout for i in `grep " DIETLIBC " config/$config/packages | \ cut -f5 -d" " | sort` do diff --git a/package/base/gcc3/config-300.in b/package/base/gcc3/config-300.in index b81913612..b5b89a25b 100644 --- a/package/base/gcc3/config-300.in +++ b/package/base/gcc3/config-300.in @@ -21,6 +21,7 @@ # --- ROCK-COPYRIGHT-NOTE-END --- menu_begin MENU_COMPILER 'Selecting compiler' + pkgout default='' ; list='' while read pkg ver ; do default=${default:-$pkg} ; [ $pkg = gcc3 ] && default=gcc3 @@ -45,6 +46,7 @@ menu_begin MENU_COMPILER 'Selecting compiler' pkgfilter sed -e '/ gccx / s/^\(..\)../\1--/' fi + pkgout default='' ; list='' while read pkg ver ; do default=${default:-$pkg} ; [ $pkg = gcc3 ] && default=gcc3 @@ -55,6 +57,7 @@ menu_begin MENU_COMPILER 'Selecting compiler' fi choice ROCKCFG_DEFAULT_KCC $default $list + pkgout default='' ; list='' while read pkg ver ; do default=${default:-$pkg} ; [ $pkg = gcc3 ] && default=gcc3 @@ -65,6 +68,7 @@ menu_begin MENU_COMPILER 'Selecting compiler' fi choice ROCKCFG_DEFAULT_CXX $default $list + pkgout default='' ; list='' while read pkg ver ; do default=${default:-$pkg} ; [ $pkg = gcc3 ] && default=gcc3 diff --git a/package/base/linux24/config-500.in b/package/base/linux24/config-500.in index 3463e7297..892e5758f 100644 --- a/package/base/linux24/config-500.in +++ b/package/base/linux24/config-500.in @@ -21,7 +21,7 @@ # --- ROCK-COPYRIGHT-NOTE-END --- menu_begin MENU_PKG_LINUX 'Linux Kernel Options' - default='' ; list='' + pkgout; default='' ; list='' kernels=$( grep KERNEL config/$config/packages | cut -d' ' -f5 | tr '\n' '|' ) while read pkg ver ; do default=${default:-$pkg} ; [ $pkg = linux24 ] && default=linux24 diff --git a/package/base/lprng/config.in b/package/base/lprng/config.in index b3426e36b..38907db38 100644 --- a/package/base/lprng/config.in +++ b/package/base/lprng/config.in @@ -21,7 +21,7 @@ # --- ROCK-COPYRIGHT-NOTE-END --- menu_begin MENU_PRINTER 'Selecting Print System' - list='' + pkgout; list='' while read pkg ver ; do list="$list $pkg Use_${pkg}_($ver)_as_standard_printer" done < <(grep "^X .* PRINTER " config/$config/packages | cut -f5,6 -d' ') diff --git a/package/base/sendmail/config.in b/package/base/sendmail/config.in index 31092eb02..a9a061111 100644 --- a/package/base/sendmail/config.in +++ b/package/base/sendmail/config.in @@ -21,6 +21,7 @@ # --- ROCK-COPYRIGHT-NOTE-END --- menu_begin MENU_MAILER 'Selecting MTA (mail transfer agent)' + pkgout default=''; list='' while read pkg ver ; do default=${default:-$pkg} diff --git a/package/gnome14/gtk+12/config.in b/package/gnome14/gtk+12/config.in index 20008d275..ba8229e8b 100644 --- a/package/gnome14/gtk+12/config.in +++ b/package/gnome14/gtk+12/config.in @@ -20,7 +20,7 @@ # # --- ROCK-COPYRIGHT-NOTE-END --- -if pkgcheck "gtk\+12" X +if pkgcheck "gtk+12" X then menu_begin MENU_PKG_GTK12 'Gtk+1.2 Package Options' bool 'Use locale fonts on input only' \ diff --git a/package/mnemoc/boehm-gc/subconfig-libs.in b/package/mnemoc/boehm-gc/subconfig-libs.in index a4a5fd370..7366d18ea 100644 --- a/package/mnemoc/boehm-gc/subconfig-libs.in +++ b/package/mnemoc/boehm-gc/subconfig-libs.in @@ -24,6 +24,7 @@ if pkgcheck boehm-gc X then comment '--- Boehm-Demers-Weiser conservative garbage collector' + pkgout while read x y; do bool "Use it in Objective-C (gcc-$y)" ROCKCFG_PKG_BOEHMGC_OBJC${x#gcc} 0 bool "Use it in Java (gcc-$y)" ROCKCFG_PKG_BOEHMGC_JAVA${x#gcc} 0 diff --git a/package/rene/apache/config.in b/package/rene/apache/config.in index 7b12b36e1..141fc3f2d 100644 --- a/package/rene/apache/config.in +++ b/package/rene/apache/config.in @@ -26,6 +26,7 @@ then text 'Install prefix for apache packages' \ ROCKCFG_PKG_APACHE_PREFIX "opt/apache" + pkgout list="" ; default="" while read pkg ver ; do if [ "$pkg" = "bdb42" ] ; then diff --git a/scripts/Config b/scripts/Config index 83dd3594f..4ff52da52 100755 --- a/scripts/Config +++ b/scripts/Config @@ -37,6 +37,7 @@ config=default do_config_cycle=0 delete_mode=0 oldconfig='' +nobashmod='' profile="" while [ "$1" ] ; do @@ -45,10 +46,17 @@ while [ "$1" ] ; do -delete) delete_mode=1 ; shift ;; -profile) profile='-profile' ; shift ;; -oldconfig) oldconfig='-oldconfig' ; shift ;; + -nobashmod) nobashmod='-nobashmod' ; shift ;; -cfg) config="$2" ; shift ; shift ;; *) + echo echo "Usage: $0 [ -delete | -oldconfig ] [ -cfg ]" + echo + echo "Other options:" + echo " -profile create a config.profile with profiling data" + echo " -nobashmod don't use the bash config helper plugin" + echo exit 1 ;; esac done @@ -66,14 +74,14 @@ if [ $do_config_cycle = 0 ] ; then mkdir -p src if [ -z "$oldconfig" -a ! -f src/rockdialog.bin ] ; then - echo "Creating rockdialog tool ..." + echo "Creating rockdialog tool." command="gcc misc/rockdialog/*.c ` `-Imisc/rockdialog -lncurses -o src/rockdialog.bin" echo "$command" ; eval "$command.$$" mv src/rockdialog.bin.$$ src/rockdialog.bin fi - echo "Creating configuration script ..." + echo "Creating configuration script." cat << "EOT" > src/rockconfig.awk.$$ #!/usr/bin/awk -f @@ -103,17 +111,25 @@ EOT mv src/rockconfig.in.$$ src/rockconfig.in echo "Running ROCK Linux $rockver configuration ..." - while "$0" -cfg $config $oldconfig $profile -cycle ; do : ; done + while "$0" -cfg $config $oldconfig $profile $nobashmod -cycle ; do : ; done exit 0 fi +if [ -z "$nobashmod" ]; then + if [ ! -f src/config_helper.so -o misc/tools-source/config_helper.c -nt src/config_helper.so ]; then + echo "Building src/config_helper.so." + gcc -shared -fPIC -Wall -o src/config_helper.so misc/tools-source/config_helper.c || exit 1 + fi + enable -f src/config_helper.so cfghlp || exit 1 +fi + if [ -z "$profile" ]; then bprof() { :; } bprof_print() { :; } else - if [ ! -f src/bash_profiler.so ]; then - echo "Building src/bash_profiler.so ..." + if [ ! -f src/bash_profiler.so -o misc/tools-source/bash_profiler.c -nt src/bash_profiler.so ]; then + echo "Building src/bash_profiler.so." gcc -shared -fPIC -Wall -o src/bash_profiler.so misc/tools-source/bash_profiler.c || exit 1 fi enable -f src/bash_profiler.so bprof || exit 1 @@ -143,7 +159,7 @@ if expr "`uname -m`" : "ppc" > /dev/null ; then arch=powerpc ; fi if expr "`uname -m`" : "powerpc" > /dev/null ; then arch=powerpc ; fi current="" ; export ROCKCFG_ARCH="$arch" ; export ROCKCFG_EXPERT=0 menu_this=0 ; menu_current=0 ; menu_counter=0 -menu_stack=-1 ; menu_back=-1 ; menu_backpos=-1 +menu_stack=x ; menu_back=-1 ; menu_backpos=-1 mkdir -p config/$config touch config/$config/config config/$config/packages @@ -162,6 +178,7 @@ echo -e "#\n# ROCK Linux $rockver Config File\n#" > config/$config/config spacer="" ; expert=0 ; tabspace="5" ; tabspace_list="" commentnr=0 ; editfilenr=0 +bprof mkpkglist start cmd="./scripts/Create-PkgList" [ "$ROCKCFG_DISABLE_BROKEN" = 1 ] && cmd="$cmd -nobroken" cmd="$cmd $ROCKCFG_ARCH" @@ -172,9 +189,11 @@ if [ "$cmd" != "`cat config.pcache.cmd 2> /dev/null`" ] ; then else cat config.pcache.data > config/$config/packages fi +bprof mkpkglist stop -export ROCKCFG_ID="$rockver" ; . src/rockconfig.in +export ROCKCFG_ID="$rockver"; pkgin; . src/rockconfig.in; pkgout echo "export ROCKCFG_ID='$ROCKCFG_ID'" >> config/$config/config +rm -f config/$config/*.tmp cut -f1,2,4,5,8- -d' ' config/$config/packages | sed 's, [^ ]*$,,' | \ tr ' ' '\t' | expand -t2,15,35, > config/$config/packages.txt diff --git a/scripts/config.func b/scripts/config.func index 28074d481..39c8aabce 100644 --- a/scripts/config.func +++ b/scripts/config.func @@ -42,51 +42,92 @@ var_insert() { # pkgcheck pattern [XO] # pkgfilter cmd arg1 ... # -pkgfilter() { - bprof pkgfilter start - "$@" < config/$config/packages > config/$config/packages.new - mv config/$config/packages.new config/$config/packages - bprof pkgfilter stop -} -pkgenable() { - bprof pkgenable start - local pattern patterns - for pattern; do - patterns="$patterns -e '/ $pattern / s/^./X/'" - done - if [ "$patterns" ]; then - eval "pkgfilter sed $patterns" - fi - bprof pkgenable stop -} -pkgdisable() { - bprof pkgdisable start - local pattern patterns - for pattern; do - patterns="$patterns -e '/ $pattern / s/^./O/'" - done - if [ "$patterns" ]; then - eval "pkgfilter sed $patterns" - fi - bprof pkgdisable stop -} -pkgremove() { - bprof pkgremove start - local pattern patterns - if [ "$1" ]; then - patterns=" $1 "; shift +if [ -n "$nobashmod" ] +then + pkgin() { :; } + pkgout() { :; } + __pkgfilter() { + "$@" < config/$config/packages > config/$config/packages.new + mv config/$config/packages.new config/$config/packages + } + pkgfilter() { + bprof pkgfilter start + __pkgfilter "$@" + bprof pkgfilter stop + } + pkgenable() { + bprof pkgenable start + local pattern patterns for pattern; do - patterns="$patterns| $pattern " + patterns="$patterns -e '/ $pattern / s/^./X/'" done - pkgfilter egrep -v "$patterns" - fi - bprof pkgremove stop -} -pkgcheck() { - bprof pkgcheck start - egrep -q "^$2.* ($1) " config/$config/packages - bprof pkgcheck stop -} + if [ "$patterns" ]; then + eval "__pkgfilter sed $patterns" + fi + bprof pkgenable stop + } + pkgdisable() { + bprof pkgdisable start + local pattern patterns + for pattern; do + patterns="$patterns -e '/ $pattern / s/^./O/'" + done + if [ "$patterns" ]; then + eval "__pkgfilter sed $patterns" + fi + bprof pkgdisable stop + } + pkgremove() { + bprof pkgremove start + local pattern patterns + if [ "$1" ]; then + patterns=" $1 "; shift + for pattern; do + patterns="$patterns| $pattern " + done + __pkgfilter egrep -v "$patterns" + fi + bprof pkgremove stop + } + pkgcheck() { + bprof pkgcheck start + local pattern="$1"; pattern="${pattern//+/\\+}" + egrep -q "^$2.*[ =]($pattern) " config/$config/packages; local ret=$? + bprof pkgcheck stop + return $ret + } +else + pkgin() { cfghlp pkg_in config/$config/packages; } + pkgout() { cfghlp pkg_out config/$config/packages ; } + pkgfilter() { + bprof pkgfilter start + cfghlp pkg_out config/$config/packages.tmp + "$@" < config/$config/packages.tmp > config/$config/packages + cfghlp pkg_in config/$config/packages + bprof pkgfilter stop + } + pkgenable() { + bprof pkgenable start + cfghlp pkgenable "$@" + bprof pkgenable stop + } + pkgdisable() { + bprof pkgdisable start + cfghlp pkgdisable "$@" + bprof pkgdisable stop + } + pkgremove() { + bprof pkgremove start + cfghlp pkgremove "$@" + bprof pkgremove stop + } + pkgcheck() { + bprof pkgcheck start + cfghlp pkgcheck "$1" "$2"; local ret=$? + bprof pkgcheck stop + return $ret + } +fi comment() { bprof comment start @@ -359,9 +400,9 @@ block_begin() { block_end() { bprof block_end start if [ $menu_current = $menu_this ] ; then - spacer="`echo "$spacer" | sed 's,..$,,'`" ; - tabspace="`echo $tabspace_list | cut -f1 -d' '`" - tabspace_list="`echo $tabspace_list | cut -s -f2- -d' '`" + spacer="${spacer%??}" + tabspace="${tabspace_list%% *}" + tabspace_list="${tabspace_list#* }" fi bprof block_end stop } @@ -405,8 +446,8 @@ menu_begin() { menu_end() { bprof menu_end start block_end - menu_this="`echo $menu_stack | cut -f1 -d' '`" - menu_stack="`echo $menu_stack | cut -s -f2- -d' '`" + menu_this="${menu_stack%% *}" + menu_stack="${menu_stack#* }" bprof menu_end stop } diff --git a/scripts/config.in b/scripts/config.in index 135dd8da7..40367b172 100644 --- a/scripts/config.in +++ b/scripts/config.in @@ -81,10 +81,7 @@ block_begin 7 then . architecture/$ROCKCFG_ARCH/config.in ; fi bool 'This is a cross-build between architectures' ROCKCFG_CROSSBUILD 0 if [ "$ROCKCFG_CROSSBUILD" = 1 ] ; then - sed -e 's,^\(. ..\)[^ ]*,\1--------,' \ - < config/$config/packages \ - > config/$config/packages.new - mv config/$config/packages.new config/$config/packages + pkgfilter sed -e 's,^\(. ..\)[^ ]*,\1--------,' ROCKCFG_ID="$ROCKCFG_ID-cross" ; ROCKCFGSET_USE_CROSSCC=1 fi block_end @@ -221,6 +218,7 @@ expert_begin done < config/$config/pkgsel >> config/$config/pkgsel.awk echo '{ print; }' >> config/$config/pkgsel.awk + pkgout gawk -f config/$config/pkgsel.awk < config/$config/packages \ > config/$config/packages.new 2> /dev/null if [ -s config/$config/packages.new ] ; then @@ -229,6 +227,7 @@ expert_begin rm -f config/$config/packages.new comment '---- Syntax error(s) in rule set!' fi + pkgin menu_end else rm -f config/$config/pkgsel @@ -311,7 +310,7 @@ break packages!' bool 'Disable National Language Support' ROCKCFG_DISABLE_NLS 0 if [ "$ROCKCFG_DISABLE_NLS" = 1 ] ; then - pkgremove ' gettext ' + pkgremove gettext fi bool 'Automatic documentation creation' ROCKCFG_CREATE_DOCS 1