diff --git a/build_scripts/generate_project_files.py b/build_scripts/generate_project_files.py index 69c012ea0..26db80168 100644 --- a/build_scripts/generate_project_files.py +++ b/build_scripts/generate_project_files.py @@ -2,78 +2,97 @@ import shutil import sys import subprocess -import pathlib - -# Define some paths using pathlib. A cross-platform way to handle slashes. -path_binaries = pathlib.Path("binaries") -path_binaries_data = pathlib.Path("binaries/data") -path_binaries_models = pathlib.Path("binaries/project/models") -path_binaries_environment = pathlib.Path("binaries/project/environment") -path_binaries_music = pathlib.Path("binaries/project/music") -path_binaries_height_maps = pathlib.Path("binaries/project/height_maps") -path_binaries_materials = pathlib.Path("binaries/project/materials") -path_third_party_lib_dx = pathlib.Path("third_party/libraries/dxcompiler.dll") -path_third_party_lib_fmod = pathlib.Path("third_party/libraries/fmod.dll") -path_third_party_lib_fmod_debug = pathlib.Path("third_party/libraries/fmodL.dll") -path_assets_models = pathlib.Path("assets/models") -path_assets_environment = pathlib.Path("assets/environment") -path_assets_music = pathlib.Path("assets/music") -path_assets_height_maps = pathlib.Path("assets/height_maps") -path_assets_materials = pathlib.Path("assets/materials") - -# Define a function to check if a path represents a directory, even if it doesn't exist. +from pathlib import Path + +paths = { + "binaries": { + "data": Path("binaries/data"), + "models": Path("binaries/project/models"), + "environment": Path("binaries/project/environment"), + "music": Path("binaries/project/music"), + "height_maps": Path("binaries/project/height_maps"), + "materials": Path("binaries/project/materials"), + }, + "third_party_libs": { + "dx": Path("third_party/libraries/dxcompiler.dll"), + "fmod": Path("third_party/libraries/fmod.dll"), + "fmod_debug": Path("third_party/libraries/fmodL.dll"), + }, + "assets": { + "models": Path("assets/models"), + "environment": Path("assets/environment"), + "music": Path("assets/music"), + "height_maps": Path("assets/height_maps"), + "materials": Path("assets/materials"), + }, +} + + def is_directory(path): - if not os.path.exists(path): - return os.path.splitext(path)[1] == "" - return os.path.isdir(path) + if not os.path.exists(path): + return os.path.splitext(path)[1] == "" + return os.path.isdir(path) + -# Define a recursive copy function which can copy directories and files as well as create any directories that don't exist. def copy(source, destination): - # copy file to directory - if os.path.isfile(source) and is_directory(destination): - print("Copying file \"" + str(source) + "\" to directory \"" + str(destination) + "\"...") - shutil.copy(source, destination) - # copy directory to directory - elif is_directory(source) and is_directory(destination): - print("Copying directory \"" + str(source) + "\" to directory \"" + str(destination) + "\"...") - if os.path.exists(destination): #copytree requires that the destination directory doesn't already exist. - shutil.rmtree(destination) - shutil.copytree(source, destination) - else: - print("Error: " + str(source) + " and " + str(destination) + " are not compatible.") - sys.exit(1) - -# 1. Extract third-party libraries (that the project will link to) -print("1. Extracting third-party dependencies...") -if sys.argv[1] == "vs2022": # windows - os.system("build_scripts\\7z.exe e third_party\\libraries\\libraries.7z -othird_party\\libraries\\ -aoa") -else: # linux - os.system("7za e third_party/libraries/libraries.7z -othird_party/libraries/ -aoa") - -# 2. Create binaries folder -print("\n2. Copying required data to the binaries directory..") -copy("data", path_binaries_data) - -# 3. Copy engine DLLs to the binary directory -print("\n3. Copying required DLLs to the binary directory...") -copy(path_third_party_lib_dx, path_binaries) -copy(path_third_party_lib_fmod, path_binaries) -copy(path_third_party_lib_fmod_debug, path_binaries) - -# 4. Copy some assets to the project directory -print("\n4. Copying some assets to the project directory...") -copy(path_assets_models, path_binaries_models) -copy(path_assets_environment, path_binaries_environment) -copy(path_assets_music, path_binaries_music) -copy(path_assets_height_maps, path_binaries_height_maps) -copy(path_assets_materials, path_binaries_materials) - -# 5. Generate project files -print("\n5. Generating project files...") -if sys.argv[1] == "vs2022": # windows - subprocess.Popen("build_scripts\\premake5.exe --file=build_scripts\\premake.lua " + sys.argv[1] + " " + sys.argv[2], shell=True).communicate() -else: # Linux - subprocess.Popen("premake5 --file=build_scripts/premake.lua " + sys.argv[1] + " " + sys.argv[2], shell=True).communicate() - -# Exit -sys.exit(0) + if os.path.isfile(source) and is_directory(destination): + print(f"Copying file \"{source}\" to directory \"{destination}\"...") + shutil.copy(source, destination) + elif is_directory(source) and is_directory(destination): + print(f"Copying directory \"{source}\" to directory \"{destination}\"...") + if os.path.exists(destination): + shutil.rmtree(destination) + shutil.copytree(source, destination) + else: + print(f"Error: {source} and {destination} are not compatible.") + sys.exit(1) + + +def extract_third_party_dependencies(): + print("1. Extracting third-party dependencies...") + cmd = ( + "build_scripts\\7z.exe e third_party\\libraries\\libraries.7z -othird_party\\libraries\\ -aoa" + if sys.argv[1] == "vs2022" + else "7za e third_party/libraries/libraries.7z -othird_party/libraries/ -aoa" + ) + os.system(cmd) + + +def create_binaries_folder(): + print("\n2. Copying required data to the binaries directory..") + copy("data", paths["binaries"]["data"]) + + +def copy_dlls(): + print("\n3. Copying required DLLs to the binary directory...") + for lib in paths["third_party_libs"].values(): + copy(lib, Path("binaries")) + + +def copy_assets(): + print("\n4. Copying some assets to the project directory...") + for asset_type, asset_path in paths["assets"].items(): + copy(asset_path, paths["binaries"][asset_type]) + + +def generate_project_files(): + print("\n5. Generating project files...") + cmd = ( + f"build_scripts\\premake5.exe --file=build_scripts\\premake.lua {sys.argv[1]} {sys.argv[2]}" + if sys.argv[1] == "vs2022" + else f"premake5 --file=build_scripts/premake.lua {sys.argv[1]} {sys.argv[2]}" + ) + subprocess.Popen(cmd, shell=True).communicate() + + +def main(): + extract_third_party_dependencies() + create_binaries_folder() + copy_dlls() + copy_assets() + generate_project_files() + sys.exit(0) + + +if __name__ == "__main__": + main() diff --git a/generate_vs2022_d3d11.py b/generate_vs2022_d3d11.py index 34af88625..99a9f11dc 100644 --- a/generate_vs2022_d3d11.py +++ b/generate_vs2022_d3d11.py @@ -1,9 +1,16 @@ import os import subprocess import sys -# change working directory to script directory -os.chdir(os.path.dirname(__file__)) -# run script -subprocess.Popen("python build_scripts/generate_project_files.py vs2022 d3d11").communicate() -# exit -sys.exit(0) +from pathlib import Path + +def main(): + script_dir = Path(__file__).parent + os.chdir(script_dir) + + script = script_dir / "build_scripts" / "generate_project_files.py" + subprocess.Popen([sys.executable, str(script), "vs2022", "d3d11"]).communicate() + + sys.exit(0) + +if __name__ == "__main__": + main() diff --git a/generate_vs2022_d3d12.py b/generate_vs2022_d3d12.py index 33a5e3798..73b37e5b8 100644 --- a/generate_vs2022_d3d12.py +++ b/generate_vs2022_d3d12.py @@ -1,9 +1,16 @@ import os import subprocess import sys -# change working directory to script directory -os.chdir(os.path.dirname(__file__)) -# run script -subprocess.Popen("python build_scripts/generate_project_files.py vs2022 d3d12").communicate() -# exit -sys.exit(0) +from pathlib import Path + +def main(): + script_dir = Path(__file__).parent + os.chdir(script_dir) + + script = script_dir / "build_scripts" / "generate_project_files.py" + subprocess.Popen([sys.executable, str(script), "vs2022", "d3d12"]).communicate() + + sys.exit(0) + +if __name__ == "__main__": + main() diff --git a/generate_vs2022_vulkan.py b/generate_vs2022_vulkan.py index e68d7a041..9657c7301 100644 --- a/generate_vs2022_vulkan.py +++ b/generate_vs2022_vulkan.py @@ -1,9 +1,16 @@ import os import subprocess import sys -# change working directory to script directory -os.chdir(os.path.dirname(__file__)) -# run script -subprocess.Popen("python build_scripts/generate_project_files.py vs2022 vulkan").communicate() -# exit -sys.exit(0) +from pathlib import Path + +def main(): + script_dir = Path(__file__).parent + os.chdir(script_dir) + + script = script_dir / "build_scripts" / "generate_project_files.py" + subprocess.Popen([sys.executable, str(script), "vs2022", "vulkan"]).communicate() + + sys.exit(0) + +if __name__ == "__main__": + main()