From 1789030ba2fe1ce9e4fb21c1857e600682773013 Mon Sep 17 00:00:00 2001 From: Joan Arnaldich Date: Sat, 8 Oct 2011 17:14:54 +0200 Subject: [PATCH] Modified configuration script parsing routines. --- src/hooks/otp/mkrl_h_erlang_compile.erl | 2 +- src/mkrl_config_parser.erl | 91 --------------------------------- src/mkrl_evaluator.erl | 20 -------- src/mkrl_execution.erl | 30 +++++------ src/mkrl_script_eval.erl | 4 +- src/mkrl_script_expand.erl | 6 +-- src/mkrl_task_registry.erl | 3 +- 7 files changed, 23 insertions(+), 133 deletions(-) delete mode 100644 src/mkrl_config_parser.erl delete mode 100644 src/mkrl_evaluator.erl diff --git a/src/hooks/otp/mkrl_h_erlang_compile.erl b/src/hooks/otp/mkrl_h_erlang_compile.erl index fdb04b6..1438395 100644 --- a/src/hooks/otp/mkrl_h_erlang_compile.erl +++ b/src/hooks/otp/mkrl_h_erlang_compile.erl @@ -17,7 +17,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -spec expand_rule(options_type(), options_type()) -> [syntax_task_type()]. expand_rule(Opts, ExpandOptions) -> - {[Glob, Include, Output, RuleTarget], Rest} = + {[Glob, Include, Output, RuleTarget], _} = mkrl_options:parse(Opts, [{glob, "src"}, {i, "include"}, {output, "ebin"}, diff --git a/src/mkrl_config_parser.erl b/src/mkrl_config_parser.erl deleted file mode 100644 index 8771d89..0000000 --- a/src/mkrl_config_parser.erl +++ /dev/null @@ -1,91 +0,0 @@ -%%%------------------------------------------------------------------- -%%% File : config_parser.erl -%%% Author : <> -%%% Description : -%%% -%%% Created : 28 Mar 2011 by <> -%%%------------------------------------------------------------------- --module(mkrl_config_parser). - --export([parse_file/2, - parse_terms/2, - file_out_result/3]). --compile(export_all). - --include("makerl.hrl"). - - --record(parser_state, { options :: options_type(), - tasks :: [syntax_task_type()] }). - -%% The output is not a config file. -%% - Module names are mkrl_h_ prefixed -%% - Just one term (a list) with all tasks. --spec file_out_result(string(), options_type(), string()) -> ok | {error, any()}. -file_out_result(ConfigFile, CmdLineOpts, OutputFile) -> - Tasks = parse_file(ConfigFile, CmdLineOpts), - {ok, Io} = file:open(OutputFile, [ write ]), - lists:foreach(fun(SynTask) -> - InTask = syntax_task_to_input_task(SynTask), - file:write(Io, io_lib:fwrite("~p.\n", [InTask])) - end, - Tasks). - --spec parse_file(string(), options_type()) -> syntax_info(). -parse_file(ConfigFile, CmdLineOptions) -> - {ok, Terms} = file:consult(ConfigFile), - ?DEBUG("[CmdOpts] ~p~n", [mkrl_options:filter_module_options(compile, CmdLineOptions)]), - ExpandOpts = [{'*root*', filename:dirname(ConfigFile)}, - {'*makerlfile*', ConfigFile} | CmdLineOptions], - EvalOpts = ExpandOpts, %% Will be different, eventually - Expanded = expand_rules(Terms, ExpandOpts), - ?DEBUG("Expanded ~p~n", [Expanded]), - ParserState=parse_terms(Expanded, #parser_state{ options = EvalOpts, tasks = [] } ), - ParserState#parser_state.tasks. - -%% Will end up in a foldl that will bild a config structure... -%% This now actually parses AND evals the config file. As more commands -%% are added (ex. out-of-order configuration params), this file should be -%% split into an actual parsing, that produces an intermediate result -%% + an eval, that fires the actions. - -%% RULE EXPANSION -expand_rules(Terms, ExpandOpts) -> - lists:foldl(fun(Term, Acc) -> - expand_rule(Term, Acc, ExpandOpts) - end, [], Terms). -expand_rule({rule, Module, RuleOpts}, Acc, ExpandOpts) -> - HookModule = task_module_to_hook_module(Module), - NormalizedOpts = mkrl_options:normalize(RuleOpts), - Tasks = HookModule:expand_rule(NormalizedOpts, mkrl_options:filter_module_options(Module, ExpandOpts)), - Acc ++ Tasks; -expand_rule(Whatever, Acc, _) -> - [Whatever | Acc]. - -%% TERM EVALUATION -parse_terms(Terms, IniOptions) -> - lists:foldl(fun parse_term/2, IniOptions, Terms). - -parse_term({task, Module, Target, PreReqs, Opts}, {parser_state, ParserOpts, Tasks} ) -> - Hook = task_module_to_hook_module(Module), - Task = #task{ module = Hook, - target = Target, - prerequisites = PreReqs, - options = mkrl_options:normalize(ParserOpts ++ Opts), - pid = null }, - ?DEBUG("[Task] ~p~n", [Task]), -%% mkrl_task_registry:add(Task), -%% mkrl_task:new(Target), - #parser_state{ options = ParserOpts, - tasks = [Task|Tasks] }; -parse_term(Whatever, Acc) -> - throw({parse_error, {unknown_term, Whatever, Acc}}). - -task_module_to_hook_module(Mod) -> - list_to_atom("mkrl_h_" ++ atom_to_list(Mod)). - -hook_module_to_task_module(Mod) -> - list_to_atom(lists:nthtail(7, atom_to_list(Mod))). - -syntax_task_to_input_task({task, Mod, Target, Deps, Opts, _}) -> - {task, hook_module_to_task_module(Mod), Target, Deps, Opts}. diff --git a/src/mkrl_evaluator.erl b/src/mkrl_evaluator.erl deleted file mode 100644 index e44cbe8..0000000 --- a/src/mkrl_evaluator.erl +++ /dev/null @@ -1,20 +0,0 @@ -%%%------------------------------------------------------------------- -%%% File : mkrl_evaulator.erl -%%% Author : <> -%%% Description : -%%% -%%% Created : 6 May 2011 by <> -%%%------------------------------------------------------------------- --module(mkrl_evaluator). - --export([spawn_task_servers/2]). - --include("makerl.hrl"). - --spec spawn_task_servers(tid(), [syntax_task_type()]) -> ok. -spawn_task_servers(TaskRegistry, SynTasks) -> - lists:foreach(fun(T) -> - mkrl_task:new(TaskRegistry, T) - end, SynTasks), - ok. - diff --git a/src/mkrl_execution.erl b/src/mkrl_execution.erl index 8995ea1..2331dfa 100644 --- a/src/mkrl_execution.erl +++ b/src/mkrl_execution.erl @@ -1,23 +1,24 @@ -%%%------------------------------------------------------------------- -%%% File : execution.erl -%%% Author : <> -%%% Description : -%%% -%%% Created : 8 Apr 2011 by <> -%%%------------------------------------------------------------------- -module(mkrl_execution). -include("makerl.hrl"). -export([execute/3]). +-compile(export_all). + +-spec spawn_tasks([term()], options_type()) -> any(). +spawn_tasks(Tasks, Opts) -> + Ctx = #eval_ctx{ task_registry = mkrl_task_registry:new(), + options = Opts }, + mkrl_script_eval:eval( + mkrl_script_expand:expand(Tasks, Opts), + Ctx), + Ctx. + -spec execute(string(), [string()], options_type()) -> [build_result()]. execute(File, Targets, CmdLineOptions) -> - TaskRegistry = mkrl_task_registry:new(), - ?DEBUG("Task Registry: ~p~n", [TaskRegistry]), - TaskList = mkrl_config_parser:parse_file(File, CmdLineOptions), - mkrl_evaluator:spawn_task_servers(TaskRegistry, TaskList), - ?DEBUG("Task Registry: ~p~n", [ets:tab2list(TaskRegistry)]), - ok = check_unknown_targets(TaskRegistry, Targets), - [ mkrl_task:build_target(TaskRegistry, T) || T <- Targets ]. %% Bind? Aggregated results? + Ctx = spawn_tasks(mkrl_script_read:read(File), CmdLineOptions), + ok = check_unknown_targets(Ctx#eval_ctx.task_registry, Targets), + [ mkrl_task:build_target(Ctx#eval_ctx.task_registry, T) + || T <- Targets ]. %% Bind? Aggregated results? -spec check_unknown_targets(tid(), [string()]) -> ok. check_unknown_targets(TaskRegistry, Targets) -> @@ -33,4 +34,3 @@ check_unknown_targets(TaskRegistry, Targets) -> L -> throw({error, {targets_unknown, L}}) end. - diff --git a/src/mkrl_script_eval.erl b/src/mkrl_script_eval.erl index 786c815..26b1c12 100644 --- a/src/mkrl_script_eval.erl +++ b/src/mkrl_script_eval.erl @@ -14,8 +14,8 @@ -spec eval([term()], options_type()) -> ok | {error, any()}. eval(Terms, Ctx) -> - lists:foldl(fun(Term) -> - eval_term(Term, Ctx) + lists:foldl(fun(Term, Acum) -> + [eval_term(Term, Ctx) | Acum ] end, [], Terms). diff --git a/src/mkrl_script_expand.erl b/src/mkrl_script_expand.erl index 356e7e1..f726a46 100644 --- a/src/mkrl_script_expand.erl +++ b/src/mkrl_script_expand.erl @@ -12,7 +12,7 @@ -spec expand([term()], options_type()) -> [term()]. expand(Terms, Options) -> - recursively_apply_rules(Terms, Options, ?MAX_EXPANSIONS). + lists:reverse(recursively_apply_rules(Terms, Options, ?MAX_EXPANSIONS)). recursively_apply_rules(Terms, Options, DownCount) -> case {DownCount, apply_rules(Terms, Options)} of @@ -39,9 +39,9 @@ apply_rule({rule, Module, RuleOpts}, State, ExpandOpts) -> NormalizedOpts = mkrl_options:normalize(RuleOpts), Tasks = HookModule:expand_rule(NormalizedOpts, mkrl_options:filter_module_options(Module, ExpandOpts)), State#expander_state{ applied = true, - expansions = State#expander_state.expansions ++ Tasks }; + expansions = Tasks ++ State#expander_state.expansions }; apply_rule(Whatever, State, _) -> - State#expander_state{ expansions = State#expander_state.expansions ++ Whatever}. + State#expander_state{ expansions = [Whatever | State#expander_state.expansions] }. task_module_to_hook_module(Mod) -> list_to_atom("mkrl_h_" ++ atom_to_list(Mod)). diff --git a/src/mkrl_task_registry.erl b/src/mkrl_task_registry.erl index 4e6a6e5..aa103ae 100644 --- a/src/mkrl_task_registry.erl +++ b/src/mkrl_task_registry.erl @@ -19,9 +19,10 @@ %%==================================================================== %% API %%==================================================================== + -spec new() -> tid(). new() -> - ets:new(undefined, [public]). % Public perque s'escriu des de tasks i des d'execution + ets:new(undefined, [public]). % Public cause it's written from tasks and from execution -spec add(tid(), #task{}) -> true. add(Tab, Task) -> -- 2.11.4.GIT