mirror of
https://github.com/odin-lang/Odin.git
synced 2026-02-14 23:33:15 +00:00
Merge pull request #5797 from harold-b/hb.export-linked-libs
Add build flag to export the linked libraries
This commit is contained in:
71
src/main.cpp
71
src/main.cpp
@@ -391,6 +391,7 @@ enum BuildFlagKind {
|
||||
BuildFlag_MinLinkLibs,
|
||||
|
||||
BuildFlag_PrintLinkerFlags,
|
||||
BuildFlag_ExportLinkedLibraries,
|
||||
|
||||
BuildFlag_IntegerDivisionByZero,
|
||||
|
||||
@@ -616,6 +617,7 @@ gb_internal bool parse_build_flags(Array<String> args) {
|
||||
add_flag(&build_flags, BuildFlag_MaxErrorCount, str_lit("max-error-count"), BuildFlagParam_Integer, Command_all);
|
||||
|
||||
add_flag(&build_flags, BuildFlag_MinLinkLibs, str_lit("min-link-libs"), BuildFlagParam_None, Command__does_build);
|
||||
add_flag(&build_flags, BuildFlag_ExportLinkedLibraries, str_lit("export-linked-libs-file"), BuildFlagParam_String, Command__does_check);
|
||||
|
||||
add_flag(&build_flags, BuildFlag_PrintLinkerFlags, str_lit("print-linker-flags"), BuildFlagParam_None, Command_build);
|
||||
|
||||
@@ -1547,6 +1549,14 @@ gb_internal bool parse_build_flags(Array<String> args) {
|
||||
build_context.min_link_libs = true;
|
||||
break;
|
||||
|
||||
case BuildFlag_ExportLinkedLibraries:
|
||||
build_context.export_linked_libs_path = string_trim_whitespace(value.value_string);
|
||||
if (build_context.export_linked_libs_path.len == 0) {
|
||||
gb_printf_err("-%.*s specified an empty path\n", LIT(name));
|
||||
bad_flags = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case BuildFlag_PrintLinkerFlags:
|
||||
build_context.print_linker_flags = true;
|
||||
break;
|
||||
@@ -2262,6 +2272,63 @@ gb_internal void export_dependencies(Checker *c) {
|
||||
}
|
||||
}
|
||||
|
||||
gb_internal void export_linked_libraries(LinkerData *gen) {
|
||||
gbFile f = {};
|
||||
char * fileName = (char *)build_context.export_linked_libs_path.text;
|
||||
gbFileError err = gb_file_open_mode(&f, gbFileMode_Write, fileName);
|
||||
if (err != gbFileError_None) {
|
||||
gb_printf_err("Failed to export linked library list to: %s\n", fileName);
|
||||
exit_with_errors();
|
||||
return;
|
||||
}
|
||||
defer (gb_file_close(&f));
|
||||
|
||||
StringSet min_libs_set = {};
|
||||
string_set_init(&min_libs_set, 64);
|
||||
defer (string_set_destroy(&min_libs_set));
|
||||
|
||||
for (auto *e : gen->foreign_libraries) {
|
||||
GB_ASSERT(e->kind == Entity_LibraryName);
|
||||
|
||||
for (auto lib_path : e->LibraryName.paths) {
|
||||
lib_path = string_trim_whitespace(lib_path);
|
||||
if (lib_path.len == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (string_set_update(&min_libs_set, lib_path)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
gb_fprintf(&f, "%.*s\t", LIT(lib_path));
|
||||
|
||||
String ext = path_extension(lib_path, false);
|
||||
if (str_eq_ignore_case(ext, "a") || str_eq_ignore_case(ext, "lib") ||
|
||||
str_eq_ignore_case(ext, "o") || str_eq_ignore_case(ext, "obj")
|
||||
) {
|
||||
gb_fprintf(&f, "static");
|
||||
} else {
|
||||
gb_fprintf(&f, "dynamic");
|
||||
}
|
||||
|
||||
gb_fprintf(&f, "\t");
|
||||
ast_node(imp, ForeignImportDecl, e->LibraryName.decl);
|
||||
for (Ast* file_path : imp->filepaths) {
|
||||
GB_ASSERT(file_path->tav.mode == Addressing_Constant && file_path->tav.value.kind == ExactValue_String);
|
||||
String file_path_str = file_path->tav.value.value_string;
|
||||
|
||||
if (string_starts_with(file_path_str, str_lit("system:"))) {
|
||||
gb_fprintf(&f, "system");
|
||||
} else {
|
||||
gb_fprintf(&f, "user");
|
||||
}
|
||||
}
|
||||
|
||||
gb_fprintf(&f, "\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gb_internal void remove_temp_files(lbGenerator *gen) {
|
||||
if (build_context.keep_temp_files) return;
|
||||
|
||||
@@ -3940,6 +4007,10 @@ int main(int arg_count, char const **arg_ptr) {
|
||||
export_dependencies(checker);
|
||||
}
|
||||
return result;
|
||||
} else {
|
||||
if (build_context.export_linked_libs_path != "") {
|
||||
export_linked_libraries(gen);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user