full removed config.h, use bb_config.h only
diff --git a/Makefile b/Makefile
index 1e48bc5..c816c9d 100644
--- a/Makefile
+++ b/Makefile
@@ -386,7 +386,7 @@
 scripts/bb_mkdep: $(top_srcdir)/scripts/bb_mkdep.c
 	$(HOSTCC) $(HOSTCFLAGS) -o $@ $<
 
-DEP_INCLUDES := include/config.h include/bb_config.h
+DEP_INCLUDES := include/bb_config.h
 
 ifeq ($(strip $(CONFIG_BBCONFIG)),y)
 DEP_INCLUDES += include/bbconfigopts.h
@@ -401,25 +401,15 @@
 	$(disp_gen)
 	$(Q)$(RM_F) .depend
 	$(Q)mkdir -p include/config
-	$(Q)scripts/bb_mkdep -c include/config.h -c include/bb_config.h \
-			-I $(top_srcdir)/include $(top_srcdir) > $@.tmp
+	$(Q)scripts/bb_mkdep -I $(top_srcdir)/include $(top_srcdir) > $@.tmp
 	$(Q)mv $@.tmp $@
 
-include/config.h: .config
+include/bb_config.h: .config
 	@if [ ! -x $(top_builddir)/scripts/config/conf ] ; then \
 	    $(MAKE) -C scripts/config conf; \
 	fi;
 	@$(top_builddir)/scripts/config/conf -o $(CONFIG_CONFIG_IN)
 
-include/bb_config.h: include/config.h
-	@echo -e "#ifndef BB_CONFIG_H\n#define BB_CONFIG_H" > $@
-	@sed -e h -e 's/#undef CONFIG_\(.*\)/#define ENABLE_\1 0/p' -e g \
-	   -e 's/#undef CONFIG_\(.*\)/#define USE_\1(...)/p' -e g \
-	   -e 's/#define CONFIG_\([^ ]*\).*/#define ENABLE_\1 1/p' -e g -e \
-	   's/#define CONFIG_\([^ ]*\).*/#define USE_\1(...) __VA_ARGS__/p' \
-	   -e g $< >> $@
-	@echo "#endif" >> $@
-
 clean:
 	- $(MAKE) -C scripts/config $@
 	- $(RM_F) docs/busybox.dvi docs/busybox.ps \
diff --git a/include/.cvsignore b/include/.cvsignore
index 9c68c95..0bdc57d 100644
--- a/include/.cvsignore
+++ b/include/.cvsignore
@@ -1,2 +1,3 @@
 config
-config.h
+bb_config.h
+bbconfigopts.h
diff --git a/scripts/bb_mkdep.c b/scripts/bb_mkdep.c
index ca48c6a..a4f97c2 100644
--- a/scripts/bb_mkdep.c
+++ b/scripts/bb_mkdep.c
@@ -1,5 +1,5 @@
 /*
- * Another fast dependencies generator for Makefiles, Version 4.0
+ * Another fast dependencies generator for Makefiles, Version 4.1
  *
  * Copyright (C) 2005,2006 by Vladimir Oleynik <dzo@simtreas.ru>
  *
@@ -26,7 +26,7 @@
  *  - more verbose --help output.
  *
  * This program does:
- * 1) find #define KEY VALUE or #undef KEY from include/config.h
+ * 1) find #define KEY VALUE or #undef KEY from include/bb_config.h
  * 2) recursive find and scan *.[ch] files, but skips scan of include/config/
  * 3) find #include "*.h" and KEYs using, if not as #define and #undef
  * 4) generate dependencies to stdout
@@ -39,7 +39,7 @@
 
 #define LOCAL_INCLUDE_PATH          "include"
 #define INCLUDE_CONFIG_PATH         LOCAL_INCLUDE_PATH"/config"
-#define INCLUDE_CONFIG_KEYS_PATH    LOCAL_INCLUDE_PATH"/config.h"
+#define INCLUDE_CONFIG_KEYS_PATH    LOCAL_INCLUDE_PATH"/bb_config.h"
 
 #define bb_mkdep_full_options \
 "\nOptions:" \
@@ -308,7 +308,7 @@
 #define TOK_UMINUS tok_decl(UNARYPREC+1,0)
 #define TOK_UPLUS tok_decl(UNARYPREC+1,1)
 
-#define SPEC_PREC (UNARYPREC+1)
+#define SPEC_PREC (UNARYPREC+2)
 
 #define TOK_NUM tok_decl(SPEC_PREC, 0)
 #define TOK_RPAREN tok_decl(SPEC_PREC, 1)
@@ -521,13 +521,6 @@
 }
 
 
-/* Like strncpy but make sure the resulting string is always 0 terminated. */
-static inline char * safe_strncpy(char *dst, const char *src, size_t size)
-{
-	dst[size-1] = '\0';
-	return strncpy(dst, src, size-1);
-}
-
 static arith_t arith (const char *expr, int *perrcode)
 {
     char arithval;          /* Current character under analysis */
@@ -1400,7 +1393,10 @@
 		if(*val == '\0') {
 		    recordsz = sprintf(record_buf, "#define %s\n", k);
 		} else {
-		    recordsz = sprintf(record_buf, "#define %s %s\n", k, val);
+		    if(val[0] != '(')
+			recordsz = sprintf(record_buf, "#define %s %s\n", k, val);
+		    else
+			recordsz = sprintf(record_buf, "#define %s%s\n", k, val);
 		}
 	    }
 	    /* size_t -> ssize_t :( */
