From 467e8bf4db1e45ad765ac945bd486883aafeb529 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Tue, 23 Feb 2016 14:13:36 +0100 Subject: builder: Add sources referenced from debuginfo into Debug runtime --- builder/builder-module.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) (limited to 'builder') diff --git a/builder/builder-module.c b/builder/builder-module.c index 9640d4b..37ee4b0 100644 --- a/builder/builder-module.c +++ b/builder/builder-module.c @@ -705,30 +705,89 @@ builder_module_handle_debuginfo (BuilderModule *self, g_autofree char *filename = g_path_get_basename (rel_path); g_autofree char *filename_debug = g_strconcat (filename, ".debug", NULL); g_autofree char *debug_dir = NULL; + g_autofree char *source_dir_path = NULL; + g_autoptr(GFile) source_dir = NULL; g_autofree char *real_debug_dir = NULL; if (g_str_has_prefix (rel_path_dir, "files/")) { debug_dir = g_build_filename (app_dir_path, "files/lib/debug", rel_path_dir + strlen("files/"), NULL); real_debug_dir = g_build_filename ("/app/lib/debug", rel_path_dir + strlen("files/"), NULL); + source_dir_path = g_build_filename (app_dir_path, "files/lib/debug/source", NULL); } else if (g_str_has_prefix (rel_path_dir, "usr/")) { debug_dir = g_build_filename (app_dir_path, "usr/lib/debug", rel_path_dir, NULL); real_debug_dir = g_build_filename ("/usr/lib/debug", rel_path_dir, NULL); + source_dir_path = g_build_filename (app_dir_path, "usr/lib/debug/source", NULL); } if (debug_dir) { + const char *builddir; + g_autoptr(GError) local_error = NULL; + g_auto(GStrv) file_refs = NULL; + if (g_mkdir_with_parents (debug_dir, 0755) != 0) { glnx_set_error_from_errno (error); return FALSE; } + source_dir = g_file_new_for_path (source_dir_path); + if (g_mkdir_with_parents (source_dir_path, 0755) != 0) + { + glnx_set_error_from_errno (error); + return FALSE; + } + + if (builder_context_get_build_runtime (context)) + builddir = "/run/build-runtime/"; + else + builddir = "/run/build/"; + debug_path = g_build_filename (debug_dir, filename_debug, NULL); real_debug_path = g_build_filename (real_debug_dir, filename_debug, NULL); + file_refs = builder_get_debuginfo_file_references (path, &local_error); + + if (file_refs == NULL) + g_warning (local_error->message); + else + { + GFile *build_dir = builder_context_get_build_dir (context); + int i; + g_print ("Copying sources: \n"); + for (i = 0; file_refs[i] != NULL; i++) + { + if (g_str_has_prefix (file_refs[i], builddir)) + { + const char *relative_path = file_refs[i] + strlen (builddir); + g_autoptr(GFile) src = g_file_resolve_relative_path (build_dir, relative_path); + g_autoptr(GFile) dst = g_file_resolve_relative_path (source_dir, relative_path); + g_autoptr(GFile) dst_parent = g_file_get_parent (dst); + GFileType file_type; + + if (!gs_file_ensure_directory (dst_parent, TRUE, NULL, error)) + return FALSE; + + file_type = g_file_query_file_type (src, 0, NULL); + if (file_type == G_FILE_TYPE_DIRECTORY) + { + if (!gs_file_ensure_directory (dst, FALSE, NULL, error)) + return FALSE; + } + else if (file_type == G_FILE_TYPE_REGULAR) + { + if (!g_file_copy (src, dst, + G_FILE_COPY_OVERWRITE, + NULL, NULL, NULL, error)) + return FALSE; + } + } + } + } + g_print ("stripping %s to %s\n", path, debug_path); if (!eu_strip (error, "--remove-comment", "--reloc-debug-sections", "-f", debug_path, -- cgit v1.2.1