-- Copyright Epic Games, Inc. All Rights Reserved. -------------------------------------------------------------------------------- local function _exec(cmd, ...) print("--", cmd, ...) local ret = os.execv(cmd, {...}) print() return ret end -------------------------------------------------------------------------------- local function _build(arch, debug, config_args) variant = debug and "debug" or "release" local ret = _exec( "xmake", "config", "--yes", "--clean", "--mode="..variant, "--arch="..arch, config_args) if ret > 0 then raise("Failed to configure xmake") end ret = _exec("xmake", "clean", "--yes", "zenserver") if ret > 0 then raise("Clean failed") end ret = _exec("xmake", "build", "--yes", "zenserver") if ret > 0 then raise("Build failed") end end -------------------------------------------------------------------------------- local function _zip(zip_path, ...) os.tryrm(zip_path) import("detect.tools.find_7z") local cmd = find_7z() if cmd then -- A ./ prefix makes 7z ignore the directory structure input_paths = {} for _, input_path in ipairs({...}) do input_path = path.relative(input_path, ".") if input_path:sub(2,2) ~= ":" then input_path = "./"..input_path end table.insert(input_paths, input_path) end local ret = _exec("7z", "a", zip_path, table.unpack(input_paths)) if ret > 0 then raise("Received error from 7z") end return end print("7z not found") import("detect.tools.find_zip") cmd = find_zip() if cmd then local ret = _exec("zip", "--junk-paths", zip_path, ...) if ret > 0 then raise("Received error from zip") end return end print("zip not found") raise("Unable to find a suitable zip tool") end -------------------------------------------------------------------------------- local function _find_vcpkg_binary(triple, port, binary) import("detect.sdks.find_vcpkgdir") local root_dir = find_vcpkgdir() if root_dir == nil or root_dir == "" then raise("Unable to find vcpkg root directory") end bin_path = root_dir.."/installed/"..triple.."/tools/"..port.."/"..binary if not os.isfile(bin_path) then raise("Unable to locate vcpkg tool "..bin_path) end return bin_path end -------------------------------------------------------------------------------- local function main_windows() import("core.base.option") zip_path = "build/zenserver-win64.zip" config_args = nil if option.get("withtrace") then zip_path = "build/zenserver-trace-win64.zip" config_args = "--zentrace=yes" end _build("x64", false, config_args) local crashpad_handler_path = _find_vcpkg_binary( "x64-windows-static", "sentry-native", "crashpad_handler.exe") _zip( zip_path, "build/windows/x64/release/zenserver.exe", "build/windows/x64/release/zenserver.pdb", crashpad_handler_path) end -------------------------------------------------------------------------------- local function main_mac() -- Build and universalify _build("x86_64", false, "--target_minver=10.15") _build("arm64", false, "--target_minver=10.15") os.mkdir("build/macosx/universal/release/") local ret = _exec( "lipo", "-create", "-output", "build/macosx/universal/release/zenserver", "build/macosx/x86_64/release/zenserver", "build/macosx/arm64/release/zenserver" ) if ret > 0 then raise("Failed creating univeral binary") end -- At the time of writing vcpkg does not support sentry-native on arm64. Once -- it does we can create a univeral binary for this. For now just bundle x64 local crashpad_handler_path = _find_vcpkg_binary( "x64-osx", "sentry-native", "crashpad_handler") -- Zip _zip( "build/zenserver-macos.zip", "build/macosx/universal/release/zenserver", crashpad_handler_path) end -------------------------------------------------------------------------------- local function main_linux() _build("x86_64") -- Crashpad handler does not exist for Linux local crashpad_handler_path = nil --[[ local crashpad_handler_path = _find_vcpkg_binary( "x64-linux", "sentry-native", "crashpad_handler") --]] _zip( "build/zenserver-linux.zip", "build/linux/x86_64/release/zenserver", crashpad_handler_path) end -------------------------------------------------------------------------------- function main() if is_host("windows") then return main_windows() end if is_host("mac") then return main_mac() end if is_host("linux") then return main_linux() end raise("'xmake bundle' not currently supported on this platform") end