tdesktop/Telegram/gyp/list_sources.py

150 lines
4.0 KiB
Python

'''
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
'''
from __future__ import print_function
import sys
import os
import re
import time
import codecs
def eprint(*args, **kwargs):
print(*args, file=sys.stderr, **kwargs)
sys.exit(1)
def check_non_empty_moc(file_path):
if not os.path.isfile(file_path):
return False
if re.search(r'\.h$', file_path):
with codecs.open(file_path, mode="r", encoding="utf-8") as f:
for line in f:
if re.search(r'(^|\s)Q_OBJECT(\s|$)', line):
return True
return False
def should_exclude(rules, exclude_for):
for rule in rules:
if rule[0:1] == '!':
return (rule[1:] == exclude_for)
elif rule == exclude_for:
return False
return len(rules) > 0
my_path = os.path.dirname(os.path.realpath(__file__)).replace('\\', '/')
file_paths = []
platform_rules = {}
next_input_path = 0
input_path = ''
next_moc_prefix = 0
moc_prefix = ''
next_replace = 0
replaces = []
next_exclude_for = 0
exclude_for = ''
next_self = 1
for arg in sys.argv:
if next_self != 0:
next_self = 0
continue
if arg == '--moc-prefix':
next_moc_prefix = 1
continue
elif next_moc_prefix == 1:
next_moc_prefix = 0
moc_prefix = arg.replace('SHARED_INTERMEDIATE_DIR', '<(SHARED_INTERMEDIATE_DIR)')
continue
if arg == '--input':
next_input_path = 1
continue
elif next_input_path == 1:
next_input_path = 0
input_path = arg
continue
if arg == '--replace':
next_replace = 1
continue
elif next_replace == 1:
next_replace = 0
replaces.append(arg)
continue
if arg == '--exclude_for':
next_exclude_for = 1
continue
elif next_exclude_for == 1:
next_exclude_for = 0
exclude_for = arg
continue
file_paths.append(arg)
if input_path != '':
if len(file_paths) != 0:
eprint('You need to specify input file or input paths in command line.')
elif not os.path.isfile(input_path):
eprint('Input path not found.')
else:
platforms = []
with open(input_path, 'r') as f:
for line in f:
file_path = line.strip()
if file_path[0:10] == 'platforms:':
platforms_list = file_path[10:].split(' ')
platforms = []
for platform in file_path[10:].split(' '):
platform = platform.strip()
if platform != '':
platforms.append(platform)
elif file_path[0:2] != '//' and file_path != '':
file_paths.append(file_path)
if len(platforms):
platform_rules[file_path] = platforms
elif '/platform/win/' in file_path:
platform_rules[file_path] = [ 'win' ]
elif '/platform/mac/' in file_path:
platform_rules[file_path] = [ 'mac' ]
elif '/platform/linux/' in file_path:
platform_rules[file_path] = [ 'linux' ]
for replace in replaces:
replace_parts = replace.split('=', 1)
if len(replace_parts) != 2:
eprint('Bad replace: ' + replace)
real_paths = []
real_platform_rules = {}
for file_path in file_paths:
real_path = file_path.replace('<(' + replace_parts[0] + ')', replace_parts[1])
real_paths.append(real_path)
if file_path in platform_rules:
real_platform_rules[real_path] = platform_rules[file_path]
file_paths = real_paths
platform_rules = real_platform_rules
if exclude_for != '':
real_paths = []
for file_path in file_paths:
if not file_path in platform_rules:
continue
if not should_exclude(platform_rules[file_path], exclude_for):
continue
real_paths.append(file_path)
file_paths = real_paths
for file_path in file_paths:
print(file_path)
if moc_prefix != '':
for file_path in file_paths:
if check_non_empty_moc(file_path):
m = re.search(r'(^|/)([^/]+)\.h$', file_path)
if not m:
eprint('Bad file path: ' + file_path)
print(moc_prefix + m.group(2) + '.cpp')