[gnome-builder] plugins/buildconfig: add build target provider



commit d515d548d755a284bbab054769b7411be7755264
Author: Christian Hergert <chergert redhat com>
Date:   Tue Apr 5 12:53:26 2022 -0700

    plugins/buildconfig: add build target provider
    
    The goal here is just so that we can gain the ability to run a command
    that is defined in the .buildconfig. Long term, we want run-command
    providers rather than relying on build-command providers, but this is
    just a stop-gap until we can get there post-GTK-4.

 src/plugins/buildconfig/buildconfig-plugin.c       |   5 +
 .../ide-buildconfig-build-target-provider.c        | 118 +++++++++++++++
 .../ide-buildconfig-build-target-provider.h        |  31 ++++
 .../buildconfig/ide-buildconfig-build-target.c     | 167 +++++++++++++++++++++
 .../buildconfig/ide-buildconfig-build-target.h     |  31 ++++
 .../buildconfig/ide-buildconfig-config-provider.c  |  42 ++++++
 src/plugins/buildconfig/ide-buildconfig-config.c   |  38 +++++
 src/plugins/buildconfig/ide-buildconfig-config.h   |   3 +
 src/plugins/buildconfig/meson.build                |   2 +
 9 files changed, 437 insertions(+)
---
diff --git a/src/plugins/buildconfig/buildconfig-plugin.c b/src/plugins/buildconfig/buildconfig-plugin.c
index 19dcf8e67..c3376615c 100644
--- a/src/plugins/buildconfig/buildconfig-plugin.c
+++ b/src/plugins/buildconfig/buildconfig-plugin.c
@@ -23,14 +23,19 @@
 #include "config.h"
 
 #include <libpeas/peas.h>
+
 #include <libide-foundry.h>
 
