mode = ScriptMode.Verbose import std/os except commandLineParams ### Helper functions proc buildBinary(srcName: string, outName = os.lastPathPart(srcName), srcDir = "./", params = "", lang = "c") = if not dirExists "build": mkDir "build" # allow something like "nim nimbus --verbosity:0 --hints:off nimbus.nims" var extra_params = params when compiles(commandLineParams): for param in commandLineParams(): extra_params &= " " & param else: for i in 2 ..< paramCount(): extra_params &= " " & paramStr(i) let # Place build output in 'build' folder, even if name includes a longer path. cmd = "nim " & lang & " --out:build/" & outName & " " & extra_params & " " & srcDir & srcName & ".nim" exec(cmd) proc buildLibrary(name: string, srcDir = "./", params = "", `type` = "dynamic") = if not dirExists "build": mkDir "build" if `type` == "dynamic": let lib_name = ( when defined(windows): name & ".dll" elif defined(macosx): name & ".dylib" else: name & ".so" ) exec "nim c" & " --out:build/" & lib_name & " --threads:on --app:lib --opt:size --noMain --mm:refc --header --d:metrics " & "--nimMainPrefix:libstorage -d:noSignalHandler " & "-d:LeopardExtraCompilerFlags=-fPIC " & "-d:chronicles_runtime_filtering " & "-d:chronicles_log_level=TRACE " & params & " " & srcDir & name & ".nim" else: exec "nim c" & " --out:build/" & name & ".a --threads:on --app:staticlib --opt:size --noMain --mm:refc --header --d:metrics " & "--nimMainPrefix:libstorage -d:noSignalHandler " & "-d:LeopardExtraCompilerFlags=-fPIC " & "-d:chronicles_runtime_filtering " & "-d:chronicles_log_level=TRACE " & params & " " & srcDir & name & ".nim" proc test(name: string, outName = name, srcDir = "tests/", params = "", lang = "c") = buildBinary name, outName, srcDir, params exec "build/" & outName task storage, "build logos storage binary": buildBinary "codex", outname = "storage", params = "-d:chronicles_runtime_filtering -d:chronicles_log_level=TRACE" task toolsCirdl, "build tools/cirdl binary": buildBinary "tools/cirdl/cirdl" task testStorage, "Build & run Logos Storage tests": test "testCodex", outName = "testStorage", params = "-d:storage_enable_proof_failures=true" task testContracts, "Build & run Logos Storage Contract tests": test "testContracts" task testIntegration, "Run integration tests": buildBinary "codex", outName = "storage", params = "-d:chronicles_runtime_filtering -d:chronicles_log_level=TRACE -d:storage_enable_proof_failures=true" test "testIntegration" # use params to enable logging from the integration test executable # test "testIntegration", params = "-d:chronicles_sinks=textlines[notimestamps,stdout],textlines[dynamic] " & # "-d:chronicles_enabled_topics:integration:TRACE" task build, "build Logos Storage binary": storageTask() task test, "Run tests": testStorageTask() task testTools, "Run Tools tests": toolsCirdlTask() test "testTools" task testAll, "Run all tests (except for Taiko L2 tests)": testStorageTask() testContractsTask() testIntegrationTask() testToolsTask() task testTaiko, "Run Taiko L2 tests": storageTask() test "testTaiko" import strutils import os task coverage, "generates code coverage report": var (output, exitCode) = gorgeEx("which lcov") if exitCode != 0: echo " ************************** ⛔️ ERROR ⛔️ **************************" echo " ** ERROR: lcov not found, it must be installed to run code **" echo " ** coverage locally **" echo " *****************************************************************" quit 1 (output, exitCode) = gorgeEx("gcov --version") if output.contains("Apple LLVM"): echo " ************************* ⚠️ WARNING ⚠️ *************************" echo " ** WARNING: Using Apple's llvm-cov in place of gcov, which **" echo " ** emulates an old version of gcov (4.2.0) and therefore **" echo " ** coverage results will differ than those on CI (which **" echo " ** uses a much newer version of gcov). **" echo " *****************************************************************" var nimSrcs = " " for f in walkDirRec("codex", {pcFile}): if f.endswith(".nim"): nimSrcs.add " " & f.absolutePath.quoteShell() echo "======== Running Tests ======== " test "coverage", srcDir = "tests/", params = " --nimcache:nimcache/coverage -d:release -d:storage_enable_proof_failures=true" exec("rm nimcache/coverage/*.c") rmDir("coverage") mkDir("coverage") echo " ======== Running LCOV ======== " exec( "lcov --capture --keep-going --directory nimcache/coverage --output-file coverage/coverage.info" ) exec( "lcov --extract coverage/coverage.info --keep-going --output-file coverage/coverage.f.info " & nimSrcs ) echo " ======== Generating HTML coverage report ======== " exec("genhtml coverage/coverage.f.info --keep-going --output-directory coverage/report ") echo " ======== Coverage report Done ======== " task showCoverage, "open coverage html": echo " ======== Opening HTML coverage report in browser... ======== " if findExe("open") != "": exec("open coverage/report/index.html") task libstorageDynamic, "Generate bindings": var params = "" when compiles(commandLineParams): for param in commandLineParams(): if param.len > 0 and param.startsWith("-"): params.add " " & param let name = "libstorage" buildLibrary name, "library/", params, "dynamic" task libstorageStatic, "Generate bindings": var params = "" when compiles(commandLineParams): for param in commandLineParams(): if param.len > 0 and param.startsWith("-"): params.add " " & param let name = "libstorage" buildLibrary name, "library/", params, "static"