diff options
-rw-r--r-- | scripts/kconfig/Makefile | 6 | ||||
-rw-r--r-- | scripts/kconfig/confdata.c | 4 | ||||
-rw-r--r-- | scripts/kconfig/expr.h | 1 | ||||
-rw-r--r-- | scripts/kconfig/gconf.c | 11 | ||||
-rw-r--r-- | scripts/kconfig/lkc.h | 6 | ||||
-rw-r--r-- | scripts/kconfig/mconf.c | 2 | ||||
-rw-r--r-- | scripts/kconfig/merge_config.sh | 117 |
7 files changed, 133 insertions, 14 deletions
diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile index 914833d99b06..79662658fb91 100644 --- a/scripts/kconfig/Makefile +++ b/scripts/kconfig/Makefile | |||
@@ -50,9 +50,8 @@ localyesconfig localmodconfig: $(obj)/streamline_config.pl $(obj)/conf | |||
50 | 50 | ||
51 | # Create new linux.pot file | 51 | # Create new linux.pot file |
52 | # Adjust charset to UTF-8 in .po file to accept UTF-8 in Kconfig files | 52 | # Adjust charset to UTF-8 in .po file to accept UTF-8 in Kconfig files |
53 | # The symlink is used to repair a deficiency in arch/um | ||
54 | update-po-config: $(obj)/kxgettext $(obj)/gconf.glade.h | 53 | update-po-config: $(obj)/kxgettext $(obj)/gconf.glade.h |
55 | $(Q)echo " GEN config" | 54 | $(Q)echo " GEN config.pot" |
56 | $(Q)xgettext --default-domain=linux \ | 55 | $(Q)xgettext --default-domain=linux \ |
57 | --add-comments --keyword=_ --keyword=N_ \ | 56 | --add-comments --keyword=_ --keyword=N_ \ |
58 | --from-code=UTF-8 \ | 57 | --from-code=UTF-8 \ |
@@ -63,10 +62,11 @@ update-po-config: $(obj)/kxgettext $(obj)/gconf.glade.h | |||
63 | $(Q)(for i in `ls $(srctree)/arch/*/Kconfig \ | 62 | $(Q)(for i in `ls $(srctree)/arch/*/Kconfig \ |
64 | $(srctree)/arch/*/um/Kconfig`; \ | 63 | $(srctree)/arch/*/um/Kconfig`; \ |
65 | do \ | 64 | do \ |
66 | echo " GEN $$i"; \ | 65 | echo " GEN $$i"; \ |
67 | $(obj)/kxgettext $$i \ | 66 | $(obj)/kxgettext $$i \ |
68 | >> $(obj)/config.pot; \ | 67 | >> $(obj)/config.pot; \ |
69 | done ) | 68 | done ) |
69 | $(Q)echo " GEN linux.pot" | ||
70 | $(Q)msguniq --sort-by-file --to-code=UTF-8 $(obj)/config.pot \ | 70 | $(Q)msguniq --sort-by-file --to-code=UTF-8 $(obj)/config.pot \ |
71 | --output $(obj)/linux.pot | 71 | --output $(obj)/linux.pot |
72 | $(Q)rm -f $(obj)/config.pot | 72 | $(Q)rm -f $(obj)/config.pot |
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index 5a58965d8800..7c7a5a6cc3f5 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c | |||
@@ -464,7 +464,7 @@ kconfig_print_comment(FILE *fp, const char *value, void *arg) | |||
464 | fprintf(fp, "#"); | 464 | fprintf(fp, "#"); |
465 | if (l) { | 465 | if (l) { |
466 | fprintf(fp, " "); | 466 | fprintf(fp, " "); |
467 | fwrite(p, l, 1, fp); | 467 | xfwrite(p, l, 1, fp); |
468 | p += l; | 468 | p += l; |
469 | } | 469 | } |
470 | fprintf(fp, "\n"); | 470 | fprintf(fp, "\n"); |
@@ -537,7 +537,7 @@ header_print_comment(FILE *fp, const char *value, void *arg) | |||
537 | fprintf(fp, " *"); | 537 | fprintf(fp, " *"); |
538 | if (l) { | 538 | if (l) { |
539 | fprintf(fp, " "); | 539 | fprintf(fp, " "); |
540 | fwrite(p, l, 1, fp); | 540 | xfwrite(p, l, 1, fp); |
541 | p += l; | 541 | p += l; |
542 | } | 542 | } |
543 | fprintf(fp, "\n"); | 543 | fprintf(fp, "\n"); |
diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h index 80fce57080cc..d4ecce8bc3a6 100644 --- a/scripts/kconfig/expr.h +++ b/scripts/kconfig/expr.h | |||
@@ -10,6 +10,7 @@ | |||
10 | extern "C" { | 10 | extern "C" { |
11 | #endif | 11 | #endif |
12 | 12 | ||
13 | #include <assert.h> | ||
13 | #include <stdio.h> | 14 | #include <stdio.h> |
14 | #ifndef __cplusplus | 15 | #ifndef __cplusplus |
15 | #include <stdbool.h> | 16 | #include <stdbool.h> |
diff --git a/scripts/kconfig/gconf.c b/scripts/kconfig/gconf.c index 9f4438027df4..adc230638c5b 100644 --- a/scripts/kconfig/gconf.c +++ b/scripts/kconfig/gconf.c | |||
@@ -683,7 +683,7 @@ void on_introduction1_activate(GtkMenuItem * menuitem, gpointer user_data) | |||
683 | dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd), | 683 | dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd), |
684 | GTK_DIALOG_DESTROY_WITH_PARENT, | 684 | GTK_DIALOG_DESTROY_WITH_PARENT, |
685 | GTK_MESSAGE_INFO, | 685 | GTK_MESSAGE_INFO, |
686 | GTK_BUTTONS_CLOSE, intro_text); | 686 | GTK_BUTTONS_CLOSE, "%s", intro_text); |
687 | g_signal_connect_swapped(GTK_OBJECT(dialog), "response", | 687 | g_signal_connect_swapped(GTK_OBJECT(dialog), "response", |
688 | G_CALLBACK(gtk_widget_destroy), | 688 | G_CALLBACK(gtk_widget_destroy), |
689 | GTK_OBJECT(dialog)); | 689 | GTK_OBJECT(dialog)); |
@@ -701,7 +701,7 @@ void on_about1_activate(GtkMenuItem * menuitem, gpointer user_data) | |||
701 | dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd), | 701 | dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd), |
702 | GTK_DIALOG_DESTROY_WITH_PARENT, | 702 | GTK_DIALOG_DESTROY_WITH_PARENT, |
703 | GTK_MESSAGE_INFO, | 703 | GTK_MESSAGE_INFO, |
704 | GTK_BUTTONS_CLOSE, about_text); | 704 | GTK_BUTTONS_CLOSE, "%s", about_text); |
705 | g_signal_connect_swapped(GTK_OBJECT(dialog), "response", | 705 | g_signal_connect_swapped(GTK_OBJECT(dialog), "response", |
706 | G_CALLBACK(gtk_widget_destroy), | 706 | G_CALLBACK(gtk_widget_destroy), |
707 | GTK_OBJECT(dialog)); | 707 | GTK_OBJECT(dialog)); |
@@ -720,7 +720,7 @@ void on_license1_activate(GtkMenuItem * menuitem, gpointer user_data) | |||
720 | dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd), | 720 | dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd), |
721 | GTK_DIALOG_DESTROY_WITH_PARENT, | 721 | GTK_DIALOG_DESTROY_WITH_PARENT, |
722 | GTK_MESSAGE_INFO, | 722 | GTK_MESSAGE_INFO, |
723 | GTK_BUTTONS_CLOSE, license_text); | 723 | GTK_BUTTONS_CLOSE, "%s", license_text); |
724 | g_signal_connect_swapped(GTK_OBJECT(dialog), "response", | 724 | g_signal_connect_swapped(GTK_OBJECT(dialog), "response", |
725 | G_CALLBACK(gtk_widget_destroy), | 725 | G_CALLBACK(gtk_widget_destroy), |
726 | GTK_OBJECT(dialog)); | 726 | GTK_OBJECT(dialog)); |
@@ -830,7 +830,7 @@ static void renderer_edited(GtkCellRendererText * cell, | |||
830 | static void change_sym_value(struct menu *menu, gint col) | 830 | static void change_sym_value(struct menu *menu, gint col) |
831 | { | 831 | { |
832 | struct symbol *sym = menu->sym; | 832 | struct symbol *sym = menu->sym; |
833 | tristate oldval, newval; | 833 | tristate newval; |
834 | 834 | ||
835 | if (!sym) | 835 | if (!sym) |
836 | return; | 836 | return; |
@@ -847,7 +847,6 @@ static void change_sym_value(struct menu *menu, gint col) | |||
847 | switch (sym_get_type(sym)) { | 847 | switch (sym_get_type(sym)) { |
848 | case S_BOOLEAN: | 848 | case S_BOOLEAN: |
849 | case S_TRISTATE: | 849 | case S_TRISTATE: |
850 | oldval = sym_get_tristate_value(sym); | ||
851 | if (!sym_tristate_within_range(sym, newval)) | 850 | if (!sym_tristate_within_range(sym, newval)) |
852 | newval = yes; | 851 | newval = yes; |
853 | sym_set_tristate_value(sym, newval); | 852 | sym_set_tristate_value(sym, newval); |
@@ -1278,7 +1277,6 @@ static void update_tree(struct menu *src, GtkTreeIter * dst) | |||
1278 | gboolean valid; | 1277 | gboolean valid; |
1279 | GtkTreeIter *sibling; | 1278 | GtkTreeIter *sibling; |
1280 | struct symbol *sym; | 1279 | struct symbol *sym; |
1281 | struct property *prop; | ||
1282 | struct menu *menu1, *menu2; | 1280 | struct menu *menu1, *menu2; |
1283 | 1281 | ||
1284 | if (src == &rootmenu) | 1282 | if (src == &rootmenu) |
@@ -1287,7 +1285,6 @@ static void update_tree(struct menu *src, GtkTreeIter * dst) | |||
1287 | valid = gtk_tree_model_iter_children(model2, child2, dst); | 1285 | valid = gtk_tree_model_iter_children(model2, child2, dst); |
1288 | for (child1 = src->list; child1; child1 = child1->next) { | 1286 | for (child1 = src->list; child1; child1 = child1->next) { |
1289 | 1287 | ||
1290 | prop = child1->prompt; | ||
1291 | sym = child1->sym; | 1288 | sym = child1->sym; |
1292 | 1289 | ||
1293 | reparse: | 1290 | reparse: |
diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h index b633bdb9f3d4..c18f2bd9c095 100644 --- a/scripts/kconfig/lkc.h +++ b/scripts/kconfig/lkc.h | |||
@@ -90,8 +90,10 @@ struct conf_printer { | |||
90 | /* confdata.c and expr.c */ | 90 | /* confdata.c and expr.c */ |
91 | static inline void xfwrite(const void *str, size_t len, size_t count, FILE *out) | 91 | static inline void xfwrite(const void *str, size_t len, size_t count, FILE *out) |
92 | { | 92 | { |
93 | if (fwrite(str, len, count, out) < count) | 93 | assert(len != 0); |
94 | fprintf(stderr, "\nError in writing or end of file.\n"); | 94 | |
95 | if (fwrite(str, len, count, out) != count) | ||
96 | fprintf(stderr, "Error in writing or end of file.\n"); | ||
95 | } | 97 | } |
96 | 98 | ||
97 | /* menu.c */ | 99 | /* menu.c */ |
diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c index 19e200d91120..2c6286c0bc1a 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c | |||
@@ -830,6 +830,8 @@ static int handle_exit(void) | |||
830 | fprintf(stderr, _("\n\n" | 830 | fprintf(stderr, _("\n\n" |
831 | "Your configuration changes were NOT saved." | 831 | "Your configuration changes were NOT saved." |
832 | "\n\n")); | 832 | "\n\n")); |
833 | if (res != KEY_ESC) | ||
834 | res = 0; | ||
833 | } | 835 | } |
834 | 836 | ||
835 | return res; | 837 | return res; |
diff --git a/scripts/kconfig/merge_config.sh b/scripts/kconfig/merge_config.sh new file mode 100644 index 000000000000..ceadf0e150cf --- /dev/null +++ b/scripts/kconfig/merge_config.sh | |||
@@ -0,0 +1,117 @@ | |||
1 | #!/bin/sh | ||
2 | # merge_config.sh - Takes a list of config fragment values, and merges | ||
3 | # them one by one. Provides warnings on overridden values, and specified | ||
4 | # values that did not make it to the resulting .config file (due to missed | ||
5 | # dependencies or config symbol removal). | ||
6 | # | ||
7 | # Portions reused from kconf_check and generate_cfg: | ||
8 | # http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/kconf_check | ||
9 | # http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/generate_cfg | ||
10 | # | ||
11 | # Copyright (c) 2009-2010 Wind River Systems, Inc. | ||
12 | # Copyright 2011 Linaro | ||
13 | # | ||
14 | # This program is free software; you can redistribute it and/or modify | ||
15 | # it under the terms of the GNU General Public License version 2 as | ||
16 | # published by the Free Software Foundation. | ||
17 | # | ||
18 | # This program is distributed in the hope that it will be useful, | ||
19 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
20 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
21 | # See the GNU General Public License for more details. | ||
22 | |||
23 | clean_up() { | ||
24 | rm -f $TMP_FILE | ||
25 | exit | ||
26 | } | ||
27 | trap clean_up HUP INT TERM | ||
28 | |||
29 | usage() { | ||
30 | echo "Usage: $0 [OPTIONS] [CONFIG [...]]" | ||
31 | echo " -h display this help text" | ||
32 | echo " -m only merge the fragments, do not execute the make command" | ||
33 | echo " -n use allnoconfig instead of alldefconfig" | ||
34 | } | ||
35 | |||
36 | MAKE=true | ||
37 | ALLTARGET=alldefconfig | ||
38 | |||
39 | while true; do | ||
40 | case $1 in | ||
41 | "-n") | ||
42 | ALLTARGET=allnoconfig | ||
43 | shift | ||
44 | continue | ||
45 | ;; | ||
46 | "-m") | ||
47 | MAKE=false | ||
48 | shift | ||
49 | continue | ||
50 | ;; | ||
51 | "-h") | ||
52 | usage | ||
53 | exit | ||
54 | ;; | ||
55 | *) | ||
56 | break | ||
57 | ;; | ||
58 | esac | ||
59 | done | ||
60 | |||
61 | |||
62 | |||
63 | MERGE_LIST=$* | ||
64 | SED_CONFIG_EXP="s/^\(# \)\{0,1\}\(CONFIG_[a-zA-Z0-9_]*\)[= ].*/\2/p" | ||
65 | TMP_FILE=$(mktemp ./.tmp.config.XXXXXXXXXX) | ||
66 | |||
67 | # Merge files, printing warnings on overrided values | ||
68 | for MERGE_FILE in $MERGE_LIST ; do | ||
69 | echo "Merging $MERGE_FILE" | ||
70 | CFG_LIST=$(sed -n "$SED_CONFIG_EXP" $MERGE_FILE) | ||
71 | |||
72 | for CFG in $CFG_LIST ; do | ||
73 | grep -q -w $CFG $TMP_FILE | ||
74 | if [ $? -eq 0 ] ; then | ||
75 | PREV_VAL=$(grep -w $CFG $TMP_FILE) | ||
76 | NEW_VAL=$(grep -w $CFG $MERGE_FILE) | ||
77 | if [ "x$PREV_VAL" != "x$NEW_VAL" ] ; then | ||
78 | echo Value of $CFG is redefined by fragment $MERGE_FILE: | ||
79 | echo Previous value: $PREV_VAL | ||
80 | echo New value: $NEW_VAL | ||
81 | echo | ||
82 | fi | ||
83 | sed -i "/$CFG[ =]/d" $TMP_FILE | ||
84 | fi | ||
85 | done | ||
86 | cat $MERGE_FILE >> $TMP_FILE | ||
87 | done | ||
88 | |||
89 | if [ "$MAKE" = "false" ]; then | ||
90 | cp $TMP_FILE .config | ||
91 | echo "#" | ||
92 | echo "# merged configuration written to .config (needs make)" | ||
93 | echo "#" | ||
94 | clean_up | ||
95 | exit | ||
96 | fi | ||
97 | |||
98 | # Use the merged file as the starting point for: | ||
99 | # alldefconfig: Fills in any missing symbols with Kconfig default | ||
100 | # allnoconfig: Fills in any missing symbols with # CONFIG_* is not set | ||
101 | make KCONFIG_ALLCONFIG=$TMP_FILE $ALLTARGET | ||
102 | |||
103 | |||
104 | # Check all specified config values took (might have missed-dependency issues) | ||
105 | for CFG in $(sed -n "$SED_CONFIG_EXP" $TMP_FILE); do | ||
106 | |||
107 | REQUESTED_VAL=$(grep -w -e "$CFG" $TMP_FILE) | ||
108 | ACTUAL_VAL=$(grep -w -e "$CFG" .config) | ||
109 | if [ "x$REQUESTED_VAL" != "x$ACTUAL_VAL" ] ; then | ||
110 | echo "Value requested for $CFG not in final .config" | ||
111 | echo "Requested value: $REQUESTED_VAL" | ||
112 | echo "Actual value: $ACTUAL_VAL" | ||
113 | echo "" | ||
114 | fi | ||
115 | done | ||
116 | |||
117 | clean_up | ||