Add append-path and append-ld-libary-path build options

These are useful for e.g. sdk extensions.
tingping/wmclass
Alexander Larsson 2017-09-06 19:47:12 +02:00
parent f779394d92
commit 21cd4963b1
3 changed files with 125 additions and 7 deletions

View File

@ -253,6 +253,16 @@
<listitem><para>The build prefix for the modules (defaults to <filename>/app</filename> for
applications and <filename>/usr</filename> for runtimes).</para></listitem>
</varlistentry>
<varlistentry>
<term><option>append-path</option> (string)</term>
<listitem><para>This will get appended to PATH in the build environment (with an leading colon if
needed).</para></listitem>
</varlistentry>
<varlistentry>
<term><option>append-ld-library-path</option> (string)</term>
<listitem><para>This will get appended to LD_LIBRARY_PATH in the build environment (with an leading colon if
needed).</para></listitem>
</varlistentry>
<varlistentry>
<term><option>env</option> (object)</term>
<listitem><para>This is a dictionary defining environment variables to be set during the build. Elements in this override the properties that set the environment, like cflags and ldflags.</para></listitem>

View File

@ -878,18 +878,22 @@ char **
builder_context_extend_env (BuilderContext *self,
char **envp)
{
g_autofree char *path = NULL;
path = g_strdup (g_environ_getenv (envp, "PATH"));
if (path == NULL)
path = g_strdup ("/app/bin:/usr/bin"); /* This is the flatpak default PATH, we alway set it so we can easily append to it */
if (self->use_ccache)
{
const char *old_path = g_environ_getenv (envp, "PATH");
g_autofree char *new_path = NULL;
if (old_path == NULL)
old_path = "/app/bin:/usr/bin"; /* This is the flatpak default PATH */
new_path = g_strdup_printf ("/run/ccache/bin:%s", old_path);
envp = g_environ_setenv (envp, "PATH", new_path, TRUE);
char *new_path = g_strdup_printf ("/run/ccache/bin:%s", path);
g_free (path);
path = new_path;
envp = g_environ_setenv (envp, "CCACHE_DIR", "/run/ccache", TRUE);
}
envp = g_environ_setenv (envp, "PATH", path, TRUE);
return envp;
}

View File

@ -42,6 +42,8 @@ struct BuilderOptions
char *cppflags;
char *cxxflags;
char *ldflags;
char *append_path;
char *append_ld_library_path;
char *prefix;
char **env;
char **build_args;
@ -72,6 +74,8 @@ enum {
PROP_ARCH,
PROP_BUILD_ARGS,
PROP_CONFIG_OPTS,
PROP_APPEND_PATH,
PROP_APPEND_LD_LIBRARY_PATH,
LAST_PROP
};
@ -85,6 +89,8 @@ builder_options_finalize (GObject *object)
g_free (self->cxxflags);
g_free (self->cppflags);
g_free (self->ldflags);
g_free (self->append_path);
g_free (self->append_ld_library_path);
g_free (self->prefix);
g_strfreev (self->env);
g_strfreev (self->build_args);
@ -120,6 +126,14 @@ builder_options_get_property (GObject *object,
g_value_set_string (value, self->ldflags);
break;
case PROP_APPEND_PATH:
g_value_set_string (value, self->append_path);
break;
case PROP_APPEND_LD_LIBRARY_PATH:
g_value_set_string (value, self->append_ld_library_path);
break;
case PROP_PREFIX:
g_value_set_string (value, self->prefix);
break;
@ -184,6 +198,16 @@ builder_options_set_property (GObject *object,
self->ldflags = g_value_dup_string (value);
break;
case PROP_APPEND_PATH:
g_clear_pointer (&self->append_path, g_free);
self->append_path = g_value_dup_string (value);
break;
case PROP_APPEND_LD_LIBRARY_PATH:
g_clear_pointer (&self->append_ld_library_path, g_free);
self->append_ld_library_path = g_value_dup_string (value);
break;
case PROP_PREFIX:
g_clear_pointer (&self->prefix, g_free);
self->prefix = g_value_dup_string (value);
@ -263,6 +287,20 @@ builder_options_class_init (BuilderOptionsClass *klass)
"",
NULL,
G_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_APPEND_PATH,
g_param_spec_string ("append-path",
"",
"",
NULL,
G_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_APPEND_LD_LIBRARY_PATH,
g_param_spec_string ("append-ld-library-path",
"",
"",
NULL,
G_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_PREFIX,
g_param_spec_string ("prefix",
@ -583,6 +621,69 @@ builder_options_get_ldflags (BuilderOptions *self, BuilderContext *context)
return builder_options_get_flags (self, context, G_STRUCT_OFFSET (BuilderOptions, ldflags));
}
static char *
builder_options_get_appended_path (BuilderOptions *self, BuilderContext *context, const char *initial_value, size_t field_offset)
{
g_autoptr(GList) options = get_all_options (self, context);
GList *l;
GString *path_list = NULL;
if (initial_value)
path_list = g_string_new (initial_value);
for (l = options; l != NULL; l = l->next)
{
BuilderOptions *o = l->data;
const char *append = G_STRUCT_MEMBER (const char *, o, field_offset);
if (append)
{
if (path_list == NULL)
path_list = g_string_new ("");
if (path_list->len > 0)
g_string_append_c (path_list, ':');
g_string_append (path_list, append);
}
}
if (path_list)
return g_string_free (path_list, FALSE);
return NULL;
}
static char **
builder_options_update_ld_path (BuilderOptions *self, BuilderContext *context, char **envp)
{
g_autofree char *path = NULL;
const char *old = NULL;
old = g_environ_getenv (envp, "LD_LIBRARY_PATH");
if (old == NULL)
old = "/app/lib";
path = builder_options_get_appended_path (self, context, old,
G_STRUCT_OFFSET (BuilderOptions, append_ld_library_path));
if (path)
envp = g_environ_setenv (envp, "LD_LIBRARY_PATH", path, TRUE);
return envp;
}
static char **
builder_options_update_path (BuilderOptions *self, BuilderContext *context, char **envp)
{
g_autofree char *path = NULL;
path = builder_options_get_appended_path (self, context,
g_environ_getenv (envp, "PATH"),
G_STRUCT_OFFSET (BuilderOptions, append_path));
if (path)
envp = g_environ_setenv (envp, "PATH", path, TRUE);
return envp;
}
const char *
builder_options_get_prefix (BuilderOptions *self, BuilderContext *context)
{
@ -689,6 +790,9 @@ builder_options_get_env (BuilderOptions *self, BuilderContext *context)
if (ldflags)
envp = g_environ_setenv (envp, "LDFLAGS", ldflags, FALSE);
envp = builder_options_update_path (self, context, envp);
envp = builder_options_update_ld_path (self, context, envp);
return envp;
}