#!/usr/bin/env python3
# Copyright 2019 The Crashpad Authors
#
# 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:]))