diff --git a/scripts/config/confdata.c b/scripts/config/confdata.c
index c4087fd..fa26293 100644
--- a/scripts/config/confdata.c
+++ b/scripts/config/confdata.c
@@ -279,6 +279,7 @@
 	char dirname[128], tmpname[128], newname[128];
 	int type, l;
 	const char *str;
+	const char *opt_name;
 
 	dirname[0] = 0;
 	if (name && name[0]) {
@@ -316,6 +317,7 @@
 		     "# Automatically generated make config: don't edit\n"
 		     "#\n");
 	if (out_h) {
+		fprintf(out_h, "#ifndef BB_CONFIG_H\n#define BB_CONFIG_H\n");
 		fprintf(out_h, "/*\n"
 			     " * Automatically generated header file: don't edit\n"
 			     " */\n\n"
@@ -367,14 +369,23 @@
 				if (modules_sym->curr.tri == no)
 					type = S_BOOLEAN;
 			}
+			opt_name = strchr(sym->name, '_');
+			if(opt_name == NULL)
+				opt_name = sym->name;
+			else
+				opt_name++;
 			switch (type) {
 			case S_BOOLEAN:
 			case S_TRISTATE:
 				switch (sym_get_tristate_value(sym)) {
 				case no:
 					fprintf(out, "# %s is not set\n", sym->name);
-					if (out_h)
+					if (out_h) {
 						fprintf(out_h, "#undef %s\n", sym->name);
+						fprintf(out_h, "#define ENABLE_%s 0\n", opt_name);
+						fprintf(out_h, "#define USE_%s(...)\n", opt_name);
+						fprintf(out_h, "#define UNUSE_%s(...)  __VA_ARGS__\n", opt_name);
+					}
 					break;
 				case mod:
 #if 0
@@ -385,8 +396,12 @@
 					break;
 				case yes:
 					fprintf(out, "%s=y\n", sym->name);
-					if (out_h)
+					if (out_h) {
 						fprintf(out_h, "#define %s 1\n", sym->name);
+						fprintf(out_h, "#define ENABLE_%s 1\n", opt_name);
+						fprintf(out_h, "#define USE_%s(...)  __VA_ARGS__\n", opt_name);
+						fprintf(out_h, "#define UNUSE_%s(...)\n", opt_name);
+					}
 					break;
 				}
 				break;
@@ -412,32 +427,47 @@
 					}
 				} while (*str);
 				fputs("\"\n", out);
-				if (out_h)
+				if (out_h) {
 					fputs("\"\n", out_h);
+					fprintf(out_h, "#define ENABLE_%s 1\n", opt_name);
+					fprintf(out_h, "#define USE_%s(...)  __VA_ARGS__\n", opt_name);
+					fprintf(out_h, "#define UNUSE_%s(...)\n", opt_name);
+				}
 				break;
 			case S_HEX:
 				str = sym_get_string_value(sym);
 				if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
 					fprintf(out, "%s=%s\n", sym->name, *str ? str : "0");
-					if (out_h)
+					if (out_h) {
 						fprintf(out_h, "#define %s 0x%s\n", sym->name, str);
+						fprintf(out_h, "#define ENABLE_%s 1\n", opt_name);
+						fprintf(out_h, "#define USE_%s(...)  __VA_ARGS__\n", opt_name);
+						fprintf(out_h, "#define UNUSE_%s(...)\n", opt_name);
+					}
 					break;
 				}
 			case S_INT:
 				str = sym_get_string_value(sym);
 				fprintf(out, "%s=%s\n", sym->name, *str ? str : "0");
-				if (out_h)
+				if (out_h) {
 					fprintf(out_h, "#define %s %s\n", sym->name, str);
+					fprintf(out_h, "#define ENABLE_%s 1\n", opt_name);
+					fprintf(out_h, "#define USE_%s(...)  __VA_ARGS__\n", opt_name);
+					fprintf(out_h, "#define UNUSE_%s(...)\n", opt_name);
+				}
 				break;
 			}
+			if (out_h)
+				fprintf(out_h, "\n");
 		}
 next:
 		menu = next_menu(menu);
 	}
 	fclose(out);
 	if (out_h) {
+		fprintf(out_h, "#endif /* BB_CONFIG_H */\n");
 		fclose(out_h);
-		rename(".tmpconfig.h", "include/config.h");
+		rename(".tmpconfig.h", "include/bb_config.h");
 		file_write_dep(NULL);
 	}
 	if (!name || basename != conf_def_filename) {