From dab48441955d04bb2579efa9178bbe656f7209b6 Mon Sep 17 00:00:00 2001 From: BWindey <93756910+BWindey@users.noreply.github.com> Date: Sat, 25 Jan 2025 22:52:31 +0100 Subject: [PATCH] [FIX] Let `c3c project` subcommands use same logic as others to get `project.json` (#1885) * Extract project JSON loading into its own function --------- Co-authored-by: Christoffer Lerno --- src/build/build_internal.h | 1 + src/build/builder.c | 2 -- src/build/project.c | 22 +++++++++++---- src/build/project_manipulation.c | 46 ++++++-------------------------- 4 files changed, 26 insertions(+), 45 deletions(-) diff --git a/src/build/build_internal.h b/src/build/build_internal.h index b46611bad..5bfbdc860 100644 --- a/src/build/build_internal.h +++ b/src/build/build_internal.h @@ -125,6 +125,7 @@ static const char *sanitize_modes[4] = { [SANITIZE_THREAD] = "thread", }; +JSONObject *project_json_load(const char **filename_ref); Project *project_load(const char **filename_ref); BuildTarget *project_select_target(const char *filename, Project *project, const char *optional_target); diff --git a/src/build/builder.c b/src/build/builder.c index d002ad671..ec0d71e2c 100644 --- a/src/build/builder.c +++ b/src/build/builder.c @@ -543,8 +543,6 @@ void init_default_build_target(BuildTarget *target, BuildOptions *options) void init_build_target(BuildTarget *target, BuildOptions *options) { *target = (BuildTarget) { 0 }; - // Locate the project.json - file_find_top_dir(); // Parse it const char *filename; Project *project = project_load(&filename); diff --git a/src/build/project.c b/src/build/project.c index a48bfbc03..67d161646 100644 --- a/src/build/project.c +++ b/src/build/project.c @@ -176,7 +176,7 @@ static void load_into_build_target(const char *filename, JSONObject *json, const // CFlags target->cflags = get_cflags(filename, target_name, json, target->cflags); - + // C source dirs. get_list_append_strings(filename, target_name, json, &target->csource_dirs, "c-sources", "c-sources-override", "c-sources-add"); @@ -555,15 +555,19 @@ BuildTarget *project_select_target(const char *filename, Project *project, const error_exit("No build target named '%s' was found in %s. Was it misspelled?", optional_target, filename); } -Project *project_load(const char **filename_ref) +JSONObject *project_json_load(const char **filename_ref) { - Project *project = CALLOCS(Project); - size_t size; + // Locate the project.json + file_find_top_dir(); const char *filename = *filename_ref = file_exists(PROJECT_JSON5) ? PROJECT_JSON5 : PROJECT_JSON; + + size_t size; char *read = file_read_all(filename, &size); + JsonParser parser; json_init_string(&parser, read); JSONObject *json = json_parse(&parser); + if (parser.error_message) { error_exit("Error on line %d reading '%s':'%s'", parser.line, filename, parser.error_message); @@ -572,6 +576,14 @@ Project *project_load(const char **filename_ref) { error_exit("Expected a map of targets in '%s'.", filename); } - project_add_targets(filename, project, json); + + return json; +} + +Project *project_load(const char **filename_ref) +{ + Project *project = CALLOCS(Project); + JSONObject *json = project_json_load(filename_ref); + project_add_targets(*filename_ref, project, json); return project; } diff --git a/src/build/project_manipulation.c b/src/build/project_manipulation.c index fb4486129..be0e0d155 100644 --- a/src/build/project_manipulation.c +++ b/src/build/project_manipulation.c @@ -2,45 +2,14 @@ #include "build_internal.h" #include "project.h" #include "utils/json.h" +#include "utils/lib.h" #define PRINTFN(string, ...) fprintf(stdout, string "\n", ##__VA_ARGS__) // NOLINT #define PRINTF(string, ...) fprintf(stdout, string, ##__VA_ARGS__) // NOLINT -static JSONObject *read_project(const char **file_used, bool assume_empty_if_not_exists) -{ - size_t size; - const char *project_filename = file_exists(PROJECT_JSON5) ? PROJECT_JSON5 : PROJECT_JSON; - *file_used = project_filename; - char *read; - if (assume_empty_if_not_exists) - { - // If project file does not exist assume the project simply being empty instead of - // failing. This is useful for such commands as `project add-target`. It enables - // them to update otherwise non-existing project files reducing the friction. - read = "{}"; - if (file_exists(project_filename)) read = file_read_all(project_filename, &size); - } - else - { - read = file_read_all(project_filename, &size); - } - JsonParser parser; - json_init_string(&parser, read); - JSONObject *json = json_parse(&parser); - if (parser.error_message) - { - error_exit("Error on line %d reading '%s':'%s'", parser.line, project_filename, parser.error_message); - } - if (!json || json->type != J_OBJECT) - { - error_exit("Expected a map of project information in '%s'.", project_filename); - } - return json; -} - const char** get_project_dependency_directories() { const char *filename; - JSONObject *json = read_project(&filename, false); + JSONObject *json = project_json_load(&filename); const char *target = NULL; const char **deps_dirs = NULL; @@ -71,7 +40,7 @@ const char** get_project_dependencies() const char *filename; const char** dependencies = NULL; - JSONObject *project_json = read_project(&filename, false); + JSONObject *project_json = project_json_load(&filename); JSONObject *dependencies_json = json_map_get(project_json, "dependencies"); FOREACH(JSONObject *, element, dependencies_json->elements) @@ -312,7 +281,7 @@ void fetch_project(BuildOptions* options) const char **libdirs = get_project_dependency_directories(); const char **deps = get_project_dependencies(); const char *filename; - JSONObject *project_json = read_project(&filename, false); + JSONObject *project_json = project_json_load(&filename); JSONObject *targets_json = json_map_get(project_json, "targets"); @@ -381,7 +350,7 @@ void add_libraries_to_project_file(const char** libs, const char* target_name) { //TODO! Target name option not implemented const char *filename; - JSONObject *project_json = read_project(&filename, false); + JSONObject *project_json = project_json_load(&filename); // TODO! check if target is specified and exists (NULL at the moment) JSONObject *libraries_json = json_map_get(project_json, "dependencies"); @@ -418,7 +387,8 @@ void add_libraries_to_project_file(const char** libs, const char* target_name) { void add_target_project(BuildOptions *build_options) { const char *filename; - JSONObject *project_json = read_project(&filename, true); + /* NOTE: this previously allowed project.json to not exist, and create it */ + JSONObject *project_json = project_json_load(&filename); JSONObject *targets_json = json_map_get(project_json, "targets"); if (targets_json == NULL) @@ -542,7 +512,7 @@ static void view_filtered_project_properties(BuildOptions *build_options, const void view_project(BuildOptions *build_options) { const char *filename; - JSONObject *project_json = read_project(&filename, false); + JSONObject *project_json = project_json_load(&filename); bool filter_properties = build_options->project_options.view_modifier.flags_bitvector != 0;