From f01bb145b0f6bc85ccc43433eb043e66680246bd Mon Sep 17 00:00:00 2001 From: Mr_Goldberg Date: Tue, 16 Aug 2022 12:29:05 -0400 Subject: [PATCH] Faster CI build. --- .gitlab-ci.yml | 22 +------ generate_build_win_bat.py | 127 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+), 20 deletions(-) create mode 100644 generate_build_win_bat.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 115d1a86..67e3c130 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -69,27 +69,9 @@ build_windows: - 7za x protobuf_x86-windows-static.7z -oprotobuf_x86-windows-static - 7za x protobuf_x64-windows-static.7z -oprotobuf_x64-windows-static - 7za x sdk_standalone.7z -osdk_standalone - - DLL_FILES="$(ls dll/*.cpp | tr "\n" " ")"; sed "s|dll/\*.cpp|$DLL_FILES|g" -i *.bat - - DLL_FILES="$(ls detours/*.cpp | tr "\n" " ")"; sed "s|detours/\*.cpp|$DLL_FILES|g" -i *.bat - - DLL_FILES="$(ls overlay_experimental/*.cpp | tr "\n" " ")"; sed "s|overlay_experimental/\*.cpp|$DLL_FILES|g" -i *.bat - - DLL_FILES="$(ls overlay_experimental/windows/*.cpp | tr "\n" " ")"; sed "s|overlay_experimental/windows/\*.cpp|$DLL_FILES|g" -i *.bat - - DLL_FILES="$(ls ImGui/*.cpp | tr "\n" " ")"; sed "s|ImGui/\*.cpp|$DLL_FILES|g" -i *.bat - - DLL_FILES="$(ls ImGui/backends/imgui_impl_dx*.cpp | tr "\n" " ")"; sed "s|ImGui/backends/imgui_impl_dx\*.cpp|$DLL_FILES|g" -i *.bat - - DLL_FILES="$(ls overlay_experimental/System/*.cpp | tr "\n" " ")"; sed "s|overlay_experimental/System/\*.cpp|$DLL_FILES|g" -i *.bat - - DLL_FILES="$(ls dll/*.proto | tr "\n" " " | sed "s/.proto/.pb.cc/g")"; sed "s|dll/\*.cc|$DLL_FILES|g" -i *.bat - - DLL_FILES="$(ls steamclient_loader/*.cpp | tr "\n" " ")"; sed "s|steamclient_loader/\*.cpp|$DLL_FILES|g" -i *.bat - - sed "s| /MP12 | /MP4 |g" -i *.bat + - python generate_build_win_bat.py - export WINEDEBUG=-all - - wine cmd /c build_win_debug_experimental.bat - - mkdir debug_experimental - - mv steam_api.dll steam_api64.dll debug_experimental/ - - wine cmd /c build_win_release.bat - - mv debug_experimental release/ - - rm -f steamclient.dll steamclient64.dll - - wine cmd /c build_win_debug_experimental_steamclient.bat - - mkdir release/debug_experimental_steamclient - - mv steamclient.dll steamclient64.dll release/debug_experimental_steamclient/ - - cp Readme_debug.txt release/debug_experimental/Readme.txt + - wine cmd /c build_win_release_test.bat artifacts: paths: - release/ diff --git a/generate_build_win_bat.py b/generate_build_win_bat.py new file mode 100644 index 00000000..f24b6bc7 --- /dev/null +++ b/generate_build_win_bat.py @@ -0,0 +1,127 @@ +import os + +def files_from_dir(dir, extension, filter=[]): + out = [] + for f in os.listdir(dir): + if f.endswith(extension) and f not in filter: + out.append(os.path.join(dir, f)) + return out + +def convert_to_obj(files, obj_dir): + out = [] + for f in files: + out.append(os.path.join(obj_dir, os.path.splitext(os.path.basename(f))[0] + ".obj")) + return out + +def cl_line_obj(arguments, out_dir): + return "rmdir /S /Q {0}\nmkdir {0}\ncl /Fo:{0}/ /c {1}\n".format(out_dir, ' '.join(arguments)) + +def cl_line_link(arguments, linker_arguments): + return "cl /LD {} /link {}\n".format(' '.join(arguments), ' '.join(linker_arguments)) + +def cl_line_exe(arguments, linker_arguments): + return "cl {} /link {}\n".format(' '.join(arguments), ' '.join(linker_arguments)) + +jobs = 4 +normal_build_args = ["/EHsc", "/Ox", "/MP{}".format(jobs)] + +includes = ["ImGui", "overlay_experimental"] +includes_32 = list(map(lambda a: '/I{}'.format(a), ["%PROTOBUF_X86_DIRECTORY%\\include\\"] + includes)) +includes_64 = list(map(lambda a: '/I{}'.format(a), ["%PROTOBUF_X64_DIRECTORY%\\include\\"] + includes)) + +debug_build_args = [] +release_build_args = ["/DEMU_RELEASE_BUILD", "/DNDEBUG"] +steamclient_build_args = ["/DSTEAMCLIENT_DLL"] + +experimental_build_args = ["/DEMU_EXPERIMENTAL_BUILD", "/DCONTROLLER_SUPPORT", "/DEMU_OVERLAY"] +steamclient_experimental_build_args = experimental_build_args + steamclient_build_args + +normal_linker_libs = ["Iphlpapi.lib", "Ws2_32.lib", "rtlgenrandom.lib", "Shell32.lib"] +experimental_linker_libs = ["opengl32.lib", "Winmm.lib"] + normal_linker_libs +linker_32 = ['"%PROTOBUF_X86_LIBRARY%"'] +linker_64 = ['"%PROTOBUF_X64_LIBRARY%"'] + +controller_deps = ["controller/gamepad.c"] +imgui_deps = files_from_dir("ImGui", ".cpp") + ["ImGui/backends/imgui_impl_dx9.cpp", "ImGui/backends/imgui_impl_dx10.cpp", "ImGui/backends/imgui_impl_dx11.cpp", "ImGui/backends/imgui_impl_dx12.cpp", "ImGui/backends/imgui_impl_win32.cpp", "ImGui/backends/imgui_impl_vulkan.cpp", "ImGui/backends/imgui_impl_opengl3.cpp", "ImGui/backends/imgui_win_shader_blobs.cpp"] +proto_deps = list(map(lambda a: a.replace(".proto", ".pb.cc"), files_from_dir("dll", ".proto"))) +all_deps = proto_deps + files_from_dir("detours", ".cpp") + controller_deps + imgui_deps + files_from_dir("overlay_experimental/System", ".cpp") + +sc_different_deps = ["flat.cpp", "dll.cpp"] +steam_deps = files_from_dir("dll", ".cpp", sc_different_deps) +overlay_deps = files_from_dir("overlay_experimental", ".cpp") + files_from_dir("overlay_experimental/windows", ".cpp") +experimental_steam_deps = steam_deps + overlay_deps +sc_different_deps = list(map(lambda a: "dll/" + a, sc_different_deps)) + +regular_files = [] + +head = """@echo off +cd /d "%~dp0" +rmdir /S /Q release +mkdir release +mkdir release\experimental +mkdir release\experimental_steamclient +mkdir release\debug_experimental +mkdir release\debug_experimental_steamclient +call build_set_protobuf_directories.bat +""" + +head_32bit = """"%PROTOC_X86_EXE%" -I.\dll\ --cpp_out=.\dll\ .\dll\\net.proto +call build_env_x86.bat +cl dll/rtlgenrandom.c dll/rtlgenrandom.def +""" + +head_64bit = """"%PROTOC_X64_EXE%" -I.\dll\ --cpp_out=.\dll\ .\dll\\net.proto +call build_env_x64.bat +cl dll/rtlgenrandom.c dll/rtlgenrandom.def +""" + +footer = """ +copy Readme_release.txt release\Readme.txt +xcopy /s files_example\* release\\ +copy Readme_experimental.txt release\experimental\Readme.txt +copy Readme_debug.txt release\debug_experimental\Readme.txt +copy steamclient_loader\ColdClientLoader.ini release\experimental_steamclient\\ +call build_win_lobby_connect.bat +call build_win_find_interfaces.bat +""" + +out = head +out += head_32bit + +deps_folder = "deps" +sc_deps_folder = "deps_sc" + +def generate_common(include_arch, linker_arch, steam_api_name, steamclient_name): + out = "" + out += cl_line_obj(normal_build_args + release_build_args + include_arch + all_deps, deps_folder) + out += cl_line_link(normal_build_args + release_build_args + include_arch + steam_deps + sc_different_deps + ["deps/net.pb.obj"] + linker_arch + normal_linker_libs, ["/debug:none", "/OUT:release\\{}".format(steam_api_name)]) + + debug_full_args = normal_build_args + debug_build_args + experimental_build_args + include_arch + out += cl_line_obj(debug_full_args + experimental_steam_deps, sc_deps_folder) + + debug_full_dll_args = debug_full_args + sc_different_deps + convert_to_obj(all_deps, deps_folder) + convert_to_obj(experimental_steam_deps, sc_deps_folder) + linker_arch + experimental_linker_libs + out += cl_line_link(debug_full_dll_args, ["/OUT:release\debug_experimental\\{}".format(steam_api_name)]) + out += cl_line_link(steamclient_build_args + debug_full_dll_args, ["/OUT:release\debug_experimental_steamclient\\{}".format(steamclient_name)]) + + release_full_args = normal_build_args + release_build_args + experimental_build_args + include_arch + out += cl_line_obj(release_full_args + experimental_steam_deps, sc_deps_folder) + + release_full_dll_args = release_full_args + sc_different_deps + convert_to_obj(all_deps, deps_folder) + convert_to_obj(experimental_steam_deps, sc_deps_folder) + linker_arch + experimental_linker_libs + out += cl_line_link(release_full_dll_args, ["/debug:none", "/OUT:release\experimental\\{}".format(steam_api_name)]) + out += cl_line_link(steamclient_build_args + release_full_dll_args, ["/debug:none", "/OUT:release\experimental_steamclient\\{}".format(steamclient_name)]) + out += cl_line_link(release_build_args + experimental_build_args + ["steamclient.cpp"] + normal_build_args, ["/debug:none", "/OUT:release\experimental\\{}".format(steamclient_name)]) + return out + +out += generate_common(includes_32, linker_32, "steam_api.dll", "steamclient.dll") + +out += cl_line_exe(files_from_dir("steamclient_loader", ".cpp") + ["advapi32.lib", "user32.lib"] + normal_build_args, ["/debug:none", "/OUT:release\experimental_steamclient\steamclient_loader.exe"]) + +out += head_64bit +out += generate_common(includes_64, linker_64, "steam_api64.dll", "steamclient64.dll") + + +out += footer + + +with open("build_win_release_test.bat", "w") as f: + f.write(out)