102 lines
3.5 KiB
Python
102 lines
3.5 KiB
Python
|
#!/usr/bin/env python
|
||
|
|
||
|
# Copyright 2019 The Crashpad Authors. All rights reserved.
|
||
|
#
|
||
|
# 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 os
|
||
|
import shutil
|
||
|
import sys
|
||
|
import tempfile
|
||
|
|
||
|
import mig_fix
|
||
|
import mig_gen
|
||
|
|
||
|
|
||
|
def _try_remove(*paths):
|
||
|
for path in paths:
|
||
|
try:
|
||
|
os.remove(path)
|
||
|
except OSError:
|
||
|
pass
|
||
|
|
||
|
|
||
|
def _generate_and_fix(user_c, server_c, user_h, server_h, defs, include, sdk,
|
||
|
clang_path, mig_path, migcom_path, arch):
|
||
|
interface = mig_gen.MigInterface(user_c, server_c, user_h, server_h)
|
||
|
mig_gen.generate_interface(defs, interface, include, sdk, clang_path,
|
||
|
mig_path, migcom_path, arch)
|
||
|
mig_fix.fix_interface(interface)
|
||
|
|
||
|
|
||
|
def _wrap_arch_guards(file, arch):
|
||
|
contents = '#if defined(__%s__)\n' % arch
|
||
|
contents += open(file, 'r').read()
|
||
|
contents += '\n#endif /* __%s__ */\n' % arch
|
||
|
return contents
|
||
|
|
||
|
|
||
|
def _write_file(path, data):
|
||
|
with open(path, 'w') as file:
|
||
|
file.write(data)
|
||
|
|
||
|
|
||
|
def main(args):
|
||
|
parsed = mig_gen.parse_args(args, multiple_arch=True)
|
||
|
|
||
|
_try_remove(parsed.user_c, parsed.server_c, parsed.user_h, parsed.server_h)
|
||
|
|
||
|
if len(parsed.arch) <= 1:
|
||
|
_generate_and_fix(parsed.user_c, parsed.server_c, parsed.user_h,
|
||
|
parsed.server_h, parsed.defs, parsed.include,
|
||
|
parsed.sdk, parsed.clang_path, parsed.mig_path,
|
||
|
parsed.migcom_path,
|
||
|
parsed.arch[0] if len(parsed.arch) >= 1 else None)
|
||
|
return 0
|
||
|
|
||
|
# Run mig once per architecture, and smush everything together, wrapped in
|
||
|
# in architecture-specific #if guards.
|
||
|
|
||
|
user_c_data = ''
|
||
|
server_c_data = ''
|
||
|
user_h_data = ''
|
||
|
server_h_data = ''
|
||
|
|
||
|
for arch in parsed.arch:
|
||
|
# Python 3: use tempfile.TempDirectory instead
|
||
|
temp_dir = tempfile.mkdtemp(prefix=os.path.basename(sys.argv[0]) + '_')
|
||
|
try:
|
||
|
user_c = os.path.join(temp_dir, os.path.basename(parsed.user_c))
|
||
|
server_c = os.path.join(temp_dir, os.path.basename(parsed.server_c))
|
||
|
user_h = os.path.join(temp_dir, os.path.basename(parsed.user_h))
|
||
|
server_h = os.path.join(temp_dir, os.path.basename(parsed.server_h))
|
||
|
_generate_and_fix(user_c, server_c, user_h, server_h, parsed.defs,
|
||
|
parsed.include, parsed.sdk, parsed.clang_path,
|
||
|
parsed.mig_path, parsed.migcom_path, arch)
|
||
|
|
||
|
user_c_data += _wrap_arch_guards(user_c, arch)
|
||
|
server_c_data += _wrap_arch_guards(server_c, arch)
|
||
|
user_h_data += _wrap_arch_guards(user_h, arch)
|
||
|
server_h_data += _wrap_arch_guards(server_h, arch)
|
||
|
finally:
|
||
|
shutil.rmtree(temp_dir)
|
||
|
|
||
|
_write_file(parsed.user_c, user_c_data)
|
||
|
_write_file(parsed.server_c, server_c_data)
|
||
|
_write_file(parsed.user_h, user_h_data)
|
||
|
_write_file(parsed.server_h, server_h_data)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
sys.exit(main(sys.argv[1:]))
|