summary refs log tree commit diff stats
path: root/tools/ci_generate.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tools/ci_generate.nim')
-rw-r--r--tools/ci_generate.nim130
1 files changed, 104 insertions, 26 deletions
diff --git a/tools/ci_generate.nim b/tools/ci_generate.nim
index bfed8d88f..46bc39470 100644
--- a/tools/ci_generate.nim
+++ b/tools/ci_generate.nim
@@ -1,6 +1,6 @@
 ##[
 avoid code duplication in CI pipelines.
-For now, this is only used for openbsd, but there is a lot of other code
+For now, this is only used for openbsd + freebsd, but there is a lot of other code
 duplication that could be removed.
 
 ## usage
@@ -10,22 +10,15 @@ nim r tools/ci_generate.nim
 ```
 ]##
 
-import std/strformat
+import std/[strformat, os]
 
-proc genCIopenbsd(batch: int, num: int): string =
+const doNotEdit = "DO NO EDIT DIRECTLY! auto-generated by `nim r tools/ci_generate.nim`"
+proc genCiBsd(header: string, batch: int, num: int): string =
   result = fmt"""
-## do not edit directly; auto-generated by `nim r tools/ci_generate.nim`
+## {doNotEdit}
+
+{header}
 
-image: openbsd/latest
-packages:
-- gmake
-- sqlite3
-- node
-- boehm-gc
-- pcre
-- sfml
-- sdl2
-- libffi
 sources:
 - https://github.com/nim-lang/Nim
 environment:
@@ -33,31 +26,116 @@ environment:
   CC: /usr/bin/clang
 tasks:
 - setup: |
+    set -e
     cd Nim
-    git clone --depth 1 -q https://github.com/nim-lang/csources.git
-    gmake -C csources -j $(sysctl -n hw.ncpuonline)
-    bin/nim c koch
+    . ci/funs.sh && nimBuildCsourcesIfNeeded
     echo 'export PATH=$HOME/Nim/bin:$PATH' >> $HOME/.buildenv
 - test: |
+    set -e
     cd Nim
-    if ! ./koch runCI; then
-      nim c -r tools/ci_testresults.nim
-      exit 1
-    fi
+    . ci/funs.sh && nimInternalBuildKochAndRunCI
 triggers:
 - action: email
   condition: failure
   to: Andreas Rumpf <rumpf_a@web.de>
 """
 
+proc genBuildExtras(echoRun, koch, nim: string): string =
+  result = fmt"""
+{echoRun} {nim} c --noNimblePath --skipUserCfg --skipParentCfg --hints:off koch
+{echoRun} {koch} boot -d:release --skipUserCfg --skipParentCfg --hints:off
+{echoRun} {koch} tools --skipUserCfg --skipParentCfg --hints:off
+"""
+
+proc genWindowsScript(buildAll: bool): string =
+  result = fmt"""
+@echo off
+rem {doNotEdit}
+rem Build development version of the compiler; can be rerun safely
+rem bare bones version of ci/funs.sh adapted for windows.
+
+rem Read in some common shared variables (shared with other tools),
+rem see https://stackoverflow.com/questions/3068929/how-to-read-file-contents-into-a-variable-in-a-batch-file
+for /f "delims== tokens=1,2" %%G in (config/build_config.txt) do set %%G=%%H
+SET nim_csources=bin\nim_csources_%nim_csourcesHash%.exe
+echo "building from csources: %nim_csources%"
+
+if not exist %nim_csourcesDir% (
+  git clone -q --depth 1 -b %nim_csourcesBranch% %nim_csourcesUrl% %nim_csourcesDir%
+)
+
+if not exist %nim_csources% (
+  cd %nim_csourcesDir%
+  git checkout %nim_csourcesHash%
+  echo "%PROCESSOR_ARCHITECTURE%"
+  if "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
+    SET ARCH=64
+  )
+  CALL build.bat
+  cd ..
+  copy /y bin\nim.exe  %nim_csources%
+)
+"""
+
+  if buildAll:
+    result.add genBuildExtras("", "koch", r"bin\nim.exe")
+
+proc genPosixScript(): string =
+  result = fmt"""
+#!/bin/sh
+# {doNotEdit}
+
+# build development version of the compiler; can be rerun safely.
+# arguments can be passed, e.g.:
+# CC=gcc ucpu=amd64 uos=darwin
+
+set -u # error on undefined variables
+set -e # exit on first error
+
+. ci/funs.sh
+nimBuildCsourcesIfNeeded "$@"
+
+{genBuildExtras("echo_run", "./koch", "bin/nim")}
+"""
+
 proc main()=
-  let num = 3
+  let dir = ".builds"
+  # not too large to be resource friendly, refs bug #17107
+  let num = 2
     # if you reduce this, make sure to remove files that shouldn't be generated,
-    # or better, do the cleanup logic here eg: `rm .builds/openbsd_*`
+    # or better, do the cleanup logic here e.g.: `rm .builds/openbsd_*`
+  let headerFreebsd = """
+# see https://man.sr.ht/builds.sr.ht/compatibility.md#freebsd
+image: freebsd/latest
+packages:
+- databases/sqlite3
+- devel/boehm-gc-threaded
+- devel/pcre
+- devel/sdl20
+- devel/sfml
+- www/node
+- devel/gmake
+"""
+
+  let headerOpenbsd = """
+image: openbsd/latest
+packages:
+- gmake
+- sqlite3
+- node
+- boehm-gc
+- pcre
+- sfml
+- sdl2
+- libffi
+"""
+
   for i in 0..<num:
-    let file = fmt".builds/openbsd_{i}.yml"
-    let code = genCIopenbsd(i, num)
-    writeFile(file, code)
+    writeFile(dir / fmt"openbsd_{i}.yml", genCiBsd(headerOpenbsd, i, num))
+  writeFile(dir / "freebsd.yml", genCiBsd(headerFreebsd, 0, 1))
+  writeFile("build_all.sh", genPosixScript())
+  writeFile("build_all.bat", genWindowsScript(buildAll = true))
+  writeFile("ci/build_autogen.bat", genWindowsScript(buildAll = false))
 
 when isMainModule:
   main()