| import collections |
|
|
|
|
| Entry = collections.namedtuple('Entry', 'version, hash') |
|
|
|
|
| def update_hash(seed, value): |
| |
| |
| return seed ^ (hash(value) + 0x9e3779b9 + (seed << 6) + (seed >> 2)) |
|
|
|
|
| def hash_source_files(hash_value, source_files): |
| for filename in source_files: |
| with open(filename) as file: |
| hash_value = update_hash(hash_value, file.read()) |
| return hash_value |
|
|
|
|
| def hash_build_arguments(hash_value, build_arguments): |
| for group in build_arguments: |
| if group: |
| for argument in group: |
| hash_value = update_hash(hash_value, argument) |
| return hash_value |
|
|
|
|
| class ExtensionVersioner(object): |
| def __init__(self): |
| self.entries = {} |
|
|
| def get_version(self, name): |
| entry = self.entries.get(name) |
| return None if entry is None else entry.version |
|
|
| def bump_version_if_changed(self, |
| name, |
| source_files, |
| build_arguments, |
| build_directory, |
| with_cuda, |
| is_python_module, |
| is_standalone): |
| hash_value = 0 |
| hash_value = hash_source_files(hash_value, source_files) |
| hash_value = hash_build_arguments(hash_value, build_arguments) |
| hash_value = update_hash(hash_value, build_directory) |
| hash_value = update_hash(hash_value, with_cuda) |
| hash_value = update_hash(hash_value, is_python_module) |
| hash_value = update_hash(hash_value, is_standalone) |
|
|
| entry = self.entries.get(name) |
| if entry is None: |
| self.entries[name] = entry = Entry(0, hash_value) |
| elif hash_value != entry.hash: |
| self.entries[name] = entry = Entry(entry.version + 1, hash_value) |
|
|
| return entry.version |
|
|