Improve generate_build_files.py gn support.

Split gn and gyp generators apart. Since we're pre-generating files, there's no
need to make BoringSSL's build depend on the gypi_to_gn.py script. Also emit
the tests and a list of fuzzers so we don't need to manually update BUILD.gn
each time.

The new gn generator is based on the bazel one since they're fairly similar.

BUG=chromium:429246

Change-Id: I5a819a964d6ac6e56e9251bb3fd3de1db08214a4
Reviewed-on: https://boringssl-review.googlesource.com/7726
Reviewed-by: Adam Langley <agl@google.com>
This commit is contained in:
David Benjamin 2016-04-21 18:47:57 -04:00 committed by Adam Langley
parent 818aff01fb
commit 38d01c6b95

View File

@ -48,76 +48,6 @@ NON_PERL_FILES = {
} }
class Chromium(object):
def __init__(self):
self.header = \
"""# Copyright (c) 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# This file is created by generate_build_files.py. Do not edit manually.
"""
def PrintVariableSection(self, out, name, files):
out.write(' \'%s\': [\n' % name)
for f in sorted(files):
out.write(' \'%s\',\n' % f)
out.write(' ],\n')
def WriteFiles(self, files, asm_outputs):
with open('boringssl.gypi', 'w+') as gypi:
gypi.write(self.header + '{\n \'variables\': {\n')
self.PrintVariableSection(
gypi, 'boringssl_ssl_sources', files['ssl'])
self.PrintVariableSection(
gypi, 'boringssl_crypto_sources', files['crypto'])
for ((osname, arch), asm_files) in asm_outputs:
self.PrintVariableSection(gypi, 'boringssl_%s_%s_sources' %
(osname, arch), asm_files)
gypi.write(' }\n}\n')
with open('boringssl_tests.gypi', 'w+') as test_gypi:
test_gypi.write(self.header + '{\n \'targets\': [\n')
test_names = []
for test in sorted(files['test']):
test_name = 'boringssl_%s' % os.path.splitext(os.path.basename(test))[0]
test_gypi.write(""" {
'target_name': '%s',
'type': 'executable',
'dependencies': [
'boringssl.gyp:boringssl',
],
'sources': [
'%s',
'<@(boringssl_test_support_sources)',
],
# TODO(davidben): Fix size_t truncations in BoringSSL.
# https://crbug.com/429039
'msvs_disabled_warnings': [ 4267, ],
},\n""" % (test_name, test))
test_names.append(test_name)
test_names.sort()
test_gypi.write(' ],\n \'variables\': {\n')
self.PrintVariableSection(
test_gypi, 'boringssl_test_support_sources', files['test_support'])
test_gypi.write(' \'boringssl_test_targets\': [\n')
for test in test_names:
test_gypi.write(""" '%s',\n""" % test)
test_gypi.write(' ],\n }\n}\n')
class Android(object): class Android(object):
def __init__(self): def __init__(self):
@ -284,6 +214,148 @@ class Bazel(object):
out.write(' )\n') out.write(' )\n')
class GN(object):
def __init__(self):
self.firstSection = True
self.header = \
"""# Copyright (c) 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# This file is created by generate_build_files.py. Do not edit manually.
"""
def PrintVariableSection(self, out, name, files):
if not self.firstSection:
out.write('\n')
self.firstSection = False
out.write('%s = [\n' % name)
for f in sorted(files):
out.write(' "%s",\n' % f)
out.write(']\n')
def WriteFiles(self, files, asm_outputs):
with open('BUILD.generated.gni', 'w+') as out:
out.write(self.header)
self.PrintVariableSection(out, 'crypto_sources', files['crypto'])
self.PrintVariableSection(out, 'ssl_sources', files['ssl'])
for ((osname, arch), asm_files) in asm_outputs:
self.PrintVariableSection(
out, 'crypto_sources_%s_%s' % (osname, arch), asm_files)
fuzzers = [os.path.splitext(os.path.basename(fuzzer))[0]
for fuzzer in files['fuzz']]
self.PrintVariableSection(out, 'fuzzers', fuzzers)
with open('BUILD.generated_tests.gni', 'w+') as out:
self.firstSection = True
out.write(self.header)
self.PrintVariableSection(out, '_test_support_sources',
files['test_support'])
out.write('\n')
out.write('template("create_tests") {\n')
all_tests = []
for test in sorted(files['test']):
test_name = 'boringssl_%s' % os.path.splitext(os.path.basename(test))[0]
all_tests.append(test_name)
out.write(' executable("%s") {\n' % test_name)
out.write(' sources = [\n')
out.write(' "%s",\n' % test)
out.write(' ]\n')
out.write(' sources += _test_support_sources\n')
out.write(' configs += invoker.configs\n')
out.write(' deps = invoker.deps\n')
out.write(' }\n')
out.write('\n')
out.write(' group(target_name) {\n')
out.write(' deps = [\n')
for test_name in sorted(all_tests):
out.write(' ":%s",\n' % test_name)
out.write(' ]\n')
out.write(' }\n')
out.write('}\n')
class GYP(object):
def __init__(self):
self.header = \
"""# Copyright (c) 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# This file is created by generate_build_files.py. Do not edit manually.
"""
def PrintVariableSection(self, out, name, files):
out.write(' \'%s\': [\n' % name)
for f in sorted(files):
out.write(' \'%s\',\n' % f)
out.write(' ],\n')
def WriteFiles(self, files, asm_outputs):
with open('boringssl.gypi', 'w+') as gypi:
gypi.write(self.header + '{\n \'variables\': {\n')
self.PrintVariableSection(
gypi, 'boringssl_ssl_sources', files['ssl'])
self.PrintVariableSection(
gypi, 'boringssl_crypto_sources', files['crypto'])
for ((osname, arch), asm_files) in asm_outputs:
self.PrintVariableSection(gypi, 'boringssl_%s_%s_sources' %
(osname, arch), asm_files)
gypi.write(' }\n}\n')
with open('boringssl_tests.gypi', 'w+') as test_gypi:
test_gypi.write(self.header + '{\n \'targets\': [\n')
test_names = []
for test in sorted(files['test']):
test_name = 'boringssl_%s' % os.path.splitext(os.path.basename(test))[0]
test_gypi.write(""" {
'target_name': '%s',
'type': 'executable',
'dependencies': [
'boringssl.gyp:boringssl',
],
'sources': [
'%s',
'<@(boringssl_test_support_sources)',
],
# TODO(davidben): Fix size_t truncations in BoringSSL.
# https://crbug.com/429039
'msvs_disabled_warnings': [ 4267, ],
},\n""" % (test_name, test))
test_names.append(test_name)
test_names.sort()
test_gypi.write(' ],\n \'variables\': {\n')
self.PrintVariableSection(
test_gypi, 'boringssl_test_support_sources', files['test_support'])
test_gypi.write(' \'boringssl_test_targets\': [\n')
for test in sorted(test_names):
test_gypi.write(""" '%s',\n""" % test)
test_gypi.write(' ],\n }\n}\n')
def FindCMakeFiles(directory): def FindCMakeFiles(directory):
"""Returns list of all CMakeLists.txt files recursively in directory.""" """Returns list of all CMakeLists.txt files recursively in directory."""
cmakefiles = [] cmakefiles = []
@ -457,7 +529,7 @@ def WriteAsmFiles(perlasms):
def main(platforms): def main(platforms):
crypto_c_files = FindCFiles(os.path.join('src', 'crypto'), NoTests) crypto_c_files = FindCFiles(os.path.join('src', 'crypto'), NoTests)
ssl_c_files = FindCFiles(os.path.join('src', 'ssl'), NoTests) ssl_c_files = FindCFiles(os.path.join('src', 'ssl'), NoTests)
tool_cc_files = FindCFiles(os.path.join('src', 'tool'), NoTests) tool_c_files = FindCFiles(os.path.join('src', 'tool'), NoTests)
# Generate err_data.c # Generate err_data.c
with open('err_data.c', 'w+') as err_data: with open('err_data.c', 'w+') as err_data:
@ -466,12 +538,14 @@ def main(platforms):
stdout=err_data) stdout=err_data)
crypto_c_files.append('err_data.c') crypto_c_files.append('err_data.c')
test_support_cc_files = FindCFiles(os.path.join('src', 'crypto', 'test'), test_support_c_files = FindCFiles(os.path.join('src', 'crypto', 'test'),
AllFiles) AllFiles)
test_c_files = FindCFiles(os.path.join('src', 'crypto'), OnlyTests) test_c_files = FindCFiles(os.path.join('src', 'crypto'), OnlyTests)
test_c_files += FindCFiles(os.path.join('src', 'ssl'), OnlyTests) test_c_files += FindCFiles(os.path.join('src', 'ssl'), OnlyTests)
fuzz_c_files = FindCFiles(os.path.join('src', 'fuzz'), NoTests)
ssl_h_files = ( ssl_h_files = (
FindHeaderFiles( FindHeaderFiles(
os.path.join('src', 'include', 'openssl'), os.path.join('src', 'include', 'openssl'),
@ -511,12 +585,13 @@ def main(platforms):
'crypto': crypto_c_files, 'crypto': crypto_c_files,
'crypto_headers': crypto_h_files, 'crypto_headers': crypto_h_files,
'crypto_internal_headers': crypto_internal_h_files, 'crypto_internal_headers': crypto_internal_h_files,
'fuzz': fuzz_c_files,
'ssl': ssl_c_files, 'ssl': ssl_c_files,
'ssl_headers': ssl_h_files, 'ssl_headers': ssl_h_files,
'ssl_internal_headers': ssl_internal_h_files, 'ssl_internal_headers': ssl_internal_h_files,
'tool': tool_cc_files, 'tool': tool_c_files,
'test': test_c_files, 'test': test_c_files,
'test_support': test_support_cc_files, 'test_support': test_support_c_files,
'tests': tests, 'tests': tests,
} }
@ -529,7 +604,7 @@ def main(platforms):
def Usage(): def Usage():
print 'Usage: python %s [chromium|android|android-standalone|bazel]' % sys.argv[0] print 'Usage: python %s [android|android-standalone|bazel|gn|gyp]' % sys.argv[0]
sys.exit(1) sys.exit(1)
@ -539,14 +614,16 @@ if __name__ == '__main__':
platforms = [] platforms = []
for s in sys.argv[1:]: for s in sys.argv[1:]:
if s == 'chromium' or s == 'gyp': if s == 'android':
platforms.append(Chromium())
elif s == 'android':
platforms.append(Android()) platforms.append(Android())
elif s == 'android-standalone': elif s == 'android-standalone':
platforms.append(AndroidStandalone()) platforms.append(AndroidStandalone())
elif s == 'bazel': elif s == 'bazel':
platforms.append(Bazel()) platforms.append(Bazel())
elif s == 'gn':
platforms.append(GN())
elif s == 'gyp':
platforms.append(GYP())
else: else:
Usage() Usage()