1 /* ide-simple-build-target.c
2 *
3 * Copyright 2018-2019 Christian Hergert <chergert@redhat.com>
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 *
18 * SPDX-License-Identifier: GPL-3.0-or-later
19 */
20
21 #define G_LOG_DOMAIN "ide-simple-build-target"
22
23 #include "config.h"
24
25 #include "ide-build-target.h"
26 #include "ide-simple-build-target.h"
27
28 typedef struct
29 {
30 GFile *install_directory;
31 gchar *name;
32 gchar **argv;
33 gchar *cwd;
34 gchar *language;
35 gint priority;
36 } IdeSimpleBuildTargetPrivate;
37
38 static void build_target_iface_init (IdeBuildTargetInterface *iface);
39
G_DEFINE_TYPE_WITH_CODE(IdeSimpleBuildTarget,ide_simple_build_target,IDE_TYPE_OBJECT,G_ADD_PRIVATE (IdeSimpleBuildTarget)G_IMPLEMENT_INTERFACE (IDE_TYPE_BUILD_TARGET,build_target_iface_init))40 G_DEFINE_TYPE_WITH_CODE (IdeSimpleBuildTarget, ide_simple_build_target, IDE_TYPE_OBJECT,
41 G_ADD_PRIVATE (IdeSimpleBuildTarget)
42 G_IMPLEMENT_INTERFACE (IDE_TYPE_BUILD_TARGET,
43 build_target_iface_init))
44
45 static void
46 ide_simple_build_target_finalize (GObject *object)
47 {
48 IdeSimpleBuildTarget *self = (IdeSimpleBuildTarget *)object;
49 IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
50
51 g_clear_object (&priv->install_directory);
52 g_clear_pointer (&priv->name, g_free);
53 g_clear_pointer (&priv->argv, g_strfreev);
54 g_clear_pointer (&priv->cwd, g_free);
55 g_clear_pointer (&priv->language, g_free);
56
57 G_OBJECT_CLASS (ide_simple_build_target_parent_class)->finalize (object);
58 }
59
60 static void
ide_simple_build_target_class_init(IdeSimpleBuildTargetClass * klass)61 ide_simple_build_target_class_init (IdeSimpleBuildTargetClass *klass)
62 {
63 GObjectClass *object_class = G_OBJECT_CLASS (klass);
64
65 object_class->finalize = ide_simple_build_target_finalize;
66 }
67
68 static void
ide_simple_build_target_init(IdeSimpleBuildTarget * self)69 ide_simple_build_target_init (IdeSimpleBuildTarget *self)
70 {
71 }
72
73 IdeSimpleBuildTarget *
ide_simple_build_target_new(IdeContext * context)74 ide_simple_build_target_new (IdeContext *context)
75 {
76 g_return_val_if_fail (!context || IDE_IS_CONTEXT (context), NULL);
77
78 return g_object_new (IDE_TYPE_SIMPLE_BUILD_TARGET,
79 "parent", context,
80 NULL);
81 }
82
83 void
ide_simple_build_target_set_install_directory(IdeSimpleBuildTarget * self,GFile * install_directory)84 ide_simple_build_target_set_install_directory (IdeSimpleBuildTarget *self,
85 GFile *install_directory)
86 {
87 IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
88
89 g_return_if_fail (IDE_IS_SIMPLE_BUILD_TARGET (self));
90 g_return_if_fail (!install_directory || G_IS_FILE (install_directory));
91
92 g_set_object (&priv->install_directory, install_directory);
93 }
94
95 void
ide_simple_build_target_set_name(IdeSimpleBuildTarget * self,const gchar * name)96 ide_simple_build_target_set_name (IdeSimpleBuildTarget *self,
97 const gchar *name)
98 {
99 IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
100
101 g_return_if_fail (IDE_IS_SIMPLE_BUILD_TARGET (self));
102
103 if (g_strcmp0 (priv->name, name) != 0)
104 {
105 g_free (priv->name);
106 priv->name = g_strdup (name);
107 }
108 }
109
110 void
ide_simple_build_target_set_priority(IdeSimpleBuildTarget * self,gint priority)111 ide_simple_build_target_set_priority (IdeSimpleBuildTarget *self,
112 gint priority)
113 {
114 IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
115
116 g_return_if_fail (IDE_IS_SIMPLE_BUILD_TARGET (self));
117
118 priv->priority = priority;
119 }
120
121 void
ide_simple_build_target_set_argv(IdeSimpleBuildTarget * self,const gchar * const * argv)122 ide_simple_build_target_set_argv (IdeSimpleBuildTarget *self,
123 const gchar * const *argv)
124 {
125 IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
126
127 g_return_if_fail (IDE_IS_SIMPLE_BUILD_TARGET (self));
128
129 if (priv->argv != (gchar **)argv)
130 {
131 g_strfreev (priv->argv);
132 priv->argv = g_strdupv ((gchar **)argv);
133 }
134 }
135
136 void
ide_simple_build_target_set_cwd(IdeSimpleBuildTarget * self,const gchar * cwd)137 ide_simple_build_target_set_cwd (IdeSimpleBuildTarget *self,
138 const gchar *cwd)
139 {
140 IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
141
142 g_return_if_fail (IDE_IS_SIMPLE_BUILD_TARGET (self));
143
144 if (g_strcmp0 (priv->cwd, cwd) != 0)
145 {
146 g_free (priv->cwd);
147 priv->cwd = g_strdup (cwd);
148 }
149 }
150
151 void
ide_simple_build_target_set_language(IdeSimpleBuildTarget * self,const gchar * language)152 ide_simple_build_target_set_language (IdeSimpleBuildTarget *self,
153 const gchar *language)
154 {
155 IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
156
157 g_return_if_fail (IDE_IS_SIMPLE_BUILD_TARGET (self));
158
159 if (g_strcmp0 (priv->language, language) != 0)
160 {
161 g_free (priv->language);
162 priv->language = g_strdup (language);
163 }
164 }
165
166 static GFile *
get_install_directory(IdeBuildTarget * target)167 get_install_directory (IdeBuildTarget *target)
168 {
169 IdeSimpleBuildTarget *self = IDE_SIMPLE_BUILD_TARGET (target);
170 IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
171 return priv->install_directory ? g_object_ref (priv->install_directory) : NULL;
172 }
173
174 static gchar *
get_name(IdeBuildTarget * target)175 get_name (IdeBuildTarget *target)
176 {
177 IdeSimpleBuildTarget *self = IDE_SIMPLE_BUILD_TARGET (target);
178 IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
179 return g_strdup (priv->name);
180 }
181
182 static gchar **
get_argv(IdeBuildTarget * target)183 get_argv (IdeBuildTarget *target)
184 {
185 IdeSimpleBuildTarget *self = IDE_SIMPLE_BUILD_TARGET (target);
186 IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
187 return g_strdupv (priv->argv);
188 }
189
190 static gchar *
get_cwd(IdeBuildTarget * target)191 get_cwd (IdeBuildTarget *target)
192 {
193 IdeSimpleBuildTarget *self = IDE_SIMPLE_BUILD_TARGET (target);
194 IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
195 return g_strdup (priv->cwd);
196 }
197
198 static gchar *
get_language(IdeBuildTarget * target)199 get_language (IdeBuildTarget *target)
200 {
201 IdeSimpleBuildTarget *self = IDE_SIMPLE_BUILD_TARGET (target);
202 IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
203 return g_strdup (priv->language);
204 }
205
206 static gint
get_priority(IdeBuildTarget * target)207 get_priority (IdeBuildTarget *target)
208 {
209 IdeSimpleBuildTarget *self = IDE_SIMPLE_BUILD_TARGET (target);
210 IdeSimpleBuildTargetPrivate *priv = ide_simple_build_target_get_instance_private (self);
211 return priv->priority;
212 }
213
214 static void
build_target_iface_init(IdeBuildTargetInterface * iface)215 build_target_iface_init (IdeBuildTargetInterface *iface)
216 {
217 iface->get_install_directory = get_install_directory;
218 iface->get_name = get_name;
219 iface->get_priority = get_priority;
220 iface->get_argv = get_argv;
221 iface->get_cwd = get_cwd;
222 iface->get_language = get_language;
223 }
224