-- 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", "zenvfs") add_headerfiles("**.h") add_rules("utils.bin2c", {extensions = {".zip"}}) add_files("**.cpp") add_files("frontend/*.zip") add_files("zenserver.cpp", {unity_ignored = true }) add_includedirs(".") set_symbols("debug") add_deps("protozero", "asio", "cxxopts") add_deps("sol2") add_packages("json11") add_packages("lua") add_packages("consul") if has_config("zenmimalloc") then add_packages("mimalloc") end if has_config("zensentry") then add_packages("sentry-native") 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 -- 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 end)