10825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci#!/usr/bin/env python
20825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci# Copyright (C) 2017 The Android Open Source Project
30825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci#
40825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci# Licensed under the Apache License, Version 2.0 (the "License");
50825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci# you may not use this file except in compliance with the License.
60825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci# You may obtain a copy of the License at
70825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci#
80825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci#      http://www.apache.org/licenses/LICENSE-2.0
90825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci#
100825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci# Unless required by applicable law or agreed to in writing, software
110825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci# distributed under the License is distributed on an "AS IS" BASIS,
120825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci# See the License for the specific language governing permissions and
140825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci# limitations under the License.
150825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci
160825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucciimport argparse
170825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucciimport os
180825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucciimport subprocess
190825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucciimport sys
200825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci
210825bc835bd954784adee5a1c563c0b8d1cac664Primiano TucciMAC_BUILD_CONFIGS = {
220825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  'mac_debug': ['is_clang=true', 'is_debug=true'],
230825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  'mac_release': ['is_clang=true', 'is_debug=false'],
240825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  'mac_asan': ['is_clang=true', 'is_debug=false', 'is_asan=true'],
250825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  'mac_tsan': ['is_clang=true', 'is_debug=false', 'is_tsan=true'],
260825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  'mac_ubsan': ['is_clang=true', 'is_debug=false', 'is_ubsan=true'],
270825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci}
280825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci
290825bc835bd954784adee5a1c563c0b8d1cac664Primiano TucciANDROID_BUILD_CONFIGS = {
300825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  'android_debug': ['target_os="android"', 'is_clang=true', 'is_debug=true'],
310825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  'android_release': ['target_os="android"', 'is_clang=true', 'is_debug=false'],
320825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  'android_asan': ['target_os="android"', 'is_clang=true', 'is_debug=false', 'is_asan=true'],
330825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  'android_lsan': ['target_os="android"', 'is_clang=true', 'is_debug=false', 'is_lsan=true'],
340825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci}
350825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci
360825bc835bd954784adee5a1c563c0b8d1cac664Primiano TucciANDROID_ARCHS = [ 'arm', 'arm64' ]
370825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci
380825bc835bd954784adee5a1c563c0b8d1cac664Primiano TucciLINUX_BUILD_CONFIGS = {
390825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  'linux_gcc_debug': ['is_clang=false', 'is_debug=true'],
400825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  'linux_gcc_release': ['is_clang=false', 'is_debug=false'],
410825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  'linux_clang_debug': ['is_clang=true', 'is_debug=true'],
420825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  'linux_clang_release': ['is_clang=true', 'is_debug=false'],
430825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  'linux_asan': ['is_clang=true', 'is_debug=false', 'is_asan=true'],
440825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  'linux_lsan': ['is_clang=true', 'is_debug=false', 'is_lsan=true'],
450825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  'linux_msan': ['is_clang=true', 'is_debug=false', 'is_msan=true'],
460825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  'linux_tsan': ['is_clang=true', 'is_debug=false', 'is_tsan=true'],
470825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  'linux_ubsan': ['is_clang=true', 'is_debug=false', 'is_ubsan=true'],
48bfc8e60309bf208a12260d991116e009ce6f279eFlorian Mayer  'linux_fuzzer': ['is_clang=true', 'is_debug=false', 'use_libfuzzer=true',
492198b072fb436d362a448d1977f71637a7c6dc8eFlorian Mayer                   'is_asan=true'],
500825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci}
510825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci
520825bc835bd954784adee5a1c563c0b8d1cac664Primiano TucciROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
530825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci
540825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tuccidef main():
550825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  parser = argparse.ArgumentParser()
560825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  parser.add_argument('--host-only', action='store_true', default=False)
570825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  parser.add_argument('--build', default=None)
580825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  args = parser.parse_args()
590825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci
600825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  configs = {}
610825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  if not args.host_only:
620825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci    for config_name, gn_args in ANDROID_BUILD_CONFIGS.iteritems():
630825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci      for arch in ANDROID_ARCHS:
640825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci        full_config_name = '%s_%s' % (config_name, arch)
650825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci        configs[full_config_name] = gn_args + ['target_cpu="%s"' % arch]
660825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci
670825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  if sys.platform == 'linux2':
680825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci    configs.update(LINUX_BUILD_CONFIGS)
690825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  elif sys.platform == 'darwin':
700825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci    configs.update(MAC_BUILD_CONFIGS)
710825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  else:
720825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci    assert(False)
730825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci
740825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  out_base_dir = os.path.join(ROOT_DIR, 'out')
750825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  if not os.path.isdir(out_base_dir):
760825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci    os.mkdir(out_base_dir)
770825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci
787a40e4d530f2764dd4a3f9a1e6d517d0654fb82dPrimiano Tucci  gn = os.path.join(ROOT_DIR, 'tools', 'gn')
790825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci
800825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  for config_name, gn_args in configs.iteritems():
810825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci    print '\n\033[32mBuilding %-20s[%s]\033[0m' % (config_name, ','.join(gn_args))
820825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci    out_dir = os.path.join(ROOT_DIR, 'out', config_name)
830825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci    if not os.path.isdir(out_dir):
840825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci      os.mkdir(out_dir)
850825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci    gn_cmd = [gn, 'args', out_dir, '--args=%s' % (' '.join(gn_args)), '--check']
860825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci    print ' '.join(gn_cmd)
870825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci    subprocess.check_call(gn_cmd, cwd=ROOT_DIR, env={'EDITOR':'true'})
880825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci    if args.build:
897a40e4d530f2764dd4a3f9a1e6d517d0654fb82dPrimiano Tucci      ninja = os.path.join(ROOT_DIR, 'tools', 'ninja')
900825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci      ninja_cmd = [ninja, '-C', '.', args.build]
910825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci      subprocess.check_call(ninja_cmd, cwd=out_dir)
920825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci
930825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci
940825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucciif __name__ == '__main__':
950825bc835bd954784adee5a1c563c0b8d1cac664Primiano Tucci  sys.exit(main())
96