diff options
author | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-06-18 12:52:08 +0000 |
---|---|---|
committer | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-06-18 12:52:08 +0000 |
commit | 24e2e224b8171094a2dd8b9232da439ae1ecf711 (patch) | |
tree | 8404511a25e6e8e6736d0c09bc96393e441c5b3a /build_tools | |
parent | 198718ea0a36b43039278a6ea0ffc9ce40f6150f (diff) |
commit russell's menuselect/buildoptions work with some changes:
reverted per-directory .cleancount support
added ability for 'remove_on_change' to support multiple filenames
add 'remove_on_change' support to members, not just categories
only do 'remove_on_change' removals if the config is actually saved
add a 'remove_on_change' entry for each module found by prep_moduledeps so that if it gets turned off any existing .o/.so files will disappear
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@34577 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'build_tools')
-rw-r--r-- | build_tools/cflags.xml | 2 | ||||
-rw-r--r-- | build_tools/menuselect.c | 51 | ||||
-rw-r--r-- | build_tools/menuselect.h | 10 | ||||
-rwxr-xr-x | build_tools/prep_moduledeps | 2 |
4 files changed, 44 insertions, 21 deletions
diff --git a/build_tools/cflags.xml b/build_tools/cflags.xml index a8e312403..1fe28f30d 100644 --- a/build_tools/cflags.xml +++ b/build_tools/cflags.xml @@ -1,4 +1,4 @@ - <category name="MENUSELECT_CFLAGS" displayname="Compiler Flags" positive_output="yes" force_clean_on_change="yes"> + <category name="MENUSELECT_CFLAGS" displayname="Compiler Flags" positive_output="yes" remove_on_change=".lastclean"> <member name="DEBUG_CHANNEL_LOCKS" displayname="Debug Channel Locking"> </member> <member name="DEBUG_SCHEDULER" displayname="Enable Scheduler Debugging Output"> diff --git a/build_tools/menuselect.c b/build_tools/menuselect.c index 68afeed44..62be208f7 100644 --- a/build_tools/menuselect.c +++ b/build_tools/menuselect.c @@ -70,9 +70,6 @@ static int existing_config = 0; /*! This is set when the --check-deps argument is provided. */ static int check_deps = 0; -/*! Force a clean of the source tree */ -static int force_clean = 0; - /*! \brief return a pointer to the first non-whitespace character */ static inline char *skip_blanks(char *str) { @@ -175,8 +172,7 @@ static int parse_makeopts_xml(const char *makeopts_xml) cat->displayname = mxmlElementGetAttr(cur, "displayname"); if ((tmp = mxmlElementGetAttr(cur, "positive_output"))) cat->positive_output = !strcasecmp(tmp, "yes"); - if ((tmp = mxmlElementGetAttr(cur, "force_clean_on_change"))) - cat->force_clean_on_change = !strcasecmp(tmp, "yes"); + cat->remove_on_change = mxmlElementGetAttr(cur, "remove_on_change"); if (add_category(cat)) { free(cat); @@ -193,8 +189,10 @@ static int parse_makeopts_xml(const char *makeopts_xml) mem->name = mxmlElementGetAttr(cur2, "name"); mem->displayname = mxmlElementGetAttr(cur2, "displayname"); + mem->remove_on_change = mxmlElementGetAttr(cur2, "remove_on_change"); + if (!cat->positive_output) - mem->enabled = 1; + mem->was_enabled = mem->enabled = 1; cur3 = mxmlFindElement(cur2, cur2, "defaultenabled", NULL, NULL, MXML_DESCEND); if (cur3 && cur3->child) @@ -348,7 +346,7 @@ static void mark_as_present(const char *member, const char *category) continue; AST_LIST_TRAVERSE(&cat->members, mem, list) { if (!strcmp(member, mem->name)) { - mem->enabled = cat->positive_output; + mem->was_enabled = mem->enabled = cat->positive_output; break; } } @@ -374,8 +372,6 @@ void toggle_enabled(struct category *cat, int index) if (mem && !(mem->depsfailed || mem->conflictsfailed)) { mem->enabled = !mem->enabled; - if (cat->force_clean_on_change) - force_clean = 1; } } @@ -507,6 +503,34 @@ static int generate_makeopts_file(void) fclose(f); + /* Traverse all categories and members and remove any files that are supposed + to be removed when an item has been changed */ + AST_LIST_TRAVERSE(&categories, cat, list) { + unsigned int had_changes = 0; + char *file, *buf; + + AST_LIST_TRAVERSE(&cat->members, mem, list) { + if (mem->enabled == mem->was_enabled) + continue; + + had_changes = 1; + + if (mem->remove_on_change) { + for (buf = strdupa(mem->remove_on_change), file = strsep(&buf, " "); + file; + file = strsep(&buf, " ")) + unlink(file); + } + } + + if (cat->remove_on_change && had_changes) { + for (buf = strdupa(cat->remove_on_change), file = strsep(&buf, " "); + file; + file = strsep(&buf, " ")) + unlink(file); + } + } + return 0; } @@ -522,7 +546,8 @@ static void dump_member_list(void) AST_LIST_TRAVERSE(&categories, cat, list) { fprintf(stderr, "Category: '%s'\n", cat->name); AST_LIST_TRAVERSE(&cat->members, mem, list) { - fprintf(stderr, " ==>> Member: '%s' (%s)\n", mem->name, mem->enabled ? "Enabled" : "Disabled"); + fprintf(stderr, " ==>> Member: '%s' (%s)", mem->name, mem->enabled ? "Enabled" : "Disabled"); + fprintf(stderr, " Was %s\n", mem->was_enabled ? "Enabled" : "Disabled"); AST_LIST_TRAVERSE(&mem->deps, dep, list) fprintf(stderr, " --> Depends on: '%s'\n", dep->name); if (!AST_LIST_EMPTY(&mem->deps)) @@ -701,11 +726,5 @@ int main(int argc, char *argv[]) free_trees(); free_member_list(); - /* In some cases, such as modifying the CFLAGS for the build, - * a "make clean" needs to be forced. Removing the .lastclean - * file does this. */ - if (force_clean) - unlink(".lastclean"); - exit(res); } diff --git a/build_tools/menuselect.h b/build_tools/menuselect.h index 9dae77ac6..455f60076 100644 --- a/build_tools/menuselect.h +++ b/build_tools/menuselect.h @@ -52,8 +52,12 @@ struct member { const char *displayname; /*! Default setting */ const char *defaultenabled; + /*! Delete these file(s) if this member changes */ + const char *remove_on_change; /*! This module is currently selected */ unsigned int enabled:1; + /*! This module was enabled when the config was loaded */ + unsigned int was_enabled:1; /*! This module has failed dependencies */ unsigned int depsfailed:1; /*! This module has failed conflicts */ @@ -71,10 +75,10 @@ struct category { const char *name; /*! the name displayed in the menu */ const char *displayname; - /*! Display what is selected, as opposed to not selected */ + /*! Delete these file(s) if anything in this category changes */ + const char *remove_on_change; + /*! Output what is selected, as opposed to not selected */ unsigned int positive_output:1; - /*! Force a clean of the source tree if anything in this category changes */ - unsigned int force_clean_on_change:1; /*! the list of possible values to be set in this variable */ AST_LIST_HEAD_NOLOCK(, member) members; /*! for linking */ diff --git a/build_tools/prep_moduledeps b/build_tools/prep_moduledeps index 1a131cb43..f15827882 100755 --- a/build_tools/prep_moduledeps +++ b/build_tools/prep_moduledeps @@ -38,7 +38,7 @@ process_dir() { fname=${file##${dir}/} get_description ${file} desc=${TDESC} - echo -e "\t\t<member name=\"${fname%%.c}\" displayname=\"${desc}\">" + echo -e "\t\t<member name=\"${fname%%.c}\" displayname=\"${desc}\" remove_on_change=\"${dir}/${fname%%.c}.o ${dir}/${fname%%.c}.so\">" awk -f build_tools/get_moduleinfo ${file} echo -e "\t\t</member>" done |