114 lines
3.6 KiB
Python
Executable File
114 lines
3.6 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
# Copyright (c) 2021 Huawei Device Co., Ltd.
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import json
|
|
import os
|
|
import subprocess
|
|
import hashlib
|
|
import platform
|
|
|
|
|
|
def find_top():
|
|
cur_dir = os.getcwd()
|
|
while cur_dir != "/":
|
|
build_config_file = os.path.join(
|
|
cur_dir, 'build/config/BUILDCONFIG.gn')
|
|
if os.path.exists(build_config_file):
|
|
return cur_dir
|
|
cur_dir = os.path.dirname(cur_dir)
|
|
|
|
# Read json file data
|
|
def read_json_file(input_file):
|
|
if not os.path.exists(input_file):
|
|
print("file '{}' doesn't exist.".format(input_file))
|
|
return None
|
|
|
|
data = None
|
|
try:
|
|
with open(input_file, 'r') as input_f:
|
|
data = json.load(input_f)
|
|
except json.decoder.JSONDecodeError:
|
|
print("The file '{}' format is incorrect.".format(input_file))
|
|
raise
|
|
except: # noqa E722
|
|
print("read file '{}' failed.".format(input_file))
|
|
raise
|
|
return data
|
|
|
|
|
|
# Read file by line
|
|
def read_file(input_file):
|
|
if not os.path.exists(input_file):
|
|
print("file '{}' doesn't exist.".format(input_file))
|
|
return None
|
|
|
|
data = []
|
|
try:
|
|
with open(input_file, 'r') as file_obj:
|
|
for line in file_obj.readlines():
|
|
data.append(line.rstrip('\n'))
|
|
except: # noqa E722
|
|
print("read file '{}' failed".format(input_file))
|
|
raise
|
|
return data
|
|
|
|
|
|
# Write json file data
|
|
def write_json_file(output_file, content, check_changes=False):
|
|
file_dir = os.path.dirname(os.path.abspath(output_file))
|
|
if not os.path.exists(file_dir):
|
|
os.makedirs(file_dir, exist_ok=True)
|
|
|
|
if check_changes is True:
|
|
changed = __check_changes(output_file, content)
|
|
else:
|
|
changed = True
|
|
if changed is True:
|
|
with open(output_file, 'w') as output_f:
|
|
json.dump(content, output_f, sort_keys=True, indent=2)
|
|
|
|
|
|
def __check_changes(output_file, content):
|
|
if os.path.exists(output_file) and os.path.isfile(output_file):
|
|
# file content md5 val
|
|
sha256_obj = hashlib.sha256()
|
|
sha256_obj.update(str(read_json_file(output_file)).encode())
|
|
hash_value = sha256_obj.hexdigest()
|
|
# new content md5 val
|
|
sha256_obj_new = hashlib.sha256()
|
|
sha256_obj_new.update(str(content).encode())
|
|
hash_value_new = sha256_obj_new.hexdigest()
|
|
if hash_value_new == hash_value:
|
|
return False
|
|
return True
|
|
|
|
|
|
# Write file data
|
|
def write_file(output_file, content):
|
|
code_dir = find_top()
|
|
os_name= platform.system().lower()
|
|
gn_exe = os.path.join(code_dir, f'prebuilts/build-tools/{os_name}-x86/bin/gn')
|
|
file_dir = os.path.dirname(os.path.abspath(output_file))
|
|
if not os.path.exists(file_dir):
|
|
os.makedirs(file_dir, exist_ok=True)
|
|
|
|
with open(output_file, 'w') as output_f:
|
|
output_f.write(content)
|
|
if output_file.endswith('.gni') or output_file.endswith('.gn'):
|
|
# Call gn format to make the output gn file prettier.
|
|
cmd = [gn_exe, 'format']
|
|
cmd.append(output_file)
|
|
subprocess.check_output(cmd)
|