-
Notifications
You must be signed in to change notification settings - Fork 2
/
re-edit.py.in
executable file
·122 lines (102 loc) · 4.16 KB
/
re-edit.py.in
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/usr/bin/env python3
# Copyright (c) 2022 pongasoft
#
# 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.
#
# @author Yan Pujante
import argparse
import sys
if sys.hexversion < 0x03070000:
print("You must use python version 3.7+")
sys.exit(1)
generator_is_multi_config = @python_GENERATOR_IS_MULTI_CONFIG@
cmake_single_config_build_type = '@CMAKE_BUILD_TYPE@'
parser = argparse.ArgumentParser(allow_abbrev=False,
usage=f're-edit.py [-hnvbdr] <command> [<command> ...] [-- [native-options]]',
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog=f'''
Commands
---- Main commands ----
clean : clean all builds
build : build the tool
test : run the tests for the tool
archive : create an archive containing the tool
---- CMake target ----
<command> : Any unknown <command> is treated as a cmake target
--- Native options ----
Pass remaining options to the native tool (ex: -- -j 8 for parallel build)
''')
parser.add_argument("-n", "--dry-run", help="Dry run (prints what it is going to do)", action="store_true",
dest="dry_run")
parser.add_argument("-v", "--verbose", help="Verbose build", action="store_true")
parser.add_argument("-b", "--banner", help="Display a banner before every command", action="store_true")
parser.add_argument("-d", "--debug", help="use Debug build config", action="store_true")
parser.add_argument("-r", "--release", help="use Release build config", action="store_true")
parser.add_argument('command', help='See "Commands" section', nargs=argparse.REMAINDER)
args = parser.parse_args()
# determines '--' position
commands = args.command
native_tool_options = []
pos = next((i for i, x in enumerate(commands) if x == '--'), -1)
if pos > -1:
commands = args.command[:pos]
native_tool_options = args.command[pos:]
if not commands:
parser.print_help()
exit(0)
available_commands = {
'clean': 'clean',
'build': 're-edit',
'test': 'run_tests',
'archive': 'create_archive'
}
cmake_verbose = [] if not args.verbose else ['--verbose']
if args.release and args.debug:
print('Conflicting options (-r and -d) used')
exit(1)
if generator_is_multi_config:
config = 'Release' if args.release else 'Debug'
else:
config = 'Release' if args.release else 'Debug' if args.debug else cmake_single_config_build_type
if cmake_single_config_build_type != config:
print(f'Single Config Build is [{cmake_single_config_build_type}]... cannot build in [{config}] mode')
exit(1)
cmake_config = ['--config', config]
step = 0
for command in commands:
step += 1
if args.banner:
if step > 1:
print("")
print("")
print("=============================================================")
print("==")
print(f"== Step {step} : {command}")
print("==")
print("=============================================================")
if command in available_commands:
cmake_target = available_commands[command]
else:
cmake_target = command
cmake_command = ['cmake', '--build', '.', *cmake_verbose, *cmake_config, '--target', cmake_target, *native_tool_options]
if args.dry_run:
print(' '.join(cmake_command))
else:
import os
import subprocess
this_script_root_dir = os.path.dirname(os.path.realpath(sys.argv[0]))
cp = subprocess.run(cmake_command, cwd=this_script_root_dir)
if cp.returncode != 0:
args = ' '.join(cp.args)
print(f'Error: Command "{command}" [{args}] failed with error code {cp.returncode}', file=sys.stderr)
exit(cp.returncode)