From 59c8c49bdde94c2bfcc4946f6570f09d9e07560b Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Tue, 12 Jan 2016 11:05:37 +0100 Subject: [PATCH] builder: Run builds in /run/build/$modulename This creates repeatable builds for anything that leaves the build dir in the resulting files, such as debug info. --- builder/builder-module.c | 42 +++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/builder/builder-module.c b/builder/builder-module.c index f2ec4f5e9..cd6476b87 100644 --- a/builder/builder-module.c +++ b/builder/builder-module.c @@ -516,8 +516,9 @@ static const char strv_arg[] = "strv"; static gboolean build (GFile *app_dir, + const char *module_name, GFile *source_dir, - GFile *cwd_dir, + const char *cwd_subdir, char **xdg_app_opts, char **env_vars, GError **error, @@ -546,6 +547,12 @@ build (GFile *app_dir, g_ptr_array_add (args, g_strdup ("--nofilesystem=host")); g_ptr_array_add (args, g_strdup_printf ("--filesystem=%s", source_dir_path_canonical)); + g_ptr_array_add (args, g_strdup_printf ("--bind-mount=/run/build/%s=%s", module_name, source_dir_path_canonical)); + if (cwd_subdir) + g_ptr_array_add (args, g_strdup_printf ("--build-dir=/run/build/%s/%s", module_name, cwd_subdir)); + else + g_ptr_array_add (args, g_strdup_printf ("--build-dir=/run/build/%s", module_name)); + if (xdg_app_opts) { for (i = 0; xdg_app_opts[i] != NULL; i++) @@ -582,14 +589,7 @@ build (GFile *app_dir, launcher = g_subprocess_launcher_new (0); - if (cwd_dir) - { - cwd_dir_path = g_file_get_path (cwd_dir); - cwd_dir_path_canonical = canonicalize_file_name (cwd_dir_path); - g_subprocess_launcher_set_cwd (launcher, cwd_dir_path_canonical); - } - else - g_subprocess_launcher_set_cwd (launcher, source_dir_path_canonical); + g_subprocess_launcher_set_cwd (launcher, source_dir_path_canonical); subp = g_subprocess_launcher_spawnv (launcher, (const gchar * const *) args->pdata, error); g_ptr_array_free (args, TRUE); @@ -707,6 +707,7 @@ builder_module_build (BuilderModule *self, g_autoptr(GFile) cmake_file = NULL; const char *makefile_names[] = {"Makefile", "makefile", "GNUmakefile", NULL}; g_autoptr(GFile) build_dir = NULL; + g_autofree char *build_dir_relative = NULL; gboolean has_configure; gboolean var_require_builddir; gboolean has_notparallel; @@ -718,6 +719,7 @@ builder_module_build (BuilderModule *self, g_autofree char *buildname = NULL; g_autoptr(GFile) source_dir = NULL; g_autoptr(GFile) source_subdir = NULL; + const char *source_subdir_relative = NULL; g_autoptr(GFile) source_dir_template = NULL; g_autofree char *source_dir_path = NULL; @@ -743,7 +745,10 @@ builder_module_build (BuilderModule *self, return FALSE; if (self->subdir != NULL && self->subdir[0] != 0) - source_subdir = g_file_resolve_relative_path (source_dir, self->subdir); + { + source_subdir = g_file_resolve_relative_path (source_dir, self->subdir); + source_subdir_relative = self->subdir; + } else source_subdir = g_object_ref (source_dir); @@ -804,7 +809,7 @@ builder_module_build (BuilderModule *self, } env_with_noconfigure = g_environ_setenv (g_strdupv (env), "NOCONFIGURE", "1", TRUE); - if (!build (app_dir, source_dir, source_subdir, build_args, env_with_noconfigure, error, + if (!build (app_dir, self->name, source_dir, source_subdir_relative, build_args, env_with_noconfigure, error, autogen_cmd, NULL)) return FALSE; @@ -832,6 +837,7 @@ builder_module_build (BuilderModule *self, if (use_builddir) { + build_dir_relative = g_build_filename (source_subdir_relative, "_xdg_app_build", NULL); build_dir = g_file_get_child (source_subdir, "_xdg_app_build"); if (!g_file_make_directory (build_dir, NULL, error)) @@ -849,6 +855,7 @@ builder_module_build (BuilderModule *self, } else { + build_dir_relative = g_strdup (source_subdir_relative); build_dir = g_object_ref (source_subdir); if (self->cmake) { @@ -866,12 +873,15 @@ builder_module_build (BuilderModule *self, configure_prefix_arg = g_strdup_printf ("--prefix=%s", builder_options_get_prefix (self->build_options, context)); - if (!build (app_dir, source_dir, build_dir, build_args, env, error, + if (!build (app_dir, self->name, source_dir, build_dir_relative, build_args, env, error, configure_cmd, configure_prefix_arg, strv_arg, self->config_opts, configure_final_arg, NULL)) return FALSE; } else - build_dir = g_object_ref (source_subdir); + { + build_dir_relative = g_strdup (source_subdir_relative); + build_dir = g_object_ref (source_subdir); + } for (i = 0; makefile_names[i] != NULL; i++) { @@ -902,11 +912,11 @@ builder_module_build (BuilderModule *self, /* Build and install */ - if (!build (app_dir, source_dir, build_dir, build_args, env, error, + if (!build (app_dir, self->name, source_dir, build_dir_relative, build_args, env, error, "make", make_j?make_j:skip_arg, make_l?make_l:skip_arg, strv_arg, self->make_args, NULL)) return FALSE; - if (!build (app_dir, source_dir, build_dir, build_args, env, error, + if (!build (app_dir, self->name, source_dir, build_dir_relative, build_args, env, error, "make", "install", strv_arg, self->make_install_args, NULL)) return FALSE; @@ -916,7 +926,7 @@ builder_module_build (BuilderModule *self, { for (i = 0; self->post_install[i] != NULL; i++) { - if (!build (app_dir, source_dir, build_dir, build_args, env, error, + if (!build (app_dir, self->name, source_dir, build_dir_relative, build_args, env, error, "/bin/sh", "-c", self->post_install[i], NULL)) return FALSE; }