-- Copyright Epic Games, Inc. All Rights Reserved. target("zenserver") set_kind("binary") if enable_unity then add_rules("c++.unity_build", {batchsize = 4}) end add_deps("zencore", "zencompute", "zenhttp", "zennet", "zenremotestore", "zenstore", "zentelemetry", "zenutil") if is_plat("windows") then add_deps("zenvfs") end add_headerfiles("**.h") add_rules("utils.bin2c", {extensions = {".zip"}}) add_files("**.cpp") add_files("frontend/html.zip") add_files("zenserver.cpp", {unity_ignored = true }) if is_plat("linux") and not (get_config("toolchain") or ""):find("clang") then -- GCC false positives in deeply inlined code (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100137) add_files("storage/projectstore/httpprojectstore.cpp", {force = {cxxflags = "-Wno-stringop-overflow"} }) add_files("storage/storageconfig.cpp", {force = {cxxflags = "-Wno-array-bounds"} }) end add_includedirs(".") set_symbols("debug") add_deps("protozero", "asio", "cxxopts") add_deps("sol2") add_packages("http_parser") add_packages("json11") add_packages("lua") add_packages("consul") add_packages("minio") add_packages("oidctoken") add_packages("nomad") if has_config("zenmimalloc") then add_packages("mimalloc") end if has_config("zensentry") then add_packages("sentry-native") end if has_config("zenhorde") then add_deps("zenhorde") end if has_config("zennomad") then add_deps("zennomad") end if is_mode("release") then set_optimize("fastest") end if is_plat("windows") then add_ldflags("/subsystem:console,5.02") add_ldflags("/MANIFEST:EMBED") add_ldflags("/LTCG") add_files("zenserver.rc") add_cxxflags("/bigobj") add_links("delayimp", "projectedfslib") add_ldflags("/delayload:ProjectedFSLib.dll") else remove_files("windows/**") end if is_plat("macosx") then add_ldflags("-framework CoreFoundation") add_ldflags("-framework CoreGraphics") add_ldflags("-framework CoreText") add_ldflags("-framework Foundation") add_ldflags("-framework Security") add_ldflags("-framework SystemConfiguration") end on_load(function(target) local html_dir = path.join(os.projectdir(), "src/zenserver/frontend/html") local zip_path = path.join(os.projectdir(), "src/zenserver/frontend/html.zip") -- Check if zip needs regeneration local need_update = not os.isfile(zip_path) if not need_update then local zip_mtime = os.mtime(zip_path) for _, file in ipairs(os.files(path.join(html_dir, "**"))) do if os.mtime(file) > zip_mtime then need_update = true break end end end if need_update then print("Regenerating frontend zip...") os.tryrm(zip_path) import("detect.tools.find_7z") local cmd_7z = find_7z() if cmd_7z then os.execv(cmd_7z, {"a", "-mx0", zip_path, path.join(html_dir, ".")}) else import("detect.tools.find_zip") local zip_cmd = find_zip() if zip_cmd then local oldir = os.cd(html_dir) os.execv(zip_cmd, {"-r", "-0", zip_path, "."}) os.cd(oldir) else raise("Unable to find a suitable zip tool (need 7z or zip)") end end end end) -- to work around some unfortunate Ctrl-C behaviour on Linux/Mac due to -- our use of setsid() at startup we pass in `--no-detach` to zenserver -- ensure that it recieves signals when the user requests termination on_run(function(target) -- the following is roughly cribbed from xmake/actions/run/xmake.lua -- it would be nicer if we had the option of amending the arguments -- via before_run for instance, but I can't figure out a way to do that import("core.base.option") -- get the run directory of target local rundir = target:rundir() -- get the absolute target file path local targetfile = path.absolute(target:targetfile()) -- get run arguments local args = table.wrap(option.get("arguments") or target:get("runargs")) table.insert(args, "--detach=false") -- debugging? if option.get("debug") then debugger.run(targetfile, args, {curdir = rundir}) else os.execv(targetfile, args, {curdir = rundir, detach = option.get("detach")}) end end) after_build(function (target) local function copy_if_newer(src_file, dst_file, file_description) if not os.exists(src_file) then print("Source file '" .. src_file .. "' does not exist, cannot copy " .. file_description) return end local should_copy = false if not os.exists(dst_file) then should_copy = true else local src_size = os.filesize(src_file) local dst_size = os.filesize(dst_file) local src_mtime = os.mtime(src_file) local dst_mtime = os.mtime(dst_file) if src_size ~= dst_size or src_mtime > dst_mtime then should_copy = true end end if should_copy then os.cp(src_file, dst_file) print("Copied '" .. file_description .. "' to output directory") end end if has_config("zensentry") then local pkg = target:pkg("sentry-native") if pkg then local installdir = pkg:installdir() local crashpad_handler = "crashpad_handler" if is_plat("windows") then crashpad_handler = "crashpad_handler.exe" end local crashpad_handler_path = path.join(installdir, "bin/" .. crashpad_handler) copy_if_newer(crashpad_handler_path, path.join(target:targetdir(), crashpad_handler), crashpad_handler) if is_plat("windows") then local crashpad_wer_path = path.join(installdir, "bin/crashpad_wer.dll") copy_if_newer(crashpad_wer_path, path.join(target:targetdir(), "crashpad_wer.dll"), "crashpad_wer.dll") end end end local consul_pkg = target:pkg("consul") if consul_pkg then local installdir = consul_pkg:installdir() local consul_bin = "consul" if is_plat("windows") then consul_bin = "consul.exe" end copy_if_newer(path.join(installdir, "bin", consul_bin), path.join(target:targetdir(), consul_bin), consul_bin) end local minio_pkg = target:pkg("minio") if minio_pkg then local installdir = minio_pkg:installdir() local minio_bin = "minio" if is_plat("windows") then minio_bin = "minio.exe" end copy_if_newer(path.join(installdir, "bin", minio_bin), path.join(target:targetdir(), minio_bin), minio_bin) end local oidctoken_pkg = target:pkg("oidctoken") if oidctoken_pkg then local installdir = oidctoken_pkg:installdir() local oidctoken_bin = "OidcToken" if is_plat("windows") then oidctoken_bin = "OidcToken.exe" end copy_if_newer(path.join(installdir, "bin", oidctoken_bin), path.join(target:targetdir(), oidctoken_bin), oidctoken_bin) end local nomad_pkg = target:pkg("nomad") if nomad_pkg then local installdir = nomad_pkg:installdir() local nomad_bin = "nomad" if is_plat("windows") then nomad_bin = "nomad.exe" end copy_if_newer(path.join(installdir, "bin", nomad_bin), path.join(target:targetdir(), nomad_bin), nomad_bin) end end)