if (r < 0)
return r;
+ // Fetch the environment
+ char** envp = pakfire_parser_make_environ(makefile);
+
// Create the build script
char* script = pakfire_parser_expand(makefile, "build", template);
if (!script) {
INFO(pakfire, "Running build stage '%s'\n", stage);
- r = pakfire_execute_script(pakfire, script, strlen(script), NULL, NULL, 0,
+ r = pakfire_execute_script(pakfire, script, strlen(script), NULL, envp, 0,
logging_callback, data);
if (r) {
ERROR(pakfire, "Build stage '%s' failed with status %d\n", stage, r);
}
ERROR:
+ if (envp) {
+ for (char** e = envp; *e; e++)
+ free(*e);
+ free(envp);
+ }
if (script)
free(script);
int pakfire_parser_parse_data(PakfireParser parent, const char* data, size_t len,
struct pakfire_parser_error** error);
+char** pakfire_parser_make_environ(PakfireParser parser);
+
#endif /* PAKFIRE_PRIVATE */
#endif /* PAKFIRE_PARSER_H */
return 0;
}
+char** pakfire_parser_make_environ(PakfireParser parser) {
+ char** envp = NULL;
+ unsigned int num = 0;
+
+ for (unsigned int i = 0; i < parser->num_declarations; i++) {
+ struct pakfire_parser_declaration* d = parser->declarations[i];
+ if (!d)
+ continue;
+
+ // Is the export flag set?
+ if (d->flags & PAKFIRE_PARSER_DECLARATION_EXPORT) {
+ char* buffer = NULL;
+
+ char* value = pakfire_parser_expand(parser, d->namespace, d->value);
+ if (!value)
+ goto ERROR;
+
+ // Build line
+ int r = asprintf(&buffer, "%s=%s", d->name, value);
+ free(value);
+ if (r < 0)
+ goto ERROR;
+
+ // Extend the array
+ envp = reallocarray(envp, num + 2, sizeof(*envp));
+ if (!envp)
+ goto ERROR;
+
+ envp[num++] = buffer;
+ envp[num] = NULL;
+ }
+ }
+
+ return envp;
+
+ERROR:
+ if (envp) {
+ for (char** e = envp; *e; e++)
+ free(*e);
+ free(envp);
+ }
+
+ return NULL;
+}
+
PAKFIRE_EXPORT int pakfire_parser_create_package(PakfireParser parser,
PakfirePackage* pkg, PakfireRepo repo, const char* namespace, const char* default_arch) {
int r = 1;