Add chaz_MakeFile_add_dir_to_cleanup We have to distinguish files from directories on Windows.
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/c822e10a Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/c822e10a Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/c822e10a Branch: refs/heads/master Commit: c822e10afb9d274d357eba09fa714d10d9072279 Parents: e6c3ffd Author: Nick Wellnhofer <[email protected]> Authored: Mon Mar 4 22:04:58 2013 +0100 Committer: Nick Wellnhofer <[email protected]> Committed: Sat Mar 9 17:51:54 2013 +0100 ---------------------------------------------------------------------- charmonizer/src/Charmonizer/Core/Make.c | 119 ++++++++++++++++--------- charmonizer/src/Charmonizer/Core/Make.h | 8 ++ 2 files changed, 84 insertions(+), 43 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy/blob/c822e10a/charmonizer/src/Charmonizer/Core/Make.c ---------------------------------------------------------------------- diff --git a/charmonizer/src/Charmonizer/Core/Make.c b/charmonizer/src/Charmonizer/Core/Make.c index ec9e5d1..8a8f149 100644 --- a/charmonizer/src/Charmonizer/Core/Make.c +++ b/charmonizer/src/Charmonizer/Core/Make.c @@ -38,8 +38,10 @@ struct chaz_MakeFile { size_t num_vars; chaz_MakeRule **rules; size_t num_rules; - char **cleanups; - size_t num_cleanups; + char **cleanup_files; + size_t num_cleanup_files; + char **cleanup_dirs; + size_t num_cleanup_dirs; }; /* Static vars. */ @@ -158,9 +160,13 @@ chaz_MakeFile_new() { makefile->rules[0] = NULL; makefile->num_rules = 0; - makefile->cleanups = (char**)malloc(sizeof(char*)); - makefile->cleanups[0] = NULL; - makefile->num_cleanups = 0; + makefile->cleanup_files = (char**)malloc(sizeof(char*)); + makefile->cleanup_files[0] = NULL; + makefile->num_cleanup_files = 0; + + makefile->cleanup_dirs = (char**)malloc(sizeof(char*)); + makefile->cleanup_dirs[0] = NULL; + makefile->num_cleanup_dirs = 0; return makefile; } @@ -214,15 +220,26 @@ chaz_MakeFile_add_rule(chaz_MakeFile *makefile, const char *target, void chaz_MakeFile_add_to_cleanup(chaz_MakeFile *makefile, const char *target) { - char *cleanup = chaz_Util_strdup(target); - char **cleanups = makefile->cleanups; - size_t num_cleanups = makefile->num_cleanups + 1; - - cleanups = (char**)realloc(cleanups, (num_cleanups + 1) * sizeof(char*)); - cleanups[num_cleanups-1] = cleanup; - cleanups[num_cleanups] = NULL; - makefile->cleanups = cleanups; - makefile->num_cleanups = num_cleanups; + char **files = makefile->cleanup_files; + size_t num_files = makefile->num_cleanup_files + 1; + + files = (char**)realloc(files, (num_files + 1) * sizeof(char*)); + files[num_files-1] = chaz_Util_strdup(target); + files[num_files] = NULL; + makefile->cleanup_files = files; + makefile->num_cleanup_files = num_files; +} + +void +chaz_MakeFile_add_dir_to_cleanup(chaz_MakeFile *makefile, const char *dir) { + char **dirs = makefile->cleanup_dirs; + size_t num_dirs = makefile->num_cleanup_dirs + 1; + + dirs = (char**)realloc(dirs, (num_dirs + 1) * sizeof(char*)); + dirs[num_dirs-1] = chaz_Util_strdup(dir); + dirs[num_dirs] = NULL; + makefile->cleanup_dirs = dirs; + makefile->num_cleanup_dirs = num_dirs; } chaz_MakeRule* @@ -293,62 +310,78 @@ chaz_MakeFile_add_shared_obj(chaz_MakeFile *makefile, const char *shared_obj, void chaz_MakeFile_write(chaz_MakeFile *makefile) { int shell_type = chaz_OS_shell_type(); - FILE *file; + FILE *out; size_t i; - file = fopen("Makefile", "w"); - if (!file) { + out = fopen("Makefile", "w"); + if (!out) { chaz_Util_die("Can't open Makefile\n"); } for (i = 0; makefile->vars[i]; i++) { chaz_MakeVar *var = makefile->vars[i]; - fprintf(file, "%s = %s\n", var->name, var->value); + fprintf(out, "%s = %s\n", var->name, var->value); } - fprintf(file, "\n"); + fprintf(out, "\n"); for (i = 0; makefile->rules[i]; i++) { chaz_MakeRule *rule = makefile->rules[i]; - fprintf(file, "%s :", rule->targets); + fprintf(out, "%s :", rule->targets); if (rule->prereqs) { - fprintf(file, " %s", rule->prereqs); + fprintf(out, " %s", rule->prereqs); } - fprintf(file, "\n"); + fprintf(out, "\n"); if (rule->commands) { - fprintf(file, "%s", rule->commands); + fprintf(out, "%s", rule->commands); } - fprintf(file, "\n"); + fprintf(out, "\n"); } - if (makefile->cleanups[0]) { + if (makefile->cleanup_files[0] || makefile->cleanup_dirs[0]) { + fprintf(out, "clean :\n"); if (shell_type == CHAZ_OS_POSIX) { - fprintf(file, "clean :\n\trm -f"); - for (i = 0; makefile->cleanups[i]; i++) { - const char *cleanup = makefile->cleanups[i]; - fprintf(file, " \\\n\t %s", cleanup); + if (makefile->cleanup_files[0]) { + fprintf(out, "\trm -f"); + for (i = 0; makefile->cleanup_files[i]; i++) { + const char *file = makefile->cleanup_files[i]; + fprintf(out, " \\\n\t %s", file); + } + fprintf(out, "\n"); + } + if (makefile->cleanup_dirs[0]) { + fprintf(out, "\trm -rf"); + for (i = 0; makefile->cleanup_dirs[i]; i++) { + const char *dir = makefile->cleanup_dirs[i]; + fprintf(out, " \\\n\t %s", dir); + } + fprintf(out, "\n"); } - fprintf(file, "\n\n"); } else if (shell_type == CHAZ_OS_CMD_EXE) { - fprintf(file, "clean :\n"); - for (i = 0; makefile->cleanups[i]; i++) { - const char *cleanup = makefile->cleanups[i]; - fprintf(file, "\tfor %%i in (%s) do @if exist %%i del /f %%i\n", - cleanup); + for (i = 0; makefile->cleanup_files[i]; i++) { + const char *file = makefile->cleanup_files[i]; + fprintf(out, "\tfor %%i in (%s) do @if exist %%i del /f %%i\n", + file); + } + for (i = 0; makefile->cleanup_dirs[i]; i++) { + const char *dir = makefile->cleanup_dirs[i]; + fprintf(out, + "\tfor %%i in (%s) do @if exist %%i rmdir /s /q %%i\n", + dir); } - fprintf(file, "\n"); } else { chaz_Util_die("Unsupported shell type: %d", shell_type); } + fprintf(out, "\n"); } - fprintf(file, "distclean : clean\n"); + fprintf(out, "distclean : clean\n"); if (shell_type == CHAZ_OS_POSIX) { - fprintf(file, "\trm -f charmonizer$(EXE_EXT) charmony.h Makefile\n\n"); + fprintf(out, "\trm -f charmonizer$(EXE_EXT) charmony.h Makefile\n\n"); } else if (shell_type == CHAZ_OS_CMD_EXE) { - fprintf(file, + fprintf(out, "\tfor %%i in (charmonizer$(EXE_EXT) charmonizer$(OBJ_EXT)" " charmony.h Makefile) do @if exist %%i del /f %%i\n\n"); } @@ -358,16 +391,16 @@ chaz_MakeFile_write(chaz_MakeFile *makefile) { if (chaz_Make.is_nmake) { /* Inference rule for .c files. */ - fprintf(file, ".c.obj :\n"); + fprintf(out, ".c.obj :\n"); if (chaz_CC_msvc_version_num()) { - fprintf(file, "\t$(CC) $(CFLAGS) /c $< /Fo$@\n\n"); + fprintf(out, "\t$(CC) $(CFLAGS) /c $< /Fo$@\n\n"); } else { - fprintf(file, "\t$(CC) $(CFLAGS) -c $< -o $@\n\n"); + fprintf(out, "\t$(CC) $(CFLAGS) -c $< -o $@\n\n"); } } - fclose(file); + fclose(out); } void http://git-wip-us.apache.org/repos/asf/lucy/blob/c822e10a/charmonizer/src/Charmonizer/Core/Make.h ---------------------------------------------------------------------- diff --git a/charmonizer/src/Charmonizer/Core/Make.h b/charmonizer/src/Charmonizer/Core/Make.h index 4122b26..b7ed46b 100644 --- a/charmonizer/src/Charmonizer/Core/Make.h +++ b/charmonizer/src/Charmonizer/Core/Make.h @@ -95,6 +95,14 @@ chaz_MakeFile_add_rule(chaz_MakeFile *makefile, const char *target, void chaz_MakeFile_add_to_cleanup(chaz_MakeFile *makefile, const char *target); +/** Add a directory to the 'clean' target. + * + * @param makefile The makefile. + * @param dir The directory. + */ +void +chaz_MakeFile_add_dir_to_cleanup(chaz_MakeFile *makefile, const char *dir); + /** Add a rule to link an executable. The executable will also be added to the * list of files to clean. *
