add the ability to do the same thing as "make dont-optimize" by enabling the
[asterisk/asterisk.git] / build_tools / menuselect.h
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2005-2006, Russell Bryant
5  *
6  * Russell Bryant <russell@digium.com>
7  *
8  * See http://www.asterisk.org for more information about
9  * the Asterisk project. Please do not directly contact
10  * any of the maintainers of this project for assistance;
11  * the project provides a web site, mailing lists and IRC
12  * channels for your use.
13  *
14  * This program is free software, distributed under the terms of
15  * the GNU General Public License Version 2. See the LICENSE file
16  * at the top of the source tree.
17  */
18
19 /*!
20  * \file
21  *
22  * \brief public data structures and defaults for menuselect
23  *
24  */
25
26 #ifndef MENUSELECT_H
27 #define MENUSELECT_H
28
29 #include "asterisk/linkedlists.h"
30
31 #define OUTPUT_MAKEOPTS_DEFAULT "menuselect.makeopts"
32 #define MENUSELECT_DEPS         "build_tools/menuselect-deps"
33
34 struct depend {
35         /*! the name of the dependency */
36         const char *name;
37         /*! for linking */
38         AST_LIST_ENTRY(depend) list;
39 };
40
41 struct conflict {
42         /*! the name of the conflict */
43         const char *name;
44         /*! for linking */
45         AST_LIST_ENTRY(conflict) list;
46 };
47
48 struct member {
49         /*! What will be sent to the makeopts file */
50         const char *name;
51         /*! Display name if known */
52         const char *displayname;
53         /*! Default setting */
54         const char *defaultenabled;
55         /*! This module is currently selected */
56         int enabled;
57         /*! This module has failed dependencies */
58         int depsfailed;
59         /*! This module has failed conflicts */
60         int conflictsfailed;
61         /*! dependencies of this module */
62         AST_LIST_HEAD_NOLOCK(, depend) deps;
63         /*! conflicts of this module */
64         AST_LIST_HEAD_NOLOCK(, conflict) conflicts;
65         /*! for making a list of modules */
66         AST_LIST_ENTRY(member) list;
67 };
68
69 struct category {
70         /*! the Makefile variable */
71         const char *name;
72         /*! the name displayed in the menu */
73         const char *displayname;
74         /*! Display what is selected, as opposed to not selected */
75         int positive_output;
76         /*! Force a clean of the source tree if anything in this category changes */
77         int force_clean_on_change;
78         /*! the list of possible values to be set in this variable */
79         AST_LIST_HEAD_NOLOCK(, member) members;
80         /*! for linking */
81         AST_LIST_ENTRY(category) list;
82 };
83
84 extern AST_LIST_HEAD_NOLOCK(categories, category) categories;
85
86 /*! This is implemented by the frontend */
87 int run_menu(void);
88
89 int count_categories(void);
90
91 int count_members(struct category *cat);
92
93 /*! \brief Toggle a member of a category at the specified index to enabled/disabled */
94 void toggle_enabled(struct category *cat, int index);
95
96 /*! \brief Enable/Disable all members of a category as long as dependencies have been met and no conflicts are found */
97 void set_all(struct category *cat, int val);
98
99 /*! \brief returns non-zero if the string is not defined, or has zero length */
100 static inline int strlen_zero(const char *s)
101 {
102         return (!s || (*s == '\0'));
103 }
104
105 #endif /* MENUSELECT_H */