| #!/usr/bin/env python3 |
| # Copyright 2022 The Dawn 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, subprocess, sys |
| |
| from generator_lib import Generator, run_generator, FileRender |
| |
| |
| def get_git(): |
| return 'git.bat' if sys.platform == 'win32' else 'git' |
| |
| |
| def get_gitHash(dawnDir): |
| result = subprocess.run([get_git(), 'rev-parse', 'HEAD'], |
| stdout=subprocess.PIPE, |
| cwd=dawnDir) |
| if result.returncode == 0: |
| return result.stdout.decode('utf-8').strip() |
| # No hash was available (possibly) because the directory was not a git checkout. Dawn should |
| # explicitly handle its absenece and disable features relying on the hash, i.e. caching. |
| return '' |
| |
| |
| def get_gitHead(dawnDir): |
| return os.path.join(dawnDir, '.git', 'HEAD') |
| |
| |
| def gitExists(dawnDir): |
| return os.path.exists(get_gitHead(dawnDir)) |
| |
| |
| def unpackGitRef(packed, resolved): |
| with open(packed) as fin: |
| refs = fin.read().strip().split('\n') |
| |
| # Strip comments |
| refs = [ref.split(' ') for ref in refs if ref.strip()[0] != '#'] |
| |
| # Parse results which are in the format [<gitHash>, <refFile>] from previous step. |
| refs = [gitHash for (gitHash, refFile) in refs if refFile == resolved] |
| if len(refs) == 1: |
| with open(resolved, 'w') as fout: |
| fout.write(refs[0] + '\n') |
| return True |
| return False |
| |
| |
| def get_gitResolvedHead(dawnDir): |
| result = subprocess.run( |
| [get_git(), 'rev-parse', '--symbolic-full-name', 'HEAD'], |
| stdout=subprocess.PIPE, |
| cwd=dawnDir) |
| if result.returncode != 0: |
| raise Exception('Failed to execute git rev-parse to resolve git head.') |
| |
| resolved = os.path.join(dawnDir, '.git', |
| result.stdout.decode('utf-8').strip()) |
| |
| # Check a packed-refs file exists. If so, we need to potentially unpack and include it as a dep. |
| packed = os.path.join(dawnDir, '.git', 'packed-refs') |
| if os.path.exists(packed) and unpackGitRef(packed, resolved): |
| return [packed, resolved] |
| |
| if not os.path.exists(resolved): |
| raise Exception('Unable to resolve git HEAD hash file:', path) |
| return [resolved] |
| |
| |
| def compute_params(args): |
| return { |
| 'get_gitHash': lambda: get_gitHash(os.path.abspath(args.dawn_dir)), |
| } |
| |
| |
| class DawnVersionGenerator(Generator): |
| def get_description(self): |
| return 'Generates version dependent Dawn code. Currently regenerated dependent on git hash.' |
| |
| def add_commandline_arguments(self, parser): |
| parser.add_argument('--dawn-dir', |
| required=True, |
| type=str, |
| help='The Dawn root directory path to use') |
| |
| def get_dependencies(self, args): |
| dawnDir = os.path.abspath(args.dawn_dir) |
| if gitExists(dawnDir): |
| return [get_gitHead(dawnDir)] + get_gitResolvedHead(dawnDir) |
| return [] |
| |
| def get_file_renders(self, args): |
| params = compute_params(args) |
| |
| return [ |
| FileRender('dawn/common/Version.h', |
| 'src/dawn/common/Version_autogen.h', [params]), |
| ] |
| |
| |
| if __name__ == '__main__': |
| sys.exit(run_generator(DawnVersionGenerator())) |