-
Notifications
You must be signed in to change notification settings - Fork 3
/
build.py
142 lines (108 loc) · 3.71 KB
/
build.py
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import sys
import os
import platform
import shutil
import multiprocessing
# @TODO: lord have mercy
system = ""
bar = ""
executable_extension = ""
def check_system():
global system
global bar
global executable_extension
supported_systems = ["windows", "linux"]
system = platform.system().lower()
print(f"System: {system}\n")
assert system in supported_systems, f"System '{system}' is not supported\n"
if system == "linux":
bar = "/"
executable_extension = ""
elif system == "windows":
bar = "\\"
executable_extension = ".exe"
return
# ----- Helpers -----
def get_number_of_cores():
return multiprocessing.cpu_count()
# ----- Build -----
def build(system, configuration):
executable = f"premake5" + executable_extension
number_of_cores = get_number_of_cores()
print(f"(Python) Number of cores: {number_of_cores}")
assert os.system(f"ext{bar}{system}{bar}{executable} gmake2 && cd build && make config={configuration} -j{number_of_cores}") == 0
# Copy shared libs and executables to the same folder
shaders_src_dir = f"build{bar}{system}{bar}shaders"
shaders_dst_dir = f"build{bar}{system}{bar}magnolia{bar}shaders"
try:
shutil.copytree(shaders_src_dir, shaders_dst_dir, dirs_exist_ok=True)
except Exception as e:
print(f"Error copying folders: {e}")
return
# ----- Run -----
def run(system, configuration):
assert os.system(f"build{bar}{system}{bar}sprout{bar}sprout_{configuration}") == 0
return
# ----- Clean -----
def clean(configuration):
assert os.system(f"cd build && make clean config={configuration}") == 0
return
# ----- Format -----
def format():
os.system(f"find magnolia/src/ -iname *.hpp -o -iname *.cpp -o -iname *.h | xargs clang-format -i -style=file")
os.system(f"find sprout_editor/src/ -iname *.hpp -o -iname *.cpp -o -iname *.h | xargs clang-format -i -style=file")
return
# ----- Lint -----
def lint():
os.system(f"cppcheck --enable=warning,performance,portability,style,information --suppress=missingInclude --std=c++20 magnolia/src/**") == 0
return
# ----- Shaders -----
def shaders(system):
glslc_exe = "glslc" + executable_extension
shader_dir = f"sprout_editor{bar}assets{bar}shaders"
output_dir = f"build{bar}{system}{bar}shaders"
print("----- Compiling shaders -----")
if system == "linux":
os.system(f"mkdir -p {output_dir}")
else:
os.system(f"mkdir {output_dir} 2>NUL")
# Find all shader files
shader_files = [f for f in os.listdir(shader_dir) if f.endswith(".vert") or f.endswith(".frag")]
# Compile shaders
for shader_file in shader_files:
input_path = os.path.join(shader_dir, shader_file)
output_path = os.path.join(output_dir, f"{shader_file}.spv")
include_path = "sprout_editor/assets/shaders"
print(f"Compiling {input_path}")
# @TODO: we cant use -O flags to optimize yet. Some data (for example the descriptor binding name) is still
# needed to set uniform variables.
assert os.system(f"ext{bar}{system}{bar}{glslc_exe} -I{include_path} {input_path} -o {output_path}") == 0
return
def main():
# Check for system support
check_system()
format()
if len(sys.argv) == 2:
configuration = str(sys.argv[1])
shaders(system)
lint()
build(system, configuration)
run(system, configuration)
elif len(sys.argv) < 3:
print("Usage: <command> <configuration>")
else:
command = str(sys.argv[1])
configuration = str(sys.argv[2])
if command == "build":
shaders(system)
lint()
build(system, configuration)
elif command == "run":
run(system, configuration)
elif command == "clean":
clean(configuration)
elif command == "lint":
lint()
else:
print(f"Invalid command: '{command}'")
main()