stringptr* make_config(pkgconfig* cfg) { stringptr* result = stringptr_concat( SPL("export A="), &cfg->arch, SPL("\n"), SPL("export R="), &cfg->installroot, SPL("\n"), SPL("export S="), &cfg->pkgroot, SPL("\n"), SPL("export C="), &cfg->filecache, SPL("\n"), SPL("export K="), &cfg->keep, SPL("\n"), NULL); return result; }
// initialise with members list, containing all ids variant_info_list* get_variants(size_t_ptrlist* members, stringptr* last_prefix, stringptrlist* block_strings, size_t block_len) { size_t i; variant_info vr, *vp; stringptr* next_prefix, *act; size_t* id; if(last_prefix->size == block_len) return NULL; variant_info_list* res = NULL; stringptr temp; char c; for(i = 0; i < sblist_getsize(members); i++) { id = sblist_get(members, i); act = stringptrlist_get(block_strings, *id); if(last_prefix->size == 0 || stringptr_here(act, 0, last_prefix)) { if(!res) res = sblist_new(sizeof(variant_info), 16); if(!(vp = find_variant(res, act->ptr[last_prefix->size]))) { vr.c = act->ptr[last_prefix->size]; vr.members = sblist_new(sizeof(size_t), stringptrlist_getsize(members)); vr.variants = NULL; sblist_add(res, &vr); vp = find_variant(res, vr.c); } sblist_add(vp->members, id); } } if(res) { for (i = 0; i < sblist_getsize(res); i++) { vp = sblist_get(res, i); c = vp->c; temp.size = 1; temp.ptr = &c; next_prefix = stringptr_concat(last_prefix, &temp, NULL); vp->variants = get_variants(vp->members, next_prefix, block_strings, block_len); } } return res; }
int create_script(jobtype ptype, pkgstate* state, pkg_exec* item, pkgdata* data) { stringptr* temp, *config, tb; stringptr* set_cc = SPL("if [ -z \"$CC\" ] ; then\n\tCC=cc\nfi\n"); char* prefix; char buf[256]; int hastarball; if(ptype == JT_DOWNLOAD) { prefix = "dl"; } else if (ptype == JT_BUILD) { prefix = "build"; } else abort(); item->scripts.filename = stringptr_format("%s/%s_%s.sh", state->cfg.builddir.ptr, prefix, item->name->ptr); item->scripts.stdoutfn = stringptr_format("%s/%s_%s.log", state->cfg.logdir.ptr, prefix, item->name->ptr); config = make_config(&state->cfg); hastarball = get_tarball_filename(data, buf, sizeof(buf)); if(ptype == JT_DOWNLOAD) { if(!hastarball) abort(); //bug temp = stringptr_concat(SPL("#!/bin/sh\n"), config, SPL("wget -O $C/"), stringptr_fromchar(buf, &tb), SPL(" "), stringptrlist_get(data->mirrors, rand() % stringptrlist_getsize(data->mirrors)), //SPL(" --no-check-certificate"), NULL); } else if (ptype == JT_BUILD) { stringptr* buildscr = stringptrlist_tostring(data->buildscript); if(!hastarball) { temp = stringptr_concat(SPL("#!/bin/sh\n"), config, set_cc, buildscr, NULL); } else { if(data->tardir->size && data->tardir->ptr[0] == '/') // prevent erroneus scripts from trash our fs abort(); temp = stringptr_concat(SPL("#!/bin/sh\n"), config, set_cc, SPL("cd $S/build\n"), SPL("[ -e "), data->tardir, SPL(" ] && rm -rf "), data->tardir, SPL("\ntar xf $C/"), stringptr_fromchar(buf, &tb), SPL(" || (echo tarball error; exit 1)\ncd $S/build/"), data->tardir, SPL("\n"), buildscr, NULL); } stringptr_free(buildscr); } else abort(); stringptr_tofile(item->scripts.filename->ptr, temp); if(chmod(item->scripts.filename->ptr, 0777) == -1) die(SPL("error setting permission")); stringptr_free(config); stringptr_free(temp); return 1; }