Skip to content

Commit 579c19a

Browse files
committed
Merge pull request godotengine#99274 from shana/vsproj-calculate-dependencies
Use scons to calculate all the sources needed for vsproj generation.
2 parents d967bef + 84db024 commit 579c19a

File tree

2 files changed

+41
-65
lines changed

2 files changed

+41
-65
lines changed

methods.py

Lines changed: 41 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,6 +1012,30 @@ def format_key_value(v):
10121012
return v[0] if len(v) == 1 else f"{v[0]}={v[1]}"
10131013
return v
10141014

1015+
def get_dependencies(file, env, exts, headers, sources, others):
1016+
for child in file.children():
1017+
if isinstance(child, str):
1018+
child = env.File(x)
1019+
fname = ""
1020+
try:
1021+
fname = child.path
1022+
except AttributeError:
1023+
# It's not a file.
1024+
pass
1025+
1026+
if fname:
1027+
parts = os.path.splitext(fname)
1028+
if len(parts) > 1:
1029+
ext = parts[1].lower()
1030+
if ext in exts["sources"]:
1031+
sources += [fname]
1032+
elif ext in exts["headers"]:
1033+
headers += [fname]
1034+
elif ext in exts["others"]:
1035+
others += [fname]
1036+
1037+
get_dependencies(child, env, exts, headers, sources, others)
1038+
10151039
filtered_args = original_args.copy()
10161040

10171041
# Ignore the "vsproj" option to not regenerate the VS project on every build
@@ -1073,26 +1097,28 @@ def format_key_value(v):
10731097
sys.path.remove(tmppath)
10741098
sys.modules.pop("msvs")
10751099

1100+
extensions = {}
1101+
extensions["headers"] = [".h", ".hh", ".hpp", ".hxx", ".inc"]
1102+
extensions["sources"] = [".c", ".cc", ".cpp", ".cxx", ".m", ".mm", ".java"]
1103+
extensions["others"] = [".natvis", ".glsl", ".rc"]
1104+
10761105
headers = []
10771106
headers_dirs = []
1078-
for file in glob_recursive_2("*.h", headers_dirs):
1079-
headers.append(str(file).replace("/", "\\"))
1080-
for file in glob_recursive_2("*.hpp", headers_dirs):
1081-
headers.append(str(file).replace("/", "\\"))
1107+
for ext in extensions["headers"]:
1108+
for file in glob_recursive_2("*" + ext, headers_dirs):
1109+
headers.append(str(file).replace("/", "\\"))
10821110

10831111
sources = []
10841112
sources_dirs = []
1085-
for file in glob_recursive_2("*.cpp", sources_dirs):
1086-
sources.append(str(file).replace("/", "\\"))
1087-
for file in glob_recursive_2("*.c", sources_dirs):
1088-
sources.append(str(file).replace("/", "\\"))
1113+
for ext in extensions["sources"]:
1114+
for file in glob_recursive_2("*" + ext, sources_dirs):
1115+
sources.append(str(file).replace("/", "\\"))
10891116

10901117
others = []
10911118
others_dirs = []
1092-
for file in glob_recursive_2("*.natvis", others_dirs):
1093-
others.append(str(file).replace("/", "\\"))
1094-
for file in glob_recursive_2("*.glsl", others_dirs):
1095-
others.append(str(file).replace("/", "\\"))
1119+
for ext in extensions["others"]:
1120+
for file in glob_recursive_2("*" + ext, others_dirs):
1121+
others.append(str(file).replace("/", "\\"))
10961122

10971123
skip_filters = False
10981124
import hashlib
@@ -1156,58 +1182,13 @@ def format_key_value(v):
11561182
with open(f"{project_name}.vcxproj.filters", "w", encoding="utf-8", newline="\r\n") as f:
11571183
f.write(filters_template)
11581184

1159-
envsources = []
1160-
1161-
envsources += env.core_sources
1162-
envsources += env.drivers_sources
1163-
envsources += env.main_sources
1164-
envsources += env.modules_sources
1165-
envsources += env.scene_sources
1166-
envsources += env.servers_sources
1167-
if env.editor_build:
1168-
envsources += env.editor_sources
1169-
envsources += env.platform_sources
1170-
11711185
headers_active = []
11721186
sources_active = []
11731187
others_active = []
1174-
for x in envsources:
1175-
fname = ""
1176-
if isinstance(x, str):
1177-
fname = env.File(x).path
1178-
else:
1179-
# Some object files might get added directly as a File object and not a list.
1180-
try:
1181-
fname = env.File(x)[0].path
1182-
except Exception:
1183-
fname = x.path
1184-
pass
11851188

1186-
if fname:
1187-
fname = fname.replace("\\\\", "/")
1188-
parts = os.path.splitext(fname)
1189-
basename = parts[0]
1190-
ext = parts[1]
1191-
idx = fname.find(env["OBJSUFFIX"])
1192-
if ext in [".h", ".hpp"]:
1193-
headers_active += [fname]
1194-
elif ext in [".c", ".cpp"]:
1195-
sources_active += [fname]
1196-
elif idx > 0:
1197-
basename = fname[:idx]
1198-
if os.path.isfile(basename + ".h"):
1199-
headers_active += [basename + ".h"]
1200-
elif os.path.isfile(basename + ".hpp"):
1201-
headers_active += [basename + ".hpp"]
1202-
elif basename.endswith(".gen") and os.path.isfile(basename[:-4] + ".h"):
1203-
headers_active += [basename[:-4] + ".h"]
1204-
if os.path.isfile(basename + ".c"):
1205-
sources_active += [basename + ".c"]
1206-
elif os.path.isfile(basename + ".cpp"):
1207-
sources_active += [basename + ".cpp"]
1208-
else:
1209-
fname = os.path.relpath(os.path.abspath(fname), env.Dir("").abspath)
1210-
others_active += [fname]
1189+
get_dependencies(
1190+
env.File(f"#bin/godot{env['PROGSUFFIX']}"), env, extensions, headers_active, sources_active, others_active
1191+
)
12111192

12121193
all_items = []
12131194
properties = []

modules/SCsub

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ register_module_types = env.CommandNoCache(
6363
)
6464

6565

66-
vs_sources = []
6766
test_headers = []
6867
# libmodule_<name>.a for each active module.
6968
for name, path in env.module_list.items():
@@ -75,8 +74,6 @@ for name, path in env.module_list.items():
7574

7675
lib = env_modules.add_library("module_%s" % name, env.modules_sources)
7776
env.Prepend(LIBS=[lib])
78-
if env["vsproj"]:
79-
vs_sources += env.modules_sources
8077

8178
if env["tests"]:
8279
# Lookup potential headers in `tests` subfolder.
@@ -104,5 +101,3 @@ env.modules_sources = []
104101
env_modules.add_source_files(env.modules_sources, register_module_types)
105102
lib = env_modules.add_library("modules", env.modules_sources)
106103
env.Prepend(LIBS=[lib])
107-
if env["vsproj"]:
108-
env.modules_sources += vs_sources

0 commit comments

Comments
 (0)