Make sure not to add JsonParser.c twice Fix Makefile in case JsonParser.c already exists.
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/eb64f820 Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/eb64f820 Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/eb64f820 Branch: refs/heads/master Commit: eb64f820cd0432908f2c629481ab604e311c4756 Parents: bb7ae3b Author: Nick Wellnhofer <wellnho...@aevum.de> Authored: Mon Jul 11 14:32:08 2016 +0200 Committer: Nick Wellnhofer <wellnho...@aevum.de> Committed: Mon Jul 11 15:07:59 2016 +0200 ---------------------------------------------------------------------- common/charmonizer.c | 67 +++++++++++++++++++++++++++++++++++++------- common/charmonizer.main | 11 +++++++- 2 files changed, 67 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy/blob/eb64f820/common/charmonizer.c ---------------------------------------------------------------------- diff --git a/common/charmonizer.c b/common/charmonizer.c index 04778e2..b916fd3 100644 --- a/common/charmonizer.c +++ b/common/charmonizer.c @@ -650,8 +650,10 @@ typedef struct chaz_MakeVar chaz_MakeVar; typedef struct chaz_MakeRule chaz_MakeRule; typedef struct chaz_MakeBinary chaz_MakeBinary; -typedef void (*chaz_Make_list_files_callback_t)(const char *dir, char *file, - void *context); +typedef void +(*chaz_Make_file_callback_t)(const char *dir, char *file, void *context); +typedef int +(*chaz_Make_file_filter_t)(const char *dir, char *file, void *context); /** Initialize the environment. * @@ -685,7 +687,7 @@ chaz_Make_shell_type(void); */ void chaz_Make_list_files(const char *dir, const char *ext, - chaz_Make_list_files_callback_t callback, void *context); + chaz_Make_file_callback_t callback, void *context); /** MakeFile constructor. */ @@ -849,6 +851,19 @@ chaz_MakeBinary_add_src_file(chaz_MakeBinary *self, const char *dir, void chaz_MakeBinary_add_src_dir(chaz_MakeBinary *self, const char *path); +/** Add .c files in a directory as sources for the binary if they match + * a filter. + * + * @param path The path to the directory. + * @param filter A callback that is invoked for every source file. The + * source file is only added if the callback returns true. May be NULL. + * @param context Context passed to filter. + */ +void +chaz_MakeBinary_add_filtered_src_dir(chaz_MakeBinary *self, const char *path, + chaz_Make_file_filter_t filter, + void *context); + /** Add a prerequisite to the make rule of the binary. * * @param prereq The prerequisite. @@ -4542,6 +4557,12 @@ struct chaz_MakeFile { size_t num_binaries; }; +typedef struct { + chaz_MakeBinary *binary; + chaz_Make_file_filter_t filter; + void *filter_ctx; +} chaz_MakeBinaryContext; + /* Static vars. */ static struct { char *make_command; @@ -5491,6 +5512,14 @@ chaz_MakeBinary_add_src_file(chaz_MakeBinary *self, const char *dir, void chaz_MakeBinary_add_src_dir(chaz_MakeBinary *self, const char *path) { + chaz_MakeBinary_add_filtered_src_dir(self, path, NULL, NULL); +} + +void +chaz_MakeBinary_add_filtered_src_dir(chaz_MakeBinary *self, const char *path, + chaz_Make_file_filter_t filter, + void *filter_ctx) { + chaz_MakeBinaryContext context; size_t num_dirs = self->num_dirs; char **dirs = (char**)realloc(self->dirs, (num_dirs + 2) * sizeof(char*)); @@ -5499,18 +5528,27 @@ chaz_MakeBinary_add_src_dir(chaz_MakeBinary *self, const char *path) { self->dirs = dirs; self->num_dirs = num_dirs + 1; + context.binary = self; + context.filter = filter; + context.filter_ctx = filter_ctx; + chaz_Make_list_files(path, "c", S_chaz_MakeBinary_list_files_callback, - self); + &context); } static void S_chaz_MakeBinary_list_files_callback(const char *dir, char *file, - void *context) { + void *vcontext) { + chaz_MakeBinaryContext *context = (chaz_MakeBinaryContext*)vcontext; const char *dir_sep = chaz_OS_dir_sep(); - char *path = chaz_Util_join(dir_sep, dir, file, NULL); - S_chaz_MakeBinary_do_add_src_file((chaz_MakeBinary*)context, path); - free(path); + if (context->filter == NULL + || context->filter(dir, file, context->filter_ctx) != 0 + ) { + char *path = chaz_Util_join(dir_sep, dir, file, NULL); + S_chaz_MakeBinary_do_add_src_file(context->binary, path); + free(path); + } } static void @@ -5600,7 +5638,7 @@ chaz_MakeBinary_get_link_flags(chaz_MakeBinary *self) { void chaz_Make_list_files(const char *dir, const char *ext, - chaz_Make_list_files_callback_t callback, void *context) { + chaz_Make_file_callback_t callback, void *context) { int shell_type = chaz_OS_shell_type(); const char *pattern; char *command; @@ -8640,6 +8678,9 @@ lucy_MakeFile_write_c_cfc_rules(lucy_MakeFile *self); static void lucy_MakeFile_write_c_test_rules(lucy_MakeFile *self); +static int +S_core_dir_filter(const char *dir, char *file, void *context); + static void S_cfh_file_callback(const char *dir, char *file, void *context); @@ -8977,7 +9018,8 @@ lucy_MakeFile_write(lucy_MakeFile *self) { if (self->host_src_dir != NULL) { chaz_MakeBinary_add_src_dir(self->lib, self->host_src_dir); } - chaz_MakeBinary_add_src_dir(self->lib, self->core_dir); + chaz_MakeBinary_add_filtered_src_dir(self->lib, self->core_dir, + S_core_dir_filter, NULL); chaz_MakeBinary_add_src_dir(self->lib, self->snowstem_dir); chaz_MakeBinary_add_src_dir(self->lib, self->snowstop_dir); chaz_MakeBinary_add_src_dir(self->lib, self->utf8proc_dir); @@ -9196,6 +9238,11 @@ lucy_MakeFile_write_c_test_rules(lucy_MakeFile *self) { } } +static int +S_core_dir_filter(const char *dir, char *file, void *context) { + return !S_ends_with(file, "JsonParser.c"); +} + static void S_cfh_file_callback(const char *dir, char *file, void *context) { SourceFileContext *sfc = (SourceFileContext*)context; http://git-wip-us.apache.org/repos/asf/lucy/blob/eb64f820/common/charmonizer.main ---------------------------------------------------------------------- diff --git a/common/charmonizer.main b/common/charmonizer.main index ccf9d4d..dfd0c78 100644 --- a/common/charmonizer.main +++ b/common/charmonizer.main @@ -92,6 +92,9 @@ lucy_MakeFile_write_c_cfc_rules(lucy_MakeFile *self); static void lucy_MakeFile_write_c_test_rules(lucy_MakeFile *self); +static int +S_core_dir_filter(const char *dir, char *file, void *context); + static void S_cfh_file_callback(const char *dir, char *file, void *context); @@ -429,7 +432,8 @@ lucy_MakeFile_write(lucy_MakeFile *self) { if (self->host_src_dir != NULL) { chaz_MakeBinary_add_src_dir(self->lib, self->host_src_dir); } - chaz_MakeBinary_add_src_dir(self->lib, self->core_dir); + chaz_MakeBinary_add_filtered_src_dir(self->lib, self->core_dir, + S_core_dir_filter, NULL); chaz_MakeBinary_add_src_dir(self->lib, self->snowstem_dir); chaz_MakeBinary_add_src_dir(self->lib, self->snowstop_dir); chaz_MakeBinary_add_src_dir(self->lib, self->utf8proc_dir); @@ -648,6 +652,11 @@ lucy_MakeFile_write_c_test_rules(lucy_MakeFile *self) { } } +static int +S_core_dir_filter(const char *dir, char *file, void *context) { + return !S_ends_with(file, "JsonParser.c"); +} + static void S_cfh_file_callback(const char *dir, char *file, void *context) { SourceFileContext *sfc = (SourceFileContext*)context;