/* add_pseudo(string node) */ int lf_add_pseudo(lua_State *L) { struct NODE *node; struct CONTEXT *context; int i; if(lua_gettop(L) != 1) luaL_error(L, "add_pseudo: incorrect number of arguments"); luaL_checktype(L, 1, LUA_TSTRING); /* fetch contexst from lua */ context = context_get_pointer(L); /* create the node */ i = node_create(&node, context->graph, lua_tostring(L,1), NULL); if(i == NODECREATE_NOTNICE) luaL_error(L, "add_pseudo: node '%s' is not nice", lua_tostring(L,1)); else if(i == NODECREATE_EXISTS) luaL_error(L, "add_pseudo: node '%s' already exists", lua_tostring(L,1)); else if(i != NODECREATE_OK) luaL_error(L, "add_pseudo: unknown error creating node '%s'", lua_tostring(L,1)); node_set_pseudo(node); return 0; }
static int bam_setup(struct CONTEXT *context, const char *scriptfile, const char **targets, int num_targets) { /* */ if(session.verbose) printf("%s: setup started\n", session.name); /* set filename */ context->filename = scriptfile; context->filename_short = path_filename(scriptfile); /* set global timestamp to the script file */ context->globaltimestamp = file_timestamp(scriptfile); /* fetch script directory */ { char cwd[MAX_PATH_LENGTH]; char path[MAX_PATH_LENGTH]; if(!getcwd(cwd, sizeof(cwd))) { printf("%s: error: couldn't get current working directory\n", session.name); return -1; } if(path_directory(context->filename, path, sizeof(path))) { printf("%s: error: path too long '%s'\n", session.name, path); return -1; } if(path_join(cwd, -1, path, -1, context->script_directory, sizeof(context->script_directory))) { printf("%s: error: path too long when joining '%s' and '%s'\n", session.name, cwd, path); return -1; } } /* register all functions */ if(register_lua_globals(context) != 0) { printf("%s: error: registering of lua functions failed\n", session.name); return -1; } /* load script */ if(session.verbose) printf("%s: reading script from '%s'\n", session.name, scriptfile); /* push error function to stack and load the script */ lua_getglobal(context->lua, "errorfunc"); switch(luaL_loadfile(context->lua, scriptfile)) { case 0: break; case LUA_ERRSYNTAX: lf_errorfunc(context->lua); return -1; case LUA_ERRMEM: printf("%s: memory allocation error\n", session.name); return -1; case LUA_ERRFILE: printf("%s: error opening '%s'\n", session.name, scriptfile); return -1; default: printf("%s: unknown error\n", session.name); return -1; } /* call the code chunk */ if(lua_pcall(context->lua, 0, LUA_MULTRET, -2) != 0) { printf("%s: script error (-t for more detail)\n", session.name); return -1; } /* run deferred functions */ if(run_deferred_functions(context) != 0) return -1; /* */ if(session.verbose) printf("%s: making build target\n", session.name); /* make build target */ { struct NODE *node; int all_target = 0; int i; if(node_create(&context->target, context->graph, "_bam_buildtarget", NULL)) return -1; node_set_pseudo(context->target); if(num_targets) { /* search for all target */ for(i = 0; i < num_targets; i++) { if(strcmp(targets[i], "all") == 0) { all_target = 1; break; } } } /* default too all if we have no targets or default target */ if(num_targets == 0 && !context->defaulttarget) all_target = 1; if(all_target) { /* build the all target */ for(node = context->graph->first; node; node = node->next) { if(node->firstparent == NULL && node != context->target) { if(!node_add_dependency_withnode(context->target, node)) return -1; } } } else { if(num_targets) { for(i = 0; i < num_targets; i++) { struct NODE *node = node_find(context->graph, targets[i]); if(!node) { printf("%s: target '%s' not found\n", session.name, targets[i]); return -1; } if(option_dependent) { /* TODO: this should perhaps do a reverse walk up in the tree to find all dependent node with commandline */ struct NODELINK *parent; for(parent = node->firstparent; parent; parent = parent->next) { if(!node_add_dependency_withnode(context->target, parent->node)) return -1; } } else { if(!node_add_dependency_withnode(context->target, node)) return -1; } } } else { if(!node_add_dependency_withnode(context->target, context->defaulttarget)) return -1; } } } /* */ if(session.verbose) printf("%s: setup done\n", session.name); /* return success */ return 0; }