summaryrefslogtreecommitdiff
path: root/builder/builder-manifest.c
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2016-01-18 11:43:02 +0100
committerAlexander Larsson <alexl@redhat.com>2016-01-18 11:43:02 +0100
commit3341fb08adc981879043445e8c40883786705738 (patch)
tree13e0e4d88a62f20b4b3513f85ec6a9acaff424c0 /builder/builder-manifest.c
parent701d800059b36b67d890363a2ccaf02b9a693f5f (diff)
downloadxdg-app-3341fb08adc981879043445e8c40883786705738.tar.gz
builder: Allow building runtime sdks (based on existing sdk)
This includes a few different changes: * Add build-runtime boolean property * Rename "app-id" property to "id" * Add metadata property to use a custom base metadata file * Default to writable-sdk to TRUE for runtimes * Default prefix to /usr for runtimes * Put manifest in usr for runtimes * Pick up debuginfo from usr for runtimes * Make build-finish work on runtimes, but only export appdata
Diffstat (limited to 'builder/builder-manifest.c')
-rw-r--r--builder/builder-manifest.c141
1 files changed, 115 insertions, 26 deletions
diff --git a/builder/builder-manifest.c b/builder/builder-manifest.c
index ec207f5..89bec1c 100644
--- a/builder/builder-manifest.c
+++ b/builder/builder-manifest.c
@@ -37,11 +37,12 @@
struct BuilderManifest {
GObject parent;
- char *app_id;
+ char *id;
char *branch;
char *runtime;
char *runtime_version;
char *sdk;
+ char *metadata;
char **cleanup;
char **cleanup_commands;
char **finish_args;
@@ -51,6 +52,7 @@ struct BuilderManifest {
gboolean copy_icon;
char *desktop_file_name_prefix;
char *desktop_file_name_suffix;
+ gboolean build_runtime;
gboolean writable_sdk;
char *command;
BuilderOptions *build_options;
@@ -68,16 +70,19 @@ G_DEFINE_TYPE_WITH_CODE (BuilderManifest, builder_manifest, G_TYPE_OBJECT,
enum {
PROP_0,
- PROP_APP_ID,
+ PROP_APP_ID, /* Backwards compat with early version, use id */
+ PROP_ID,
PROP_BRANCH,
PROP_RUNTIME,
PROP_RUNTIME_VERSION,
PROP_SDK,
+ PROP_METADATA,
PROP_BUILD_OPTIONS,
PROP_COMMAND,
PROP_MODULES,
PROP_CLEANUP,
PROP_CLEANUP_COMMANDS,
+ PROP_BUILD_RUNTIME,
PROP_WRITABLE_SDK,
PROP_FINISH_ARGS,
PROP_RENAME_DESKTOP_FILE,
@@ -94,11 +99,12 @@ builder_manifest_finalize (GObject *object)
{
BuilderManifest *self = (BuilderManifest *)object;
- g_free (self->app_id);
+ g_free (self->id);
g_free (self->branch);
g_free (self->runtime);
g_free (self->runtime_version);
g_free (self->sdk);
+ g_free (self->metadata);
g_free (self->command);
g_clear_object (&self->build_options);
g_list_free_full (self->modules, g_object_unref);
@@ -125,7 +131,11 @@ builder_manifest_get_property (GObject *object,
switch (prop_id)
{
case PROP_APP_ID:
- g_value_set_string (value, self->app_id);
+ g_value_set_string (value, NULL);
+ break;
+
+ case PROP_ID:
+ g_value_set_string (value, self->id);
break;
case PROP_BRANCH:
@@ -144,6 +154,10 @@ builder_manifest_get_property (GObject *object,
g_value_set_string (value, self->sdk);
break;
+ case PROP_METADATA:
+ g_value_set_string (value, self->metadata);
+ break;
+
case PROP_COMMAND:
g_value_set_string (value, self->command);
break;
@@ -168,6 +182,10 @@ builder_manifest_get_property (GObject *object,
g_value_set_boxed (value, self->finish_args);
break;
+ case PROP_BUILD_RUNTIME:
+ g_value_set_boolean (value, self->build_runtime);
+ break;
+
case PROP_WRITABLE_SDK:
g_value_set_boolean (value, self->writable_sdk);
break;
@@ -213,8 +231,13 @@ builder_manifest_set_property (GObject *object,
switch (prop_id)
{
case PROP_APP_ID:
- g_free (self->app_id);
- self->app_id = g_value_dup_string (value);
+ g_free (self->id);
+ self->id = g_value_dup_string (value);
+ break;
+
+ case PROP_ID:
+ g_free (self->id);
+ self->id = g_value_dup_string (value);
break;
case PROP_BRANCH:
@@ -237,6 +260,11 @@ builder_manifest_set_property (GObject *object,
self->sdk = g_value_dup_string (value);
break;
+ case PROP_METADATA:
+ g_free (self->metadata);
+ self->metadata = g_value_dup_string (value);
+ break;
+
case PROP_COMMAND:
g_free (self->command);
self->command = g_value_dup_string (value);
@@ -270,6 +298,10 @@ builder_manifest_set_property (GObject *object,
g_strfreev (tmp);
break;
+ case PROP_BUILD_RUNTIME:
+ self->build_runtime = g_value_get_boolean (value);
+ break;
+
case PROP_WRITABLE_SDK:
self->writable_sdk = g_value_get_boolean (value);
break;
@@ -325,6 +357,13 @@ builder_manifest_class_init (BuilderManifestClass *klass)
NULL,
G_PARAM_READWRITE));
g_object_class_install_property (object_class,
+ PROP_ID,
+ g_param_spec_string ("id",
+ "",
+ "",
+ NULL,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
PROP_BRANCH,
g_param_spec_string ("branch",
"",
@@ -353,6 +392,13 @@ builder_manifest_class_init (BuilderManifestClass *klass)
NULL,
G_PARAM_READWRITE));
g_object_class_install_property (object_class,
+ PROP_METADATA,
+ g_param_spec_string ("metadata",
+ "",
+ "",
+ NULL,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
PROP_COMMAND,
g_param_spec_string ("command",
"",
@@ -394,6 +440,13 @@ builder_manifest_class_init (BuilderManifestClass *klass)
G_TYPE_STRV,
G_PARAM_READWRITE));
g_object_class_install_property (object_class,
+ PROP_BUILD_RUNTIME,
+ g_param_spec_boolean ("build-runtime",
+ "",
+ "",
+ FALSE,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
PROP_WRITABLE_SDK,
g_param_spec_boolean ("writable-sdk",
"",
@@ -549,9 +602,9 @@ serializable_iface_init (JsonSerializableIface *serializable_iface)
}
const char *
-builder_manifest_get_app_id (BuilderManifest *self)
+builder_manifest_get_id (BuilderManifest *self)
{
- return self->app_id;
+ return self->id;
}
BuilderOptions *
@@ -581,10 +634,10 @@ builder_manifest_init_app_dir (BuilderManifest *self,
g_autofree char *app_dir_path = g_file_get_path (app_dir);
g_autoptr(GSubprocess) subp = NULL;
- if (self->app_id == NULL)
+ if (self->id == NULL)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "app id not specified");
+ "id not specified");
return FALSE;
}
@@ -608,11 +661,11 @@ builder_manifest_init_app_dir (BuilderManifest *self,
"xdg-app",
"build-init",
app_dir_path,
- self->app_id,
+ self->id,
self->sdk,
self->runtime,
builder_manifest_get_runtime_version (self),
- self->writable_sdk ? "-w" : NULL,
+ (self->writable_sdk || self->build_runtime) ? "-w" : NULL,
NULL);
if (subp == NULL ||
@@ -629,11 +682,15 @@ builder_manifest_checksum (BuilderManifest *self,
BuilderContext *context)
{
builder_cache_checksum_str (cache, BUILDER_MANIFEST_CHECKSUM_VERSION);
- builder_cache_checksum_str (cache, self->app_id);
+ builder_cache_checksum_str (cache, self->id);
/* No need to include version here, it doesn't affect the build */
builder_cache_checksum_str (cache, self->runtime);
builder_cache_checksum_str (cache, builder_manifest_get_runtime_version (self));
builder_cache_checksum_str (cache, self->sdk);
+ builder_cache_checksum_str (cache, self->metadata);
+ builder_cache_checksum_boolean (cache, self->writable_sdk);
+ builder_cache_checksum_boolean (cache, self->build_runtime);
+
if (self->build_options)
builder_options_checksum (self->build_options, cache, context);
}
@@ -654,7 +711,6 @@ builder_manifest_checksum_for_cleanup (BuilderManifest *self,
builder_cache_checksum_boolean (cache, self->copy_icon);
builder_cache_checksum_str (cache, self->desktop_file_name_prefix);
builder_cache_checksum_str (cache, self->desktop_file_name_suffix);
- builder_cache_checksum_boolean (cache, self->writable_sdk);
for (l = self->modules; l != NULL; l = l->next)
{
@@ -671,6 +727,20 @@ builder_manifest_checksum_for_finish (BuilderManifest *self,
builder_cache_checksum_str (cache, BUILDER_MANIFEST_CHECKSUM_VERSION " foo");
builder_cache_checksum_strv (cache, self->finish_args);
builder_cache_checksum_str (cache, self->command);
+
+ if (self->metadata)
+ {
+ GFile *base_dir = builder_context_get_base_dir (context);
+ g_autoptr(GFile) metadata = g_file_resolve_relative_path (base_dir, self->metadata);
+ g_autofree char *data = NULL;
+ g_autoptr(GError) my_error = NULL;
+ gsize len;
+
+ if (g_file_load_contents (metadata, NULL, &data, &len, NULL, &my_error))
+ builder_cache_checksum_data (cache, (guchar *)data, len);
+ else
+ g_warning ("Can't load metadata file %s: %s", self->metadata, my_error->message);
+ }
}
gboolean
@@ -703,8 +773,9 @@ builder_manifest_build (BuilderManifest *self,
builder_context_set_options (context, self->build_options);
builder_context_set_global_cleanup (context, (const char **)self->cleanup);
+ builder_context_set_build_runtime (context, self->build_runtime);
- g_print ("Starting build of %s\n", self->app_id ? self->app_id : "app");
+ g_print ("Starting build of %s\n", self->id ? self->id : "app");
for (l = self->modules; l != NULL; l = l->next)
{
BuilderModule *m = l->data;
@@ -884,7 +955,7 @@ rename_icon_cb (BuilderManifest *self,
source_name[strlen (self->rename_icon)] == '.')
{
const char *extension = source_name + strlen (self->rename_icon);
- g_autofree char *new_name = g_strconcat (self->app_id, extension, NULL);
+ g_autofree char *new_name = g_strconcat (self->id, extension, NULL);
int res;
*found = TRUE;
@@ -934,8 +1005,6 @@ builder_manifest_cleanup (BuilderManifest *self,
builder_manifest_checksum_for_cleanup (self, cache, context);
if (!builder_cache_lookup (cache, "cleanup"))
{
- app_root = g_file_get_child (app_dir, "files");
-
g_print ("Cleaning up\n");
if (self->cleanup_commands)
@@ -975,8 +1044,9 @@ builder_manifest_cleanup (BuilderManifest *self,
}
}
+ app_root = g_file_get_child (app_dir, "files");
appdata_dir = g_file_resolve_relative_path (app_root, "share/appdata");
- appdata_basename = g_strdup_printf ("%s.appdata.xml", self->app_id);
+ appdata_basename = g_strdup_printf ("%s.appdata.xml", self->id);
appdata_file = g_file_get_child (appdata_dir, appdata_basename);
if (self->rename_appdata_file != NULL)
@@ -992,7 +1062,7 @@ builder_manifest_cleanup (BuilderManifest *self,
{
g_autoptr(GFile) applications_dir = g_file_resolve_relative_path (app_root, "share/applications");
g_autoptr(GFile) src = g_file_get_child (applications_dir, self->rename_desktop_file);
- g_autofree char *desktop_basename = g_strdup_printf ("%s.desktop", self->app_id);
+ g_autofree char *desktop_basename = g_strdup_printf ("%s.desktop", self->id);
g_autoptr(GFile) dest = g_file_get_child (applications_dir, desktop_basename);
g_print ("Renaming %s to %s\n", self->rename_desktop_file, desktop_basename);
@@ -1055,7 +1125,7 @@ builder_manifest_cleanup (BuilderManifest *self,
self->desktop_file_name_suffix)
{
g_autoptr(GFile) applications_dir = g_file_resolve_relative_path (app_root, "share/applications");
- g_autofree char *desktop_basename = g_strdup_printf ("%s.desktop", self->app_id);
+ g_autofree char *desktop_basename = g_strdup_printf ("%s.desktop", self->id);
g_autoptr(GFile) desktop = g_file_get_child (applications_dir, desktop_basename);
g_autoptr(GKeyFile) keyfile = g_key_file_new ();
g_autofree char *desktop_contents = NULL;
@@ -1076,7 +1146,7 @@ builder_manifest_cleanup (BuilderManifest *self,
g_key_file_set_string (keyfile,
G_KEY_FILE_DESKTOP_GROUP,
G_KEY_FILE_DESKTOP_KEY_ICON,
- self->app_id);
+ self->id);
if (self->desktop_file_name_suffix ||
self->desktop_file_name_prefix)
@@ -1148,6 +1218,18 @@ builder_manifest_finish (BuilderManifest *self,
{
g_print ("Finishing app\n");
+ if (self->metadata)
+ {
+ GFile *base_dir = builder_context_get_base_dir (context);
+ GFile *app_dir = builder_context_get_app_dir (context);
+ g_autoptr(GFile) dest_metadata = g_file_get_child (app_dir, "metadata");
+ g_autoptr(GFile) src_metadata = g_file_resolve_relative_path (base_dir, self->metadata);
+
+ if (!g_file_copy (src_metadata, dest_metadata, G_FILE_COPY_OVERWRITE, NULL,
+ NULL, NULL, error))
+ return FALSE;
+ }
+
args = g_ptr_array_new_with_free_func (g_free);
g_ptr_array_add (args, g_strdup ("xdg-app"));
g_ptr_array_add (args, g_strdup ("build-finish"));
@@ -1179,14 +1261,21 @@ builder_manifest_finish (BuilderManifest *self,
json = json_generator_to_data (generator, NULL);
g_object_unref (generator);
json_node_free (node);
- manifest_file = g_file_resolve_relative_path (app_dir, "files/manifest.json");
+
+ if (self->build_runtime)
+ manifest_file = g_file_resolve_relative_path (app_dir, "usr/manifest.json");
+ else
+ manifest_file = g_file_resolve_relative_path (app_dir, "files/manifest.json");
if (!g_file_replace_contents (manifest_file, json, strlen (json), NULL, FALSE,
0, NULL, NULL, error))
return FALSE;
- debuginfo_dir = g_file_resolve_relative_path (app_dir, "files/lib/debug");
+ if (self->build_runtime)
+ debuginfo_dir = g_file_resolve_relative_path (app_dir, "usr/lib/debug");
+ else
+ debuginfo_dir = g_file_resolve_relative_path (app_dir, "files/lib/debug");
if (g_file_query_exists (debuginfo_dir, NULL))
{
@@ -1202,7 +1291,7 @@ builder_manifest_finish (BuilderManifest *self,
extension_contents = g_strdup_printf("\n"
"[Extension %s.Debug]\n"
"directory=lib/debug\n",
- self->app_id);
+ self->id);
output = g_file_append_to (metadata_file, G_FILE_CREATE_NONE, NULL, error);
if (output == NULL)
@@ -1213,7 +1302,7 @@ builder_manifest_finish (BuilderManifest *self,
return FALSE;
metadata_contents = g_strdup_printf("[Runtime]\n"
- "name=%s.Debug\n", self->app_id);
+ "name=%s.Debug\n", self->id);
if (!g_file_replace_contents (metadata_debuginfo_file,
metadata_contents, strlen (metadata_contents), NULL, FALSE,
G_FILE_CREATE_REPLACE_DESTINATION,