Mercurial > hg > CbC > CbC_llvm
view clang/utils/CaptureCmd @ 248:cfe92afade2b
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 16 Aug 2023 18:23:14 +0900 |
parents | 1d019706d866 |
children |
line wrap: on
line source
#!/usr/bin/env python """CaptureCmd - A generic tool for capturing information about the invocations of another program. Usage -- 1. Move the original tool to a safe known location. 2. Link CaptureCmd to the original tool's location. 3. Define CAPTURE_CMD_PROGRAM to the known location of the original tool; this must be an absolute path. 4. Define CAPTURE_CMD_DIR to a directory to write invocation information to. """ import hashlib import os import sys import time def saveCaptureData(prefix, dir, object): string = repr(object) + '\n' key = hashlib.sha1(string).hexdigest() path = os.path.join(dir, prefix + key) if not os.path.exists(path): f = open(path, 'wb') f.write(string) f.close() return prefix + key def main(): program = os.getenv('CAPTURE_CMD_PROGRAM') dir = os.getenv('CAPTURE_CMD_DIR') fallback = os.getenv('CAPTURE_CMD_FALLBACK') if not program: raise ValueError('CAPTURE_CMD_PROGRAM is not defined!') if not dir: raise ValueError('CAPTURE_CMD_DIR is not defined!') # Make the output directory if it doesn't already exist. if not os.path.exists(dir): os.mkdir(dir, 0700) # Get keys for various data. env = os.environ.items() env.sort() envKey = saveCaptureData('env-', dir, env) cwdKey = saveCaptureData('cwd-', dir, os.getcwd()) argvKey = saveCaptureData('argv-', dir, sys.argv) entry = (time.time(), envKey, cwdKey, argvKey) saveCaptureData('cmd-', dir, entry) if fallback: pid = os.fork() if not pid: os.execv(program, sys.argv) os._exit(1) else: res = os.waitpid(pid, 0) if not res: os.execv(fallback, sys.argv) os._exit(1) os._exit(res) else: os.execv(program, sys.argv) os._exit(1) if __name__ == '__main__': main()