2 # Script to read build configs in /etc/build_conf.py, turn the configuration into command lines and execute it
4 # Assemble a list of builds from a single build spec
5 def interpret_build(build, param_names, current_concrete_build={}, concrete_build_list=[]):
7 concrete_build_list.extend([current_concrete_build])
9 (cur_param_name,remaining_param_names)=(param_names[0],param_names[1:])
10 cur_param = build[cur_param_name]
12 # If it's a list, produce a concrete build for each element of the list
13 if (type(cur_param)==type([])):
14 for value in cur_param:
15 new_concrete_build = current_concrete_build.copy()
16 new_concrete_build[cur_param_name] = value
17 concrete_build_list = interpret_build(build, remaining_param_names, new_concrete_build, concrete_build_list)
19 # If not, just tack on the value and move on
21 current_concrete_build[cur_param_name] = cur_param
22 concrete_build_list = interpret_build(build, remaining_param_names, current_concrete_build,concrete_build_list)
24 return concrete_build_list
27 # Fill in parameters that are not defined in __default_build__
28 def complete_build_spec_with_defaults (build, default_build):
29 for default_param in default_build.keys():
30 if (not build.has_key(default_param)):
31 build[default_param]=default_build[default_param]
35 # Turn a concrete build into a commandline
37 def concrete_build_to_commandline(concrete_build):
42 -b %(pldistro)-%(fcdistro)-%(arch)-%(myplc_version)-%(release)-%(date)
49 -w %(webpath)/%(pldistro)/%(distro)
50 %(runtests)""".replace('\n','')
51 cmdline = cmdline % concrete_build
56 # reduce dependencies in a build
57 def reduce_dependencies(concrete_build):
58 for b in concrete_build.keys():
59 val = concrete_build[b]
60 if (type(val)==type(lambda x:x)):
61 concrete_build[b] = val(concrete_build)
65 # Turn build parameter dicts into commandlines and execute them
66 def process_builds (builds, build_names, default_build):
67 for build_name in build_names:
68 build = complete_build_spec_with_defaults (builds[build_name], default_build)
69 concrete_builds_without_deps = interpret_build (build, build.keys())
70 concrete_builds = map(lambda cb: reduce_dependencies(cb), concrete_builds_without_deps)
71 for concrete_build in concrete_builds:
72 build_commandline = concrete_build_to_commandline(concrete_build)
73 print build_commandline
76 config_file = './build_conf_planetlab.py'
79 execfile(config_file, builds)
81 raise IOError, "Could not open %s\n" % config_file
84 config_file_attributes = builds.keys()
85 build_names = [e for e in config_file_attributes if not e.startswith('__')]
88 default_build = builds['__default_build__']
90 raise KeyError, "Please define the default build config in %s\n" % config_file
92 process_builds(builds, build_names, default_build)
95 if __name__ == "__main__":