#!/usr/bin/env python # # Copyright 2016 Google Inc. # # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """ Usage: gn_to_cmake.py gn gen out/config --ide=json --json-ide-script=../../gn/gn_to_cmake.py or gn gen out/config --ide=json python gn/gn_to_cmake.py out/config/project.json """ import json import posixpath import os import sys def write_project(project): def get_base_name(target_name): base_name = posixpath.basename(target_name) sep = base_name.rfind(":") if sep != -1: base_name = base_name[sep+1:] return base_name def get_output_name(target_name, target_properties): output_name = target_properties.get("output_name", None) if output_name is None: output_name = get_base_name(target_name) output_extension = target_properties.get("output_extension", None) if output_extension is not None: output_name = posixpath.splitext(output_name)[0] if len(output_extension): output_name += "." + output_extension return output_name def get_absolute_path(root_path, path): if path.startswith("//"): return root_path + "/" + path[2:] else: return path build_settings = project['build_settings'] root_path = build_settings['root_path'] build_path = os.path.join(root_path, build_settings['build_dir'][2:]) out = open(os.path.join(build_path, 'CMakeLists.txt'), 'w+') out.write('cmake_minimum_required(VERSION 2.8.8 FATAL_ERROR)\n') out.write('cmake_policy(VERSION 2.8.8)\n') for target_name, target_properties in project['targets'].items(): sources = target_properties.get('sources', []) if not sources: continue target_output_name = get_output_name(target_name, target_properties) out.write('\n') out.write('add_library(') out.write(target_output_name) out.write(' STATIC\n') for source in sources: out.write(' "') out.write(get_absolute_path(root_path, source)) out.write('"\n') out.write(')\n') out.write('set_target_properties(') out.write(target_output_name) out.write(' PROPERTIES EXCLUDE_FROM_ALL "TRUE")\n') out.write('set_property(TARGET ') out.write(target_output_name) out.write(' APPEND PROPERTY INCLUDE_DIRECTORIES\n') for include_dir in target_properties.get('include_dirs', []): out.write(' "') out.write(get_absolute_path(root_path, include_dir)) out.write('"\n') out.write(')\n') out.write('set_target_properties(') out.write(target_output_name) out.write(' PROPERTIES COMPILE_DEFINITIONS "') for define in target_properties.get('defines', []): out.write(define) out.write(';') out.write('")\n') def main(): if len(sys.argv) != 2: print('Usage: ' + sys.argv[0] + ' ') exit(1) json_path = sys.argv[1] project = None with open(json_path, 'r') as json_file: project = json.loads(json_file.read()) write_project(project) if __name__ == "__main__": main()