Mercurial > games > semicongine
diff semiconginev2/build.nim @ 1218:56781cc0fc7c compiletime-tests
did: renamge main package
author | sam <sam@basx.dev> |
---|---|
date | Wed, 17 Jul 2024 21:01:37 +0700 |
parents | semicongine/build.nim@a3eb305bcac2 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semiconginev2/build.nim Wed Jul 17 21:01:37 2024 +0700 @@ -0,0 +1,179 @@ +# this should be used with nimscript + +import std/strformat +import std/os +import std/strutils + +include ./core/globals + +const BLENDER_CONVERT_SCRIPT = currentSourcePath().parentDir().parentDir().joinPath("tools/blender_gltf_converter.py") +const STEAMCMD_ZIP = currentSourcePath().parentDir().parentDir().joinPath("tools/steamcmd.zip") +const STEAMBUILD_DIR_NAME = "steam" + +var STEAMLIB: string +if defined(linux): + STEAMLIB = currentSourcePath().parentDir().parentDir().joinPath("libs/libsteam_api.so") +elif defined(windows): + STEAMLIB = currentSourcePath().parentDir().parentDir().joinPath("libs/steam_api.dll") +else: + raise newException(Exception, "Unsupported platform") + +proc semicongine_builddir*(buildname: string, builddir = "./build"): string = + assert projectName() != "", "Please specify project file as a commandline argument" + var platformDir = "unkown" + + if defined(linux): + platformDir = "linux" + elif defined(windows): + platformDir = "windows" + else: + raise newException(Exception, "Unsupported platform") + + return builddir / buildname / platformDir / projectName() + +proc semicongine_build_switches*(buildname: string, builddir = "./build") = + switch("experimental", "strictEffects") + switch("experimental", "strictFuncs") + switch("define", "nimPreviewHashRef") + if defined(linux): + switch("define", "VK_USE_PLATFORM_XLIB_KHR") + elif defined(windows): + switch("define", "VK_USE_PLATFORM_WIN32_KHR") + switch("app", "gui") + else: + raise newException(Exception, "Unsupported platform") + + switch("outdir", semicongine_builddir(buildname, builddir = builddir)) + switch("passL", "-Wl,-rpath,'$ORIGIN'") # adds directory of executable to dynlib search path + +proc semicongine_pack*(outdir: string, bundleType: string, resourceRoot: string, withSteam: bool) = + switch("define", "PACKAGETYPE=" & bundleType) + + assert resourceRoot.dirExists, &"Resource root '{resourceRoot}' does not exists" + + outdir.rmDir() + outdir.mkDir() + + echo "BUILD: Packing assets from '" & resourceRoot & "' into directory '" & outdir & "'" + let outdir_resources = joinPath(outdir, RESOURCEROOT) + if bundleType == "dir": + cpDir(resourceRoot, outdir_resources) + elif bundleType == "zip": + outdir_resources.mkDir() + for resourceDir in resourceRoot.listDirs(): + let outputfile = joinPath(outdir_resources, resourceDir.splitPath().tail & ".zip") + withdir resourceDir: + if defined(linux): + echo &"zip -r {relativePath(outputfile, resourceDir)} ." + exec &"zip -r {relativePath(outputfile, resourceDir)} ." + elif defined(windows): + echo &"powershell Compress-Archive * {relativePath(outputfile, resourceDir)}" + exec &"powershell Compress-Archive * {relativePath(outputfile, resourceDir)}" + else: + raise newException(Exception, "Unsupported platform") + elif bundleType == "exe": + switch("define", "BUILD_RESOURCEROOT=" & joinPath(getCurrentDir(), resourceRoot)) # required for in-exe packing of resources, must be absolute + if withSteam: + STEAMLIB.cpFile(outdir.joinPath(STEAMLIB.extractFilename)) + +proc semicongine_zip*(dir: string) = + withdir dir.parentDir: + let zipFile = dir.lastPathPart & ".zip" + if zipFile.fileExists: + zipFile.rmFile() + if defined(linux): + exec &"zip -r {dir.lastPathPart} {dir.lastPathPart}" + elif defined(windows): + exec &"powershell Compress-Archive * {dir.lastPathPart}" + else: + raise newException(Exception, "Unsupported platform") + + +# need this because fileNewer from std/os does not work in Nim VM +proc fileNewerStatic(file1, file2: string): bool = + assert file1.fileExists + assert file2.fileExists + when defined(linux): + let command = "/usr/bin/test " & file1 & " -nt " & file2 + let ex = gorgeEx(command) + return ex.exitCode == 0 + elif defined(window): + {.error "Resource imports not supported on windows for now".} + +proc import_meshes*(files: seq[(string, string)]) = + if files.len == 0: + return + + var args = @["--background", "--python", BLENDER_CONVERT_SCRIPT, "--"] + for (input, output) in files: + args.add input + args.add output + + exec("blender " & args.join(" ")) + +proc import_audio*(files: seq[(string, string)]) = + for (input, output) in files: + let command = "ffmpeg " & ["-y", "-i", input, "-ar", $AUDIO_SAMPLE_RATE, output].join(" ") + exec(command) + +proc semicongine_import_resource_file*(resourceMap: openArray[(string, string)]) = + when not defined(linux): + {.warning: "Resource files can only be imported on linux, please make sure that the required files are created by runing the build on a linux machine.".} + return + var meshfiles: seq[(string, string)] + var audiofiles: seq[(string, string)] + + for (target_rel, source_rel) in resourceMap: + let target = thisDir().joinPath(target_rel) + let source = thisDir().joinPath(source_rel) + if not source.fileExists: + raise newException(IOError, &"Not found: {source}") + if not target.fileExists or source.fileNewerStatic(target): + echo &"{target} is outdated" + if source.endsWith("blend"): + meshfiles.add (source, target) + elif source.endsWith("mp3") or source.endsWith("ogg") or source.endsWith("wav"): + audiofiles.add (source, target) + else: + raise newException(Exception, &"unkown file type: {source}") + target.parentDir().mkDir() + else: + echo &"{target} is up-to-date" + import_meshes meshfiles + import_audio audiofiles + + +# for steam-buildscript docs see https://partner.steamgames.com/doc/sdk/uploading +proc semicongine_steam_upload*(steamaccount, password, buildscript: string) = + let steamdir = thisDir().joinPath(STEAMBUILD_DIR_NAME) + if not dirExists(steamdir): + steamdir.mkDir + let zipFilename = STEAMCMD_ZIP.extractFilename + STEAMCMD_ZIP.cpFile(steamdir.joinPath(zipFilename)) + withDir(steamdir): + if defined(linux): + exec &"unzip {zipFilename}" + rmFile zipFilename + exec "steamcmd/steamcmd.sh +quit" # self-update steamcmd + elif defined(windows): + exec &"powershell Expand-Archive -LiteralPath {zipFilename} ." + rmFile zipFilename + exec "steamcmd/steamcmd.exe +quit" # self-update steamcmd + else: + raise newException(Exception, "Unsupported platform") + + var steamcmd: string + if defined(linux): + steamcmd = STEAMBUILD_DIR_NAME.joinPath("steamcmd").joinPath("steamcmd.sh") + elif defined(windows): + steamcmd = STEAMBUILD_DIR_NAME.joinPath("steamcmd").joinPath("steamcmd.exe") + else: + raise newException(Exception, "Unsupported platform") + let scriptPath = "..".joinPath("..").joinPath(buildscript) + exec &"./{steamcmd} +login \"{steamaccount}\" \"{password}\" +run_app_build {scriptPath} +quit" + +proc semicongine_sign_executable*(file: string) = + const SIGNTOOL_EXE = "C:/Program Files (x86)/Windows Kits/10/App Certification Kit/signtool.exe" + if not SIGNTOOL_EXE.fileExists: + raise newException(Exception, &"signtool.exe not found at ({SIGNTOOL_EXE}), please install the Windows SDK") + exec &"\"{SIGNTOOL_EXE}\" sign /a /tr http://timestamp.globalsign.com/tsa/r6advanced1 /fd SHA256 /td SHA256 {file}"