+#include "ide-buildconfig-build-target-provider.h"
 #include "ide-buildconfig-config-provider.h"
 #include "ide-buildconfig-pipeline-addin.h"
 
 _IDE_EXTERN void
 _gbp_buildconfig_register_types (PeasObjectModule *module)
 {
+  peas_object_module_register_extension_type (module,
+                                              IDE_TYPE_BUILD_TARGET_PROVIDER,
+                                              IDE_TYPE_BUILDCONFIG_BUILD_TARGET_PROVIDER);
   peas_object_module_register_extension_type (module,
                                               IDE_TYPE_CONFIG_PROVIDER,
                                               IDE_TYPE_BUILDCONFIG_CONFIG_PROVIDER);
diff --git a/src/plugins/buildconfig/ide-buildconfig-build-target-provider.c 
b/src/plugins/buildconfig/ide-buildconfig-build-target-provider.c
new file mode 100644
index 000000000..8cf2dde39
--- /dev/null
+++ b/src/plugins/buildconfig/ide-buildconfig-build-target-provider.c
@@ -0,0 +1,118 @@
+/* ide-buildconfig-build-target-provider.c
+ *
+ * Copyright 2022 Christian Hergert <chergert redhat com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#define G_LOG_DOMAIN "ide-buildconfig-build-target-provider"
+
+#include "config.h"
+
+#include <libide-threading.h>
+
+#include "ide-buildconfig-config.h"
+#include "ide-buildconfig-build-target.h"
+#include "ide-buildconfig-build-target-provider.h"
+
+struct _IdeBuildconfigBuildTargetProvider
+{
+  IdeObject parent_instance;
+};
+
+static void
+ide_buildconfig_build_target_provider_get_targets_async (IdeBuildTargetProvider *provider,
+                                                         GCancellable           *cancellable,
+                                                         GAsyncReadyCallback     callback,
+                                                         gpointer                user_data)
+{
+  IdeBuildconfigBuildTargetProvider *self = (IdeBuildconfigBuildTargetProvider *)provider;
+  g_autoptr(IdeTask) task = NULL;
+  g_autoptr(GPtrArray) targets = NULL;
+  IdeConfigManager *config_manager;
+  IdeConfig *config;
+  IdeContext *context;
+
+  g_assert (IDE_IS_BUILDCONFIG_BUILD_TARGET_PROVIDER (self));
+  g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
+
+  task = ide_task_new (self, cancellable, callback, user_data);
+  ide_task_set_source_tag (task, ide_buildconfig_build_target_provider_get_targets_async);
+  ide_task_set_priority (task, G_PRIORITY_LOW);
+
+  context = ide_object_get_context (IDE_OBJECT (self));
+  config_manager = ide_config_manager_from_context (context);
+  config = ide_config_manager_get_current (config_manager);
+
+  targets = g_ptr_array_new_with_free_func (g_object_unref);
+
+  if (IDE_IS_BUILDCONFIG_CONFIG (config))
+    {
+      const char * const *run_command;
+
+      run_command = ide_buildconfig_config_get_run_command (IDE_BUILDCONFIG_CONFIG (config));
+
+      if (run_command != NULL && run_command[0] != NULL)
+        g_ptr_array_add (targets,
+                         g_object_new (IDE_TYPE_BUILDCONFIG_BUILD_TARGET,
+                                       "command", run_command,
+                                       NULL));
+
+    }
+
+  ide_task_return_pointer (task,
+                           g_steal_pointer (&targets),
+                           g_ptr_array_unref);
+}
+
+static GPtrArray *
+ide_buildconfig_build_target_provider_get_targets_finish (IdeBuildTargetProvider  *provider,
+                                                          GAsyncResult            *result,
+                                                          GError                 **error)
+{
+  GPtrArray *ret;
+
+  g_assert (IDE_IS_BUILDCONFIG_BUILD_TARGET_PROVIDER (provider));
+  g_assert (IDE_IS_TASK (result));
+  g_assert (ide_task_is_valid (IDE_TASK (result), provider));
+
+  ret = ide_task_propagate_pointer (IDE_TASK (result), error);
+
+  return IDE_PTR_ARRAY_STEAL_FULL (&ret);
+}
+
+static void
+build_target_provider_iface_init (IdeBuildTargetProviderInterface *iface)
+{
+  iface->get_targets_async = ide_buildconfig_build_target_provider_get_targets_async;
+  iface->get_targets_finish = ide_buildconfig_build_target_provider_get_targets_finish;
+}
+
+G_DEFINE_FINAL_TYPE_WITH_CODE (IdeBuildconfigBuildTargetProvider,
+                               ide_buildconfig_build_target_provider,
+                               IDE_TYPE_OBJECT,
+                               G_IMPLEMENT_INTERFACE (IDE_TYPE_BUILD_TARGET_PROVIDER,
+                                                      build_target_provider_iface_init))
+
+static void
+ide_buildconfig_build_target_provider_class_init (IdeBuildconfigBuildTargetProviderClass *klass)
+{
+}
+
+static void
+ide_buildconfig_build_target_provider_init (IdeBuildconfigBuildTargetProvider *self)
+{
+}
diff --git a/src/plugins/buildconfig/ide-buildconfig-build-target-provider.h 
b/src/plugins/buildconfig/ide-buildconfig-build-target-provider.h
new file mode 100644
index 000000000..a266d4e3f
--- /dev/null
+++ b/src/plugins/buildconfig/ide-buildconfig-build-target-provider.h
@@ -0,0 +1,31 @@
+/* ide-buildconfig-build-target-provider.h
+ *
+ * Copyright 2022 Christian Hergert <chergert redhat com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#pragma once
+
+#include <libide-foundry.h>
+
+G_BEGIN_DECLS
+
+#define IDE_TYPE_BUILDCONFIG_BUILD_TARGET_PROVIDER (ide_buildconfig_build_target_provider_get_type())
+
+G_DECLARE_FINAL_TYPE (IdeBuildconfigBuildTargetProvider, ide_buildconfig_build_target_provider, IDE, 
BUILDCONFIG_BUILD_TARGET_PROVIDER, IdeObject)
+
+G_END_DECLS
diff --git a/src/plugins/buildconfig/ide-buildconfig-build-target.c 
b/src/plugins/buildconfig/ide-buildconfig-build-target.c
new file mode 100644
index 000000000..631c66cd4
--- /dev/null
+++ b/src/plugins/buildconfig/ide-buildconfig-build-target.c
@@ -0,0 +1,167 @@
+/* ide-buildconfig-build-target.c
+ *
+ * Copyright 2022 Christian Hergert <chergert redhat com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#define G_LOG_DOMAIN "ide-buildconfig-build-target"
+
+#include <libide-foundry.h>
+
+#include "ide-buildconfig-build-target.h"
+
+struct _IdeBuildconfigBuildTarget
+{
+  IdeObject parent;
+
+  char **command;
+};
+
+enum {
+  PROP_0,
+  PROP_COMMAND,
+  N_PROPS
+};
+
+static char *
+ide_buildconfig_build_target_get_display_name (IdeBuildTarget *build_target)
+{
+  IdeBuildconfigBuildTarget *self = IDE_BUILDCONFIG_BUILD_TARGET (build_target);
+
+  if (self->command == NULL || self->command[0] == NULL)
+    return NULL;
+
+  return g_strdup_printf ("%s <span fgalpha='32767' size='smaller'>(.buildconfig)</span>", self->command[0]);
+}
+
+static char *
+ide_buildconfig_build_target_get_name (IdeBuildTarget *build_target)
+{
+  IdeBuildconfigBuildTarget *self = IDE_BUILDCONFIG_BUILD_TARGET (build_target);
+
+  if (self->command == NULL || self->command[0] == NULL)
+    return NULL;
+
+  return g_strdup (self->command[0]);
+}
+
+static char **
+ide_buildconfig_build_target_get_argv (IdeBuildTarget *build_target)
+{
+  IdeBuildconfigBuildTarget *self = IDE_BUILDCONFIG_BUILD_TARGET (build_target);
+
+  return g_strdupv (self->command);
+}
+
+static GFile *
+ide_buildconfig_build_target_get_install_directory (IdeBuildTarget *build_target)
+{
+  return NULL;
+}
+
+static gint
+ide_buildconfig_build_target_get_priority (IdeBuildTarget *build_target)
+{
+  return -50;
+}
+
+static void
+build_target_iface_init (IdeBuildTargetInterface *iface)
+{
+  iface->get_display_name = ide_buildconfig_build_target_get_display_name;
+  iface->get_name = ide_buildconfig_build_target_get_name;
+  iface->get_argv = ide_buildconfig_build_target_get_argv;
+  iface->get_install_directory = ide_buildconfig_build_target_get_install_directory;
+  iface->get_priority = ide_buildconfig_build_target_get_priority;
+}
+
+G_DEFINE_FINAL_TYPE_WITH_CODE (IdeBuildconfigBuildTarget, ide_buildconfig_build_target, IDE_TYPE_OBJECT,
+                               G_IMPLEMENT_INTERFACE (IDE_TYPE_BUILD_TARGET, build_target_iface_init))
+
+static GParamSpec *properties [N_PROPS];
+
+static void
+ide_buildconfig_build_target_finalize (GObject *object)
+{
+  IdeBuildconfigBuildTarget *self = (IdeBuildconfigBuildTarget *)object;
+
+  g_clear_pointer (&self->command, g_strfreev);
+
+  G_OBJECT_CLASS (ide_buildconfig_build_target_parent_class)->finalize (object);
+}
+
+static void
+ide_buildconfig_build_target_get_property (GObject    *object,
+                                       guint       prop_id,
+                                       GValue     *value,
+                                       GParamSpec *pspec)
+{
+  IdeBuildconfigBuildTarget *self = IDE_BUILDCONFIG_BUILD_TARGET (object);
+
+  switch (prop_id)
+    {
+    case PROP_COMMAND:
+      g_value_set_boxed (value, self->command);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+ide_buildconfig_build_target_set_property (GObject      *object,
+                                       guint         prop_id,
+                                       const GValue *value,
+                                       GParamSpec   *pspec)
+{
+  IdeBuildconfigBuildTarget *self = IDE_BUILDCONFIG_BUILD_TARGET (object);
+
+  switch (prop_id)
+    {
+    case PROP_COMMAND:
+      self->command = g_value_dup_boxed (value);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+ide_buildconfig_build_target_class_init (IdeBuildconfigBuildTargetClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->finalize = ide_buildconfig_build_target_finalize;
+  object_class->get_property = ide_buildconfig_build_target_get_property;
+  object_class->set_property = ide_buildconfig_build_target_set_property;
+
+  properties [PROP_COMMAND] =
+    g_param_spec_boxed ("command",
+                         NULL,
+                         NULL,
+                         G_TYPE_STRV,
+                         (G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_properties (object_class, N_PROPS, properties);
+}
+
+static void
+ide_buildconfig_build_target_init (IdeBuildconfigBuildTarget *self)
+{
+}
diff --git a/src/plugins/buildconfig/ide-buildconfig-build-target.h 
b/src/plugins/buildconfig/ide-buildconfig-build-target.h
new file mode 100644
index 000000000..a4a143338
--- /dev/null
+++ b/src/plugins/buildconfig/ide-buildconfig-build-target.h
@@ -0,0 +1,31 @@
+/* ide-buildconfig-build-target.h
+ *
+ * Copyright 2022 Christian Hergert <chergert redhat com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#pragma once
+
+#include <libide-core.h>
+
+G_BEGIN_DECLS
+
+#define IDE_TYPE_BUILDCONFIG_BUILD_TARGET (ide_buildconfig_build_target_get_type())
+
+G_DECLARE_FINAL_TYPE (IdeBuildconfigBuildTarget, ide_buildconfig_build_target, IDE, 
BUILDCONFIG_BUILD_TARGET, IdeObject)
+
+G_END_DECLS
diff --git a/src/plugins/buildconfig/ide-buildconfig-config-provider.c 
b/src/plugins/buildconfig/ide-buildconfig-config-provider.c
index babe4f650..8731197b7 100644
--- a/src/plugins/buildconfig/ide-buildconfig-config-provider.c
+++ b/src/plugins/buildconfig/ide-buildconfig-config-provider.c
@@ -156,6 +156,36 @@ load_strv (IdeConfig   *config,
     }
 }
 
+static void
+load_argv (IdeConfig   *config,
+           GKeyFile    *key_file,
+           const gchar *group,
+           const gchar *key,
+           const gchar *property)
+{
+  g_assert (IDE_IS_CONFIG (config));
+  g_assert (key_file != NULL);
+  g_assert (group != NULL);
+  g_assert (key != NULL);
+
+  if (g_key_file_has_key (key_file, group, key, NULL))
+    {
+      g_autofree char *str = NULL;
+      g_auto(GValue) value = G_VALUE_INIT;
+      g_auto(GStrv) argv = NULL;
+      int argc = 0;
+
+      if ((str = g_key_file_get_string (key_file, group, key, NULL)) &&
+          str[0] != 0 &&
+          g_shell_parse_argv (str, &argc, &argv, NULL))
+        {
+          g_value_init (&value, G_TYPE_STRV);
+          g_value_take_boxed (&value, g_steal_pointer (&argv));
+          g_object_set_property (G_OBJECT (config), property, &value);
+        }
+    }
+}
+
 static void
 load_environ (IdeConfig      *config,
               IdeEnvironment *environment,
@@ -210,6 +240,7 @@ ide_buildconfig_config_provider_create (IdeBuildconfigConfigProvider *self,
   load_string (config, self->key_file, config_id, "app-id", "app-id");
   load_strv (config, self->key_file, config_id, "prebuild", "prebuild");
   load_strv (config, self->key_file, config_id, "postbuild", "postbuild");
+  load_argv (config, self->key_file, config_id, "run-command", "run-command");
 
   if (g_key_file_has_key (self->key_file, config_id, "builddir", NULL))
     {
@@ -476,6 +507,16 @@ ide_buildconfig_config_provider_save_async (IdeConfigProvider   *provider,
       gsize vlen = val ? g_strv_length ((gchar **)val) : 0; \
       g_key_file_set_string_list (self->key_file, config_id, key, val, vlen); \
 } G_STMT_END
+#define PERSIST_ARGV_KEY(key, getter) G_STMT_START { \
+      const gchar * const *val = ide_buildconfig_config_##getter (IDE_BUILDCONFIG_CONFIG (config)); \
+      if (val) \
+        { \
+          g_autofree char *str = g_strjoinv (" ", (char **)val); \
+          g_key_file_set_string (self->key_file, config_id, key, str); \
+        } \
+      else \
+        g_key_file_set_string (self->key_file, config_id, key, ""); \
+} G_STMT_END
 
       PERSIST_STRING_KEY ("name", get_display_name);
       PERSIST_STRING_KEY ("runtime", get_runtime_id);
@@ -486,6 +527,7 @@ ide_buildconfig_config_provider_save_async (IdeConfigProvider   *provider,
       PERSIST_STRING_KEY ("app-id", get_app_id);
       PERSIST_STRV_KEY ("postbuild", get_postbuild);
       PERSIST_STRV_KEY ("prebuild", get_prebuild);
+      PERSIST_ARGV_KEY ("run-command", get_run_command);
 
 #undef PERSIST_STRING_KEY
 #undef PERSIST_STRV_KEY
diff --git a/src/plugins/buildconfig/ide-buildconfig-config.c 
b/src/plugins/buildconfig/ide-buildconfig-config.c
index 83fda7104..9d7910528 100644
--- a/src/plugins/buildconfig/ide-buildconfig-config.c
+++ b/src/plugins/buildconfig/ide-buildconfig-config.c
@@ -30,12 +30,14 @@ struct _IdeBuildconfigConfig
 
   gchar            **prebuild;
   gchar            **postbuild;
+  gchar            **run_command;
 };
 
 enum {
   PROP_0,
   PROP_PREBUILD,
   PROP_POSTBUILD,
+  PROP_RUN_COMMAND,
   N_PROPS
 };
 
@@ -50,6 +52,7 @@ ide_buildconfig_config_finalize (GObject *object)
 
   g_clear_pointer (&self->prebuild, g_strfreev);
   g_clear_pointer (&self->postbuild, g_strfreev);
+  g_clear_pointer (&self->run_command, g_strfreev);
 
   G_OBJECT_CLASS (ide_buildconfig_config_parent_class)->finalize (object);
 }
@@ -72,6 +75,10 @@ ide_buildconfig_config_get_property (GObject    *object,
       g_value_set_boxed (value, ide_buildconfig_config_get_postbuild (self));
       break;
 
+    case PROP_RUN_COMMAND:
+      g_value_set_boxed (value, ide_buildconfig_config_get_run_command (self));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -95,6 +102,10 @@ ide_buildconfig_config_set_property (GObject      *object,
       ide_buildconfig_config_set_postbuild (self, g_value_get_boxed (value));
       break;
 
+    case PROP_RUN_COMMAND:
+      ide_buildconfig_config_set_run_command (self, g_value_get_boxed (value));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -119,6 +130,11 @@ ide_buildconfig_config_class_init (IdeBuildconfigConfigClass *klass)
                         G_TYPE_STRV,
                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
 
+  properties [PROP_RUN_COMMAND] =
+    g_param_spec_boxed ("run-command", NULL, NULL,
+                        G_TYPE_STRV,
+                        G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
   g_object_class_install_properties (object_class, N_PROPS, properties);
 }
 
@@ -170,3 +186,25 @@ ide_buildconfig_config_set_postbuild (IdeBuildconfigConfig *self,
       g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_POSTBUILD]);
     }
 }
+
+const gchar * const *
+ide_buildconfig_config_get_run_command (IdeBuildconfigConfig *self)
+{
+  g_return_val_if_fail (IDE_IS_BUILDCONFIG_CONFIG (self), NULL);
+
+  return (const gchar * const *)self->run_command;
+}
+
+void
+ide_buildconfig_config_set_run_command (IdeBuildconfigConfig *self,
+                                        const gchar * const  *run_command)
+{
+  g_return_if_fail (IDE_IS_BUILDCONFIG_CONFIG (self));
+
+  if (self->run_command != (gchar **)run_command)
+    {
+      g_strfreev (self->run_command);
+      self->run_command = g_strdupv ((gchar **)run_command);
+      g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_RUN_COMMAND]);
+    }
+}
diff --git a/src/plugins/buildconfig/ide-buildconfig-config.h 
b/src/plugins/buildconfig/ide-buildconfig-config.h
index fc557a3aa..69d5b483c 100644
--- a/src/plugins/buildconfig/ide-buildconfig-config.h
+++ b/src/plugins/buildconfig/ide-buildconfig-config.h
@@ -34,5 +34,8 @@ void                 ide_buildconfig_config_set_prebuild    (IdeBuildconfigConfi
 const gchar * const *ide_buildconfig_config_get_postbuild   (IdeBuildconfigConfig *self);
 void                 ide_buildconfig_config_set_postbuild   (IdeBuildconfigConfig *self,
                                                              const gchar * const  *postbuild);
+const gchar * const *ide_buildconfig_config_get_run_command (IdeBuildconfigConfig *self);
+void                 ide_buildconfig_config_set_run_command (IdeBuildconfigConfig *self,
+                                                             const gchar * const  *postbuild);
 
 G_END_DECLS
diff --git a/src/plugins/buildconfig/meson.build b/src/plugins/buildconfig/meson.build
index ca9d20d75..a3ef88ada 100644
--- a/src/plugins/buildconfig/meson.build
+++ b/src/plugins/buildconfig/meson.build
@@ -1,5 +1,7 @@
 plugins_sources += files([
   'buildconfig-plugin.c',
+  'ide-buildconfig-build-target.c',
+  'ide-buildconfig-build-target-provider.c',
   'ide-buildconfig-config.c',
   'ide-buildconfig-config-provider.c',
   'ide-buildconfig-pipeline-addin.c',


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]