From 56652c9ea1dc5b3482c64d9b4310df7a3663dcc7 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Fri, 27 Nov 2015 09:32:22 +0100 Subject: [PATCH] builder: Add support for cmake and forced builddir --- builder/builder-module.c | 89 ++++++++++++++++++++++++++++++++++++---- doc/xdg-app-builder.xml | 8 ++++ 2 files changed, 88 insertions(+), 9 deletions(-) diff --git a/builder/builder-module.c b/builder/builder-module.c index 5acdae2e..ae69ff6a 100644 --- a/builder/builder-module.c +++ b/builder/builder-module.c @@ -43,6 +43,8 @@ struct BuilderModule { char **make_install_args; gboolean rm_configure; gboolean no_autogen; + gboolean cmake; + gboolean builddir; BuilderOptions *build_options; GPtrArray *changes; char **cleanup; @@ -63,6 +65,8 @@ enum { PROP_NAME, PROP_RM_CONFIGURE, PROP_NO_AUTOGEN, + PROP_CMAKE, + PROP_BUILDDIR, PROP_CONFIG_OPTS, PROP_MAKE_ARGS, PROP_MAKE_INSTALL_ARGS, @@ -114,6 +118,14 @@ builder_module_get_property (GObject *object, g_value_set_boolean (value, self->no_autogen); break; + case PROP_CMAKE: + g_value_set_boolean (value, self->cmake); + break; + + case PROP_BUILDDIR: + g_value_set_boolean (value, self->builddir); + break; + case PROP_CONFIG_OPTS: g_value_set_boxed (value, self->config_opts); break; @@ -167,6 +179,14 @@ builder_module_set_property (GObject *object, self->no_autogen = g_value_get_boolean (value); break; + case PROP_CMAKE: + self->cmake = g_value_get_boolean (value); + break; + + case PROP_BUILDDIR: + self->builddir = g_value_get_boolean (value); + break; + case PROP_CONFIG_OPTS: tmp = self->config_opts; self->config_opts = g_strdupv (g_value_get_boxed (value)); @@ -236,6 +256,20 @@ builder_module_class_init (BuilderModuleClass *klass) "", FALSE, G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_CMAKE, + g_param_spec_boolean ("cmake", + "", + "", + FALSE, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_BUILDDIR, + g_param_spec_boolean ("builddir", + "", + "", + FALSE, + G_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_SOURCES, g_param_spec_pointer ("sources", @@ -498,6 +532,7 @@ builder_module_build (BuilderModule *self, g_autofree char *make_l = NULL; g_autofree char *makefile_content = NULL; g_autoptr(GFile) configure_file = NULL; + g_autoptr(GFile) cmake_file = NULL; const char *makefile_names[] = {"Makefile", "makefile", "GNUmakefile", NULL}; g_autoptr(GFile) build_dir = NULL; gboolean has_configure; @@ -543,12 +578,25 @@ builder_module_build (BuilderModule *self, if (cxxflags) env = g_environ_setenv (env, "CXXFLAGS", cxxflags, TRUE); - configure_file = g_file_get_child (source_dir, "configure"); - - if (self->rm_configure) + if (self->cmake) { - if (!g_file_delete (configure_file, NULL, error)) - return FALSE; + cmake_file = g_file_get_child (source_dir, "CMakeLists.txt"); + if (g_file_query_exists (cmake_file, NULL)) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Can't find CMakeLists.txt"); + return FALSE; + } + configure_file = g_object_ref (cmake_file); + } + else + { + configure_file = g_file_get_child (source_dir, "configure"); + + if (self->rm_configure) + { + if (!g_file_delete (configure_file, NULL, error)) + return FALSE; + } } has_configure = g_file_query_exists (configure_file, NULL); @@ -592,27 +640,48 @@ builder_module_build (BuilderModule *self, if (has_configure) { const char *configure_cmd; + const char *configure_final_arg = skip_arg; + const char *configure_prefix_arg = skip_arg; g_autofree char *configure_content = NULL; if (!g_file_load_contents (configure_file, NULL, &configure_content, NULL, NULL, error)) return FALSE; var_require_builddir = strstr (configure_content, "buildapi-variable-require-builddir") != NULL; - use_builddir = var_require_builddir; + use_builddir = var_require_builddir || self->builddir; if (use_builddir) { build_dir = g_file_get_child (source_dir, "_build"); - configure_cmd = "../configure"; + if (self->cmake) + { + configure_cmd = "cmake"; + configure_final_arg = ".."; + } + else + { + configure_cmd = "../configure"; + } } else { build_dir = g_object_ref (source_dir); - configure_cmd = "./configure"; + if (self->cmake) + { + configure_cmd = "cmake"; + configure_final_arg = "."; + } + else + configure_cmd = "./configure"; } + if (self->cmake) + configure_prefix_arg = "-DCMAKE_INSTALL_PREFIX:PATH='/app'"; + else + configure_prefix_arg = "--prefix=/app"; + if (!build (app_dir, source_dir, build_dir, build_args, env, error, - configure_cmd, "--prefix=/app", strv_arg, self->config_opts, NULL)) + configure_cmd, configure_prefix_arg, strv_arg, self->config_opts, configure_final_arg, NULL)) return FALSE; } else @@ -673,6 +742,8 @@ builder_module_checksum (BuilderModule *self, builder_cache_checksum_strv (cache, self->make_install_args); builder_cache_checksum_boolean (cache, self->rm_configure); builder_cache_checksum_boolean (cache, self->no_autogen); + builder_cache_checksum_boolean (cache, self->cmake); + builder_cache_checksum_boolean (cache, self->builddir); for (l = self->sources; l != NULL; l = l->next) { diff --git a/doc/xdg-app-builder.xml b/doc/xdg-app-builder.xml index b7a91738..594d3876 100644 --- a/doc/xdg-app-builder.xml +++ b/doc/xdg-app-builder.xml @@ -230,6 +230,14 @@ Ignore the existance of an autogen script + + + Use cmake instead of configure + + + + Force the use of a build dirrectory separated from the source directory. + A build options object that can override global options