void print_source_tree(const char* path, void (*cb)(const char*, int)) { const char** i; /* Open an enclosing group */ strcpy(buffer, path); if (buffer[strlen(buffer) - 1] == '/') /* Trim off trailing path separator */ buffer[strlen(buffer) - 1] = '\0'; cb(buffer, WST_OPENGROUP); for (i = prj_get_files(); *i != NULL; ++i) { const char* source = (*i); /* For each file in the target directory... */ if (strlen(source) > strlen(path) && strncmp(source, path, strlen(path)) == 0) { /* Look for a subdirectory... */ const char* ptr = strchr(source + strlen(path), '/'); if (ptr != NULL) { const char** j; /* Pull out the subdirectory name */ strncpy(buffer, source, ptr - source + 1); buffer[ptr - source + 1] = '\0'; /* Have I processed this subdirectory already? Check to see if * I encountered the same subdir name earlier in the list */ for (j = prj_get_files(); *j != NULL; ++j) { if (strncmp(buffer, *j, strlen(buffer)) == 0) break; } if (i == j) { /* Not processed earlier, process it now. Make a local copy * because 'buffer' will be reused in the next call */ char* newpath = (char*)malloc(strlen(buffer) + 1); strcpy(newpath, buffer); print_source_tree(newpath, cb); free(newpath); } } } } /* Now send all files that live in 'path' */ for (i = prj_get_files(); *i != NULL; ++i) { const char* source = (*i); const char* ptr = strrchr(source, '/'); /* Make sure file is in path and not a subdir under path */ if (strncmp(path, source, strlen(path)) == 0 && ptr <= source + strlen(path)) cb(source, WST_SOURCEFILE); } /* Close the enclosing group */ strcpy(buffer, path); if (buffer[strlen(buffer)-1] == '/') /* Trim off trailing path separator */ buffer[strlen(buffer)-1] = '\0'; cb(buffer, WST_CLOSEGROUP); }
int cb_cpp() { int i; /* Write the file */ if (!io_openfile(path_join(prj_get_pkgpath(), prj_get_pkgname(), "cbp"))) return 0; io_print("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n"); io_print("<CodeBlocks_project_file>\n"); io_print("\t<FileVersion major=\"1\" minor=\"6\" />\n"); io_print("\t<Project>\n"); io_print("\t\t<Option title=\"%s\" />\n", prj_get_pkgname()); io_print("\t\t<Option pch_mode=\"2\" />\n"); io_print("\t\t<Option compiler=\"gcc\" />\n"); io_print("\t\t<Build>\n"); for (i = 0; i < prj_get_numconfigs(); ++i) { int kindCode; prj_select_config(i); io_print("\t\t\t<Target title=\"%s\">\n", prj_get_cfgname()); io_print("\t\t\t\t<Option output=\"%s\" prefix_auto=\"0\" extension_auto=\"0\" />\n", prj_get_target()); io_print("\t\t\t\t<Option object_output=\"%s\" />\n", prj_get_objdir()); if (prj_is_kind("winexe")) kindCode = 0; else if (prj_is_kind("exe")) kindCode = 1; else if (prj_is_kind("lib")) kindCode = 2; else if (prj_is_kind("dll")) kindCode = 3; else { printf("** Unsupported project kind %s\n", prj_get_kind()); return 0; } io_print("\t\t\t\t<Option type=\"%d\" />\n", kindCode); io_print("\t\t\t\t<Option compiler=\"gcc\" />\n"); if (prj_is_kind("dll")) { io_print("\t\t\t\t<Option createDefFile=\"0\" />\n"); if (prj_has_flag("no-import-lib")) io_print("\t\t\t\t<Option createStaticLib=\"0\" />\n"); else io_print("\t\t\t\t<Option createStaticLib=\"1\" />\n"); } io_print("\t\t\t\t<Compiler>\n"); if (prj_has_flag("extra-warnings")) print_opt("-Wall"); if (prj_has_flag("fatal-warnings")) print_opt("-Werror"); if (prj_has_flag("no-exceptions")) print_opt("--no-exceptions"); if (prj_has_flag("no-frame-pointer")) print_opt("-fomit-frame-pointer"); if (prj_has_flag("no-rtti")) print_opt("--no-rtti"); if (!prj_has_flag("no-symbols")) print_opt("-g"); if (prj_has_flag("optimize-size")) print_opt("-Os"); if (prj_has_flag("optimize-speed")) print_opt("-O3"); if (prj_has_flag("optimize") && !prj_has_flag("optimize-size") && !prj_has_flag("optimize-speed")) print_opt("-O"); if (prj_has_pch()) { /* Warns you if your pch file is out of date */ print_opt("-Winvalid-pch"); /* Force include the pch header so the user doesn't need to */ io_print("\t\t\t\t\t<Add option=\"-include "%s"\" />\n", prj_get_pch_header()); } print_list(prj_get_defines(), "\t\t\t\t\t<Add option=\"-D", "\" />\n", "", NULL); print_list(prj_get_buildoptions(), "\t\t\t\t\t<Add option=\"", "\" />\n", "", NULL); print_list(prj_get_incpaths(), "\t\t\t\t\t<Add directory=\"", "\" />\n", "", NULL); io_print("\t\t\t\t</Compiler>\n"); io_print("\t\t\t\t<Linker>\n"); if (prj_has_flag("no-symbols")) print_opt("-s"); print_list(prj_get_linkoptions(), "\t\t\t\t\t<Add option=\"", "\" />\n", "", NULL); io_print("\t\t\t\t\t<Add directory=\"%s\" />\n", prj_get_bindir()); if (!matches(prj_get_bindir(), prj_get_libdir())) io_print("\t\t\t\t\t<Add directory=\"%s\" />\n", prj_get_libdir()); print_list(prj_get_libpaths(), "\t\t\t\t\t<Add directory=\"", "\" />\n", "", NULL); print_list(prj_get_links(), "\t\t\t\t\t<Add directory=\"", "\" />\n", "", filterLinksForPaths); print_list(prj_get_links(), "\t\t\t\t\t<Add library=\"", "\" />\n", "", filterLinks); io_print("\t\t\t\t</Linker>\n"); if (prj_find_filetype(".rc")) { io_print("\t\t\t\t<ResourceCompiler>\n"); print_list(prj_get_respaths(), "\t\t\t\t\t<Add directory=\"", "\" />\n", "", NULL); io_print("\t\t\t\t</ResourceCompiler>\n"); } if (prj_get_numprebuildcommands() > 0 || prj_get_numpostbuildcommands() > 0) { io_print("\t\t\t\t<ExtraCommands>\n"); if (prj_get_numprebuildcommands() > 0) print_list(prj_get_prebuildcommands(), "\t\t\t\t\t<Add before=\"", "\" />\n", "", NULL); if (prj_get_numpostbuildcommands() > 0) print_list(prj_get_postbuildcommands(), "\t\t\t\t\t<Add after=\"", "\" />\n", "", NULL); io_print("\t\t\t\t</ExtraCommands>\n"); } io_print("\t\t\t</Target>\n"); } io_print("\t\t</Build>\n"); print_list(prj_get_files(), "", "", "", listFiles); io_print("\t\t<Extensions />\n"); io_print("\t</Project>\n"); io_print("</CodeBlocks_project_file>\n"); io_closefile(); return 1; }