aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/buildgen
diff options
context:
space:
mode:
authorGravatar Craig Tiller <ctiller@google.com>2015-08-31 15:53:36 -0700
committerGravatar Craig Tiller <ctiller@google.com>2015-08-31 15:53:36 -0700
commit1ebb7c885e55e16c8b65b7cb5c9ea08038cd67f4 (patch)
treea1267c94be1ca071ea393e889d84c13262ae4944 /tools/buildgen
parente28e140afd0cb76de807375f28684e3d963931c4 (diff)
Hand-written changes
Diffstat (limited to 'tools/buildgen')
-rwxr-xr-xtools/buildgen/build-cleaner.py15
-rw-r--r--tools/buildgen/generate_build_additions.sh6
-rw-r--r--tools/buildgen/generate_projects-old.sh6
-rwxr-xr-xtools/buildgen/generate_projects.sh4
-rwxr-xr-xtools/buildgen/mako_renderer.py57
-rwxr-xr-xtools/buildgen/plugins/expand_bin_attrs.py2
-rwxr-xr-xtools/buildgen/plugins/expand_filegroups.py4
-rwxr-xr-xtools/buildgen/plugins/generate_vsprojects.py33
-rwxr-xr-xtools/buildgen/plugins/list_protos.py2
9 files changed, 95 insertions, 34 deletions
diff --git a/tools/buildgen/build-cleaner.py b/tools/buildgen/build-cleaner.py
index fba103723c..939143c4cb 100755
--- a/tools/buildgen/build-cleaner.py
+++ b/tools/buildgen/build-cleaner.py
@@ -28,16 +28,16 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-# produces cleaner build.json files
+# produces cleaner build.yaml files
import collections
-import json
import os
import sys
+import yaml
TEST = (os.environ.get('TEST', 'false') == 'true')
-_TOP_LEVEL_KEYS = ['settings', 'filegroups', 'libs', 'targets']
+_TOP_LEVEL_KEYS = ['settings', 'filegroups', 'libs', 'targets', 'vspackages']
_VERSION_KEYS = ['major', 'minor', 'micro', 'build']
_ELEM_KEYS = [
'name',
@@ -50,6 +50,11 @@ _ELEM_KEYS = [
'src',
'deps']
+def repr_ordered_dict(dumper, odict):
+ return dumper.represent_mapping(u'tag:yaml.org,2002:map', odict.items())
+
+yaml.add_representer(collections.OrderedDict, repr_ordered_dict)
+
def rebuild_as_ordered_dict(indict, special_keys):
outdict = collections.OrderedDict()
for key in sorted(indict.keys()):
@@ -75,7 +80,7 @@ def clean_elem(indict):
for filename in sys.argv[1:]:
with open(filename) as f:
- js = json.load(f)
+ js = yaml.load(f)
js = rebuild_as_ordered_dict(js, _TOP_LEVEL_KEYS)
js['settings']['version'] = rebuild_as_ordered_dict(
js['settings']['version'], _VERSION_KEYS)
@@ -83,7 +88,7 @@ for filename in sys.argv[1:]:
if grp not in js: continue
js[grp] = sorted([clean_elem(x) for x in js[grp]],
key=lambda x: (x.get('language', '_'), x['name']))
- output = json.dumps(js, indent = 2)
+ output = yaml.dump(js, indent=2, width=80)
# massage out trailing whitespace
lines = []
for line in output.splitlines():
diff --git a/tools/buildgen/generate_build_additions.sh b/tools/buildgen/generate_build_additions.sh
index 44fc2558fa..b5df150ed1 100644
--- a/tools/buildgen/generate_build_additions.sh
+++ b/tools/buildgen/generate_build_additions.sh
@@ -28,11 +28,11 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-gen_build_json_dirs="test/core/end2end test/core/bad_client"
+gen_build_yaml_dirs="test/core/end2end test/core/bad_client"
gen_build_files=""
-for gen_build_json in $gen_build_json_dirs
+for gen_build_yaml in $gen_build_yaml_dirs
do
output_file=`mktemp /tmp/genXXXXXX`
- $gen_build_json/gen_build_json.py > $output_file
+ $gen_build_yaml/gen_build_yaml.py > $output_file
gen_build_files="$gen_build_files $output_file"
done
diff --git a/tools/buildgen/generate_projects-old.sh b/tools/buildgen/generate_projects-old.sh
index 5399867746..55d93d4942 100644
--- a/tools/buildgen/generate_projects-old.sh
+++ b/tools/buildgen/generate_projects-old.sh
@@ -40,7 +40,7 @@ cd `dirname $0`/../..
mako_renderer=tools/buildgen/mako_renderer.py
if [ "x$TEST" != "x" ] ; then
- tools/buildgen/build-cleaner.py build.json
+ tools/buildgen/build-cleaner.py build.yaml
fi
. tools/buildgen/generate_build_additions.sh
@@ -58,8 +58,8 @@ for dir in . ; do
out=${dir}/${file#$dir/templates/} # strip templates dir prefix
out=${out%.*} # strip template extension
echo "generating file: $out"
- json_files="build.json $gen_build_files"
- data=`for i in $json_files ; do echo $i ; done | awk ' { printf "-d %s ", $0 } '`
+ yaml_files="build.yaml $gen_build_files"
+ data=`for i in $yaml_files ; do echo $i ; done | awk ' { printf "-d %s ", $0 } '`
if [ "x$TEST" = "xtrue" ] ; then
actual_out=$out
out=`mktemp /tmp/gentXXXXXX`
diff --git a/tools/buildgen/generate_projects.sh b/tools/buildgen/generate_projects.sh
index 32fc90fef5..a8878730cf 100755
--- a/tools/buildgen/generate_projects.sh
+++ b/tools/buildgen/generate_projects.sh
@@ -40,11 +40,11 @@ cd `dirname $0`/../..
mako_renderer=tools/buildgen/mako_renderer.py
if [ "x$TEST" != "x" ] ; then
- tools/buildgen/build-cleaner.py build.json
+ tools/buildgen/build-cleaner.py build.yaml
fi
. tools/buildgen/generate_build_additions.sh
-tools/buildgen/generate_projects.py build.json $gen_build_files
+tools/buildgen/generate_projects.py build.yaml $gen_build_files
rm $gen_build_files
diff --git a/tools/buildgen/mako_renderer.py b/tools/buildgen/mako_renderer.py
index 534377e69e..08307bda5a 100755
--- a/tools/buildgen/mako_renderer.py
+++ b/tools/buildgen/mako_renderer.py
@@ -38,14 +38,15 @@ Just a wrapper around the mako rendering library.
import getopt
import imp
import os
+import shutil
import sys
from mako.lookup import TemplateLookup
from mako.runtime import Context
from mako.template import Template
-import simplejson
import bunch
+import yaml
# Imports a plugin
@@ -76,6 +77,7 @@ def main(argv):
got_output = False
output_file = sys.stdout
plugins = []
+ output_name = None
try:
opts, args = getopt.getopt(argv, 'hm:d:o:p:')
@@ -95,7 +97,7 @@ def main(argv):
showhelp()
sys.exit(3)
got_output = True
- output_file = open(arg, 'w')
+ output_name = arg
elif opt == '-m':
if module_directory is not None:
out('Got more than one cache directory')
@@ -104,7 +106,7 @@ def main(argv):
module_directory = arg
elif opt == '-d':
dict_file = open(arg, 'r')
- bunch.merge_json(json_dict, simplejson.loads(dict_file.read()))
+ bunch.merge_json(json_dict, yaml.load(dict_file.read()))
dict_file.close()
elif opt == '-p':
plugins.append(import_plugin(arg))
@@ -115,14 +117,51 @@ def main(argv):
for k, v in json_dict.items():
dictionary[k] = bunch.to_bunch(v)
- ctx = Context(output_file, **dictionary)
-
+ cleared_dir = False
for arg in args:
got_input = True
- template = Template(filename=arg,
- module_directory=module_directory,
- lookup=TemplateLookup(directories=['.']))
- template.render_context(ctx)
+ with open(arg) as f:
+ srcs = list(yaml.load_all(f.read()))
+ for src in srcs:
+ if isinstance(src, basestring):
+ assert len(srcs) == 1
+ template = Template(src,
+ filename=arg,
+ module_directory=module_directory,
+ lookup=TemplateLookup(directories=['.']))
+ with open(output_name, 'w') as output_file:
+ template.render_context(Context(output_file, **dictionary))
+ else:
+ # we have optional control data: this template represents
+ # a directory
+ if not cleared_dir:
+ shutil.rmtree(output_name, ignore_errors=True)
+ cleared_dir = True
+ items = []
+ if 'foreach' in src:
+ for el in dictionary[src['foreach']]:
+ if 'cond' in src:
+ args = dict(dictionary)
+ args['selected'] = el
+ if not eval(src['cond'], {}, args):
+ continue
+ items.append(el)
+ assert items
+ else:
+ items = [None]
+ for item in items:
+ args = dict(dictionary)
+ args['selected'] = item
+ item_output_name = os.path.join(
+ output_name, Template(src['output_name']).render(**args))
+ if not os.path.exists(os.path.dirname(item_output_name)):
+ os.makedirs(os.path.dirname(item_output_name))
+ template = Template(src['template'],
+ filename=arg,
+ module_directory=module_directory,
+ lookup=TemplateLookup(directories=['.']))
+ with open(item_output_name, 'w') as output_file:
+ template.render_context(Context(output_file, **args))
if not got_input:
out('Got nothing to do')
diff --git a/tools/buildgen/plugins/expand_bin_attrs.py b/tools/buildgen/plugins/expand_bin_attrs.py
index d221b3a325..4f359e5933 100755
--- a/tools/buildgen/plugins/expand_bin_attrs.py
+++ b/tools/buildgen/plugins/expand_bin_attrs.py
@@ -37,7 +37,7 @@ This fills in any optional attributes.
def mako_plugin(dictionary):
"""The exported plugin code for expand_filegroups.
- The list of libs in the build.json file can contain "filegroups" tags.
+ The list of libs in the build.yaml file can contain "filegroups" tags.
These refer to the filegroups in the root object. We will expand and
merge filegroups on the src, headers and public_headers properties.
diff --git a/tools/buildgen/plugins/expand_filegroups.py b/tools/buildgen/plugins/expand_filegroups.py
index f63072cc5c..156bdc4417 100755
--- a/tools/buildgen/plugins/expand_filegroups.py
+++ b/tools/buildgen/plugins/expand_filegroups.py
@@ -29,7 +29,7 @@
"""Buildgen expand filegroups plugin.
-This takes the list of libs from our json dictionary,
+This takes the list of libs from our yaml dictionary,
and expands any and all filegroup.
"""
@@ -45,7 +45,7 @@ def excluded(filename, exclude_res):
def mako_plugin(dictionary):
"""The exported plugin code for expand_filegroups.
- The list of libs in the build.json file can contain "filegroups" tags.
+ The list of libs in the build.yaml file can contain "filegroups" tags.
These refer to the filegroups in the root object. We will expand and
merge filegroups on the src, headers and public_headers properties.
diff --git a/tools/buildgen/plugins/generate_vsprojects.py b/tools/buildgen/plugins/generate_vsprojects.py
index 413056fe89..841a61f660 100755
--- a/tools/buildgen/plugins/generate_vsprojects.py
+++ b/tools/buildgen/plugins/generate_vsprojects.py
@@ -57,14 +57,27 @@ def mako_plugin(dictionary):
projects = []
projects.extend(libs)
projects.extend(targets)
- if dictionary.get('debug', False):
- for target in projects:
- if not target.get('vs_project_guid', None) and 'windows' in target.get('platforms', ['windows']):
- name = target['name']
- guid = re.sub('(........)(....)(....)(....)(.*)',
- r'{\1-\2-\3-\4-\5}',
- hashlib.md5(name).hexdigest())
- target['vs_project_guid'] = guid.upper()
+ for target in projects:
+ if 'build' in target and target['build'] == 'test':
+ default_test_dir = 'test'
+ else:
+ default_test_dir = '.'
+ if 'vs_config_type' not in target:
+ if 'build' in target and target['build'] == 'test':
+ target['vs_config_type'] = 'Application'
+ else:
+ target['vs_config_type'] = 'StaticLibrary'
+ if 'vs_packages' not in target:
+ target['vs_packages'] = []
+ if 'vs_props' not in target:
+ target['vs_props'] = []
+ target['vs_proj_dir'] = target.get('vs_proj_dir', default_test_dir)
+ if target.get('vs_project_guid', None) is None and 'windows' in target.get('platforms', ['windows']):
+ name = target['name']
+ guid = re.sub('(........)(....)(....)(....)(.*)',
+ r'{\1-\2-\3-\4-\5}',
+ hashlib.md5(name).hexdigest())
+ target['vs_project_guid'] = guid.upper()
# Exclude projects without a visual project guid, such as the tests.
projects = [project for project in projects
if project.get('vs_project_guid', None)]
@@ -74,5 +87,9 @@ def mako_plugin(dictionary):
project_dict = dict([(p['name'], p) for p in projects])
+ packages = dictionary.get('vspackages', [])
+ packages_dict = dict([(p['name'], p) for p in packages])
+
dictionary['vsprojects'] = projects
dictionary['vsproject_dict'] = project_dict
+ dictionary['vspackages_dict'] = packages_dict
diff --git a/tools/buildgen/plugins/list_protos.py b/tools/buildgen/plugins/list_protos.py
index f12d7260bd..2f2ac5e053 100755
--- a/tools/buildgen/plugins/list_protos.py
+++ b/tools/buildgen/plugins/list_protos.py
@@ -29,7 +29,7 @@
"""Buildgen .proto files list plugin.
-This parses the list of targets from the json build file, and creates
+This parses the list of targets from the yaml build file, and creates
a list called "protos" that contains all of the proto file names.
"""