Make sure not to add JsonParser.c twice
Fix Makefile in case JsonParser.c already exists.
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_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 @@
*/
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
}
+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;
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 @@
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 @@
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 @@
}
}
+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;