Rename git to build
This commit is contained in:
parent
c3734587a1
commit
5b0a5ab146
10 changed files with 303 additions and 302 deletions
|
|
@ -4,4 +4,4 @@ Module that should import everything so that `nim doc --project nimtero/all` run
|
||||||
|
|
||||||
# TODO: make sure it does import everything.
|
# TODO: make sure it does import everything.
|
||||||
|
|
||||||
import "."/[cimport, git, types, plugin, compat]
|
import "."/[cimport, build, types, plugin, compat]
|
||||||
|
|
|
||||||
294
nimterop/build.nim
Normal file
294
nimterop/build.nim
Normal file
|
|
@ -0,0 +1,294 @@
|
||||||
|
import os, osproc, strformat, strutils
|
||||||
|
|
||||||
|
import "."/[compat]
|
||||||
|
|
||||||
|
proc execAction*(cmd: string, nostderr=false): string =
|
||||||
|
## Execute an external command - supported at compile time
|
||||||
|
##
|
||||||
|
## Checks if command exits successfully before returning. If not, an
|
||||||
|
## error is raised.
|
||||||
|
var
|
||||||
|
ccmd = ""
|
||||||
|
ret = 0
|
||||||
|
when defined(Windows):
|
||||||
|
ccmd = "cmd /c " & cmd
|
||||||
|
elif defined(posix):
|
||||||
|
ccmd = cmd
|
||||||
|
else:
|
||||||
|
doAssert false
|
||||||
|
|
||||||
|
when nimvm:
|
||||||
|
(result, ret) = gorgeEx(ccmd)
|
||||||
|
else:
|
||||||
|
let opt = if nostderr: {poUsePath} else: {poStdErrToStdOut, poUsePath}
|
||||||
|
(result, ret) = execCmdEx(ccmd, opt)
|
||||||
|
doAssert ret == 0, "Command failed: " & $(ret, nostderr) & "\nccmd: " & ccmd & "\nresult:\n" & result
|
||||||
|
|
||||||
|
proc findExe*(exe: string): string =
|
||||||
|
## Find the specified executable using the which/where command - supported
|
||||||
|
## at compile time
|
||||||
|
var
|
||||||
|
cmd =
|
||||||
|
when defined(windows):
|
||||||
|
"where " & exe
|
||||||
|
else:
|
||||||
|
"which " & exe
|
||||||
|
|
||||||
|
(oup, code) = gorgeEx(cmd)
|
||||||
|
|
||||||
|
if code == 0:
|
||||||
|
return oup.strip()
|
||||||
|
|
||||||
|
proc mkDir*(dir: string) =
|
||||||
|
## Create a directory at cmopile time
|
||||||
|
##
|
||||||
|
## The `os` module is not available at compile time so a few
|
||||||
|
## crucial helper functions are included with nimterop.
|
||||||
|
if not dirExists(dir):
|
||||||
|
let
|
||||||
|
flag = when not defined(Windows): "-p" else: ""
|
||||||
|
discard execAction(&"mkdir {flag} {dir.quoteShell}")
|
||||||
|
|
||||||
|
proc cpFile*(source, dest: string, move=false) =
|
||||||
|
## Copy a file from source to destination at compile time
|
||||||
|
let
|
||||||
|
source = source.replace("/", $DirSep)
|
||||||
|
dest = dest.replace("/", $DirSep)
|
||||||
|
cmd =
|
||||||
|
when defined(Windows):
|
||||||
|
if move:
|
||||||
|
"move /y"
|
||||||
|
else:
|
||||||
|
"copy /y"
|
||||||
|
else:
|
||||||
|
if move:
|
||||||
|
"mv -f"
|
||||||
|
else:
|
||||||
|
"cp -f"
|
||||||
|
|
||||||
|
discard execAction(&"{cmd} {source.quoteShell} {dest.quoteShell}")
|
||||||
|
|
||||||
|
proc mvFile*(source, dest: string) =
|
||||||
|
## Move a file from source to destination at compile time
|
||||||
|
cpFile(source, dest, move=true)
|
||||||
|
|
||||||
|
proc rmFile*(source: string, dir = false) =
|
||||||
|
## Remove a file or pattern at compile time
|
||||||
|
let
|
||||||
|
source = source.replace("/", $DirSep)
|
||||||
|
cmd =
|
||||||
|
when defined(Windows):
|
||||||
|
if dir:
|
||||||
|
"rd /s/q"
|
||||||
|
else:
|
||||||
|
"del /s/q/f"
|
||||||
|
else:
|
||||||
|
"rm -rf"
|
||||||
|
|
||||||
|
discard execAction(&"{cmd} {source.quoteShell}")
|
||||||
|
|
||||||
|
proc rmDir*(source: string) =
|
||||||
|
## Remove a directory or pattern at compile time
|
||||||
|
rmFile(source, dir = true)
|
||||||
|
|
||||||
|
proc extractZip*(zipfile, outdir: string) =
|
||||||
|
## Extract a zip file using powershell on Windows and unzip on other
|
||||||
|
## systems to the specified output directory
|
||||||
|
var cmd = "unzip -o $#"
|
||||||
|
if defined(Windows):
|
||||||
|
cmd = "powershell -nologo -noprofile -command \"& { Add-Type -A " &
|
||||||
|
"'System.IO.Compression.FileSystem'; " &
|
||||||
|
"[IO.Compression.ZipFile]::ExtractToDirectory('$#', '.'); }\""
|
||||||
|
|
||||||
|
echo "# Extracting " & zipfile
|
||||||
|
discard execAction(&"cd {outdir.quoteShell} && {cmd % zipfile}")
|
||||||
|
|
||||||
|
proc downloadUrl*(url, outdir: string) =
|
||||||
|
## Download a file using curl or wget (or powershell on Windows) to the specified directory
|
||||||
|
##
|
||||||
|
## If a zip file, it is automatically extracted after download.
|
||||||
|
let
|
||||||
|
file = url.extractFilename()
|
||||||
|
ext = file.splitFile().ext.toLowerAscii()
|
||||||
|
|
||||||
|
if not (ext == ".zip" and fileExists(outdir/file)):
|
||||||
|
echo "# Downloading " & file
|
||||||
|
mkDir(outdir)
|
||||||
|
var cmd = findExe("curl")
|
||||||
|
if cmd.len != 0:
|
||||||
|
cmd &= " -L $# -o $#"
|
||||||
|
else:
|
||||||
|
cmd = findExe("wget")
|
||||||
|
if cmd.len != 0:
|
||||||
|
cmd &= " $# -o $#"
|
||||||
|
elif defined(Windows):
|
||||||
|
cmd = "powershell [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; wget $# -OutFile $#"
|
||||||
|
else:
|
||||||
|
doAssert false, "No download tool available - curl, wget"
|
||||||
|
discard execAction(cmd % [url, (outdir/file).quoteShell])
|
||||||
|
|
||||||
|
if ext == ".zip":
|
||||||
|
extractZip(file, outdir)
|
||||||
|
|
||||||
|
proc gitReset*(outdir: string) =
|
||||||
|
## Hard reset the git repository at the specified directory
|
||||||
|
echo "# Resetting " & outdir
|
||||||
|
|
||||||
|
let cmd = &"cd {outdir.quoteShell} && git reset --hard"
|
||||||
|
while execAction(cmd).contains("Permission denied"):
|
||||||
|
sleep(1000)
|
||||||
|
echo "# Retrying ..."
|
||||||
|
|
||||||
|
proc gitCheckout*(file, outdir: string) =
|
||||||
|
## Checkout the specified file in the git repository specified
|
||||||
|
##
|
||||||
|
## This effectively resets all changes in the file and can be
|
||||||
|
## used to undo any changes that were made to source files to enable
|
||||||
|
## successful wrapping with `cImport()` or `c2nImport()`.
|
||||||
|
echo "# Resetting " & file
|
||||||
|
let file2 = file.relativePath outdir
|
||||||
|
let cmd = &"cd {outdir.quoteShell} && git checkout {file2.quoteShell}"
|
||||||
|
while execAction(cmd).contains("Permission denied"):
|
||||||
|
sleep(500)
|
||||||
|
echo "# Retrying ..."
|
||||||
|
|
||||||
|
proc gitPull*(url: string, outdir = "", plist = "", checkout = "") =
|
||||||
|
## Pull the specified git repository to the output directory
|
||||||
|
##
|
||||||
|
## `plist` is the list of specific files and directories or wildcards
|
||||||
|
## to sparsely checkout. Multiple values can be specified one entry per
|
||||||
|
## line. It is optional and if omitted, the entire repository will be
|
||||||
|
## checked out.
|
||||||
|
##
|
||||||
|
## `checkout` is the git tag, branch or commit hash to checkout once
|
||||||
|
## the repository is downloaded. This allows for pinning to a specific
|
||||||
|
## version of the code.
|
||||||
|
if dirExists(outdir/".git"):
|
||||||
|
gitReset(outdir)
|
||||||
|
return
|
||||||
|
|
||||||
|
let
|
||||||
|
outdirQ = outdir.quoteShell
|
||||||
|
|
||||||
|
mkDir(outdir)
|
||||||
|
|
||||||
|
echo "# Setting up Git repo: " & url
|
||||||
|
discard execAction(&"cd {outdirQ} && git init .")
|
||||||
|
discard execAction(&"cd {outdirQ} && git remote add origin {url}")
|
||||||
|
|
||||||
|
if plist.len != 0:
|
||||||
|
# If a specific list of files is required, create a sparse checkout
|
||||||
|
# file for git in its config directory
|
||||||
|
let sparsefile = outdir / ".git/info/sparse-checkout"
|
||||||
|
|
||||||
|
discard execAction(&"cd {outdirQ} && git config core.sparsecheckout true")
|
||||||
|
writeFile(sparsefile, plist)
|
||||||
|
|
||||||
|
if checkout.len != 0:
|
||||||
|
echo "# Checking out " & checkout
|
||||||
|
discard execAction(&"cd {outdirQ} && git pull --tags origin master")
|
||||||
|
discard execAction(&"cd {outdirQ} && git checkout {checkout}")
|
||||||
|
else:
|
||||||
|
echo "# Pulling repository"
|
||||||
|
discard execAction(&"cd {outdirQ} && git pull --depth=1 origin master")
|
||||||
|
|
||||||
|
proc configure*(path, check: string, flags = "") =
|
||||||
|
## Run the GNU `configure` command to generate all Makefiles or other
|
||||||
|
## build scripts in the specified path
|
||||||
|
##
|
||||||
|
## If a `configure` script is not present and an `autogen.sh` script
|
||||||
|
## is present, it will be run before attempting `configure`.
|
||||||
|
##
|
||||||
|
## `check` is a file that will be generated by the `configure` command.
|
||||||
|
## This is required to prevent configure from running on every build. It
|
||||||
|
## is relative to the `path` and should not be an absolute path.
|
||||||
|
##
|
||||||
|
## `flags` are any flags that should be passed to the `configure` command.
|
||||||
|
if (path / check).fileExists():
|
||||||
|
return
|
||||||
|
|
||||||
|
echo "# Configuring " & path
|
||||||
|
|
||||||
|
if not fileExists(path / "configure"):
|
||||||
|
for i in @[path / "autogen.sh", path / "build" / "autogen.sh"]:
|
||||||
|
if fileExists(i):
|
||||||
|
echo "# Running autogen.sh"
|
||||||
|
|
||||||
|
discard execAction(&"cd {i.parentDir().quoteShell} && bash autogen.sh")
|
||||||
|
|
||||||
|
break
|
||||||
|
|
||||||
|
if fileExists(path / "configure"):
|
||||||
|
echo "# Running configure " & flags
|
||||||
|
|
||||||
|
var
|
||||||
|
cmd = &"cd {path.quoteShell} && bash configure"
|
||||||
|
if flags.len != 0:
|
||||||
|
cmd &= &" {flags}"
|
||||||
|
|
||||||
|
echo execAction(cmd)
|
||||||
|
|
||||||
|
doAssert (path / check).fileExists(), "# Configure failed"
|
||||||
|
|
||||||
|
proc cmake*(path, check, flags: string) =
|
||||||
|
## Run the `cmake` command to generate all Makefiles or other
|
||||||
|
## build scripts in the specified path
|
||||||
|
##
|
||||||
|
## `path` will be created since typically `cmake` is run in an
|
||||||
|
## empty directory.
|
||||||
|
##
|
||||||
|
## `check` is a file that will be generated by the `cmake` command.
|
||||||
|
## This is required to prevent `cmake` from running on every build. It
|
||||||
|
## is relative to the `path` and should not be an absolute path.
|
||||||
|
##
|
||||||
|
## `flags` are any flags that should be passed to the `cmake` command.
|
||||||
|
## Unlike `configure`, it is required since typically it will be the
|
||||||
|
## path to the repository, typically `..` when `path` is a subdir.
|
||||||
|
if (path / check).fileExists():
|
||||||
|
return
|
||||||
|
|
||||||
|
echo "# Running cmake " & flags
|
||||||
|
echo "# Path: " & path
|
||||||
|
|
||||||
|
mkDir(path)
|
||||||
|
|
||||||
|
var
|
||||||
|
cmd = &"cd {path.quoteShell} && cmake {flags}"
|
||||||
|
|
||||||
|
echo execAction(cmd)
|
||||||
|
|
||||||
|
doAssert (path / check).fileExists(), "# cmake failed"
|
||||||
|
|
||||||
|
proc make*(path, check: string, flags = "") =
|
||||||
|
## Run the `make` command to build all binaries in the specified path
|
||||||
|
##
|
||||||
|
## `check` is a file that will be generated by the `make` command.
|
||||||
|
## This is required to prevent `make` from running on every build. It
|
||||||
|
## is relative to the `path` and should not be an absolute path.
|
||||||
|
##
|
||||||
|
## `flags` are any flags that should be passed to the `make` command.
|
||||||
|
##
|
||||||
|
## If make.exe is missing and mingw32-make.exe is available, it will
|
||||||
|
## be copied over to make.exe in the same location.
|
||||||
|
if (path / check).fileExists():
|
||||||
|
return
|
||||||
|
|
||||||
|
echo "# Running make " & flags
|
||||||
|
echo "# Path: " & path
|
||||||
|
|
||||||
|
var
|
||||||
|
cmd = findExe("make")
|
||||||
|
|
||||||
|
if cmd.len == 0:
|
||||||
|
cmd = findExe("mingw32-make")
|
||||||
|
if cmd.len != 0:
|
||||||
|
cpFile(cmd, cmd.replace("mingw32-make", "make"))
|
||||||
|
doAssert cmd.len != 0, "Make not found"
|
||||||
|
|
||||||
|
cmd = &"cd {path.quoteShell} && make"
|
||||||
|
if flags.len != 0:
|
||||||
|
cmd &= &" {flags}"
|
||||||
|
|
||||||
|
echo execAction(cmd)
|
||||||
|
|
||||||
|
doAssert (path / check).fileExists(), "# make failed"
|
||||||
|
|
@ -21,7 +21,7 @@ const CIMPORT {.used.} = 1
|
||||||
|
|
||||||
include "."/globals
|
include "."/globals
|
||||||
|
|
||||||
import "."/[git, paths, types]
|
import "."/[build, paths, types]
|
||||||
export types
|
export types
|
||||||
|
|
||||||
proc interpPath(dir: string): string=
|
proc interpPath(dir: string): string=
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ import dynlib, macros, os, sequtils, sets, strformat, strutils, tables, times
|
||||||
|
|
||||||
import regex
|
import regex
|
||||||
|
|
||||||
import "."/[git, globals, plugin, treesitter/api]
|
import "."/[build, globals, plugin, treesitter/api]
|
||||||
|
|
||||||
const gReserved = """
|
const gReserved = """
|
||||||
addr and as asm
|
addr and as asm
|
||||||
|
|
|
||||||
295
nimterop/git.nim
295
nimterop/git.nim
|
|
@ -1,294 +1 @@
|
||||||
import os, osproc, strformat, strutils
|
include build
|
||||||
|
|
||||||
import "."/[compat]
|
|
||||||
|
|
||||||
proc execAction*(cmd: string, nostderr=false): string =
|
|
||||||
## Execute an external command - supported at compile time
|
|
||||||
##
|
|
||||||
## Checks if command exits successfully before returning. If not, an
|
|
||||||
## error is raised.
|
|
||||||
var
|
|
||||||
ccmd = ""
|
|
||||||
ret = 0
|
|
||||||
when defined(Windows):
|
|
||||||
ccmd = "cmd /c " & cmd
|
|
||||||
elif defined(posix):
|
|
||||||
ccmd = cmd
|
|
||||||
else:
|
|
||||||
doAssert false
|
|
||||||
|
|
||||||
when nimvm:
|
|
||||||
(result, ret) = gorgeEx(ccmd)
|
|
||||||
else:
|
|
||||||
let opt = if nostderr: {poUsePath} else: {poStdErrToStdOut, poUsePath}
|
|
||||||
(result, ret) = execCmdEx(ccmd, opt)
|
|
||||||
doAssert ret == 0, "Command failed: " & $(ret, nostderr) & "\nccmd: " & ccmd & "\nresult:\n" & result
|
|
||||||
|
|
||||||
proc findExe*(exe: string): string =
|
|
||||||
## Find the specified executable using the which/where command - supported
|
|
||||||
## at compile time
|
|
||||||
var
|
|
||||||
cmd =
|
|
||||||
when defined(windows):
|
|
||||||
"where " & exe
|
|
||||||
else:
|
|
||||||
"which " & exe
|
|
||||||
|
|
||||||
(oup, code) = gorgeEx(cmd)
|
|
||||||
|
|
||||||
if code == 0:
|
|
||||||
return oup.strip()
|
|
||||||
|
|
||||||
proc mkDir*(dir: string) =
|
|
||||||
## Create a directory at cmopile time
|
|
||||||
##
|
|
||||||
## The `os` module is not available at compile time so a few
|
|
||||||
## crucial helper functions are included with nimterop.
|
|
||||||
if not dirExists(dir):
|
|
||||||
let
|
|
||||||
flag = when not defined(Windows): "-p" else: ""
|
|
||||||
discard execAction(&"mkdir {flag} {dir.quoteShell}")
|
|
||||||
|
|
||||||
proc cpFile*(source, dest: string, move=false) =
|
|
||||||
## Copy a file from source to destination at compile time
|
|
||||||
let
|
|
||||||
source = source.replace("/", $DirSep)
|
|
||||||
dest = dest.replace("/", $DirSep)
|
|
||||||
cmd =
|
|
||||||
when defined(Windows):
|
|
||||||
if move:
|
|
||||||
"move /y"
|
|
||||||
else:
|
|
||||||
"copy /y"
|
|
||||||
else:
|
|
||||||
if move:
|
|
||||||
"mv -f"
|
|
||||||
else:
|
|
||||||
"cp -f"
|
|
||||||
|
|
||||||
discard execAction(&"{cmd} {source.quoteShell} {dest.quoteShell}")
|
|
||||||
|
|
||||||
proc mvFile*(source, dest: string) =
|
|
||||||
## Move a file from source to destination at compile time
|
|
||||||
cpFile(source, dest, move=true)
|
|
||||||
|
|
||||||
proc rmFile*(source: string, dir = false) =
|
|
||||||
## Remove a file or pattern at compile time
|
|
||||||
let
|
|
||||||
source = source.replace("/", $DirSep)
|
|
||||||
cmd =
|
|
||||||
when defined(Windows):
|
|
||||||
if dir:
|
|
||||||
"rd /s/q"
|
|
||||||
else:
|
|
||||||
"del /s/q/f"
|
|
||||||
else:
|
|
||||||
"rm -rf"
|
|
||||||
|
|
||||||
discard execAction(&"{cmd} {source.quoteShell}")
|
|
||||||
|
|
||||||
proc rmDir*(source: string) =
|
|
||||||
## Remove a directory or pattern at compile time
|
|
||||||
rmFile(source, dir = true)
|
|
||||||
|
|
||||||
proc extractZip*(zipfile, outdir: string) =
|
|
||||||
## Extract a zip file using powershell on Windows and unzip on other
|
|
||||||
## systems to the specified output directory
|
|
||||||
var cmd = "unzip -o $#"
|
|
||||||
if defined(Windows):
|
|
||||||
cmd = "powershell -nologo -noprofile -command \"& { Add-Type -A " &
|
|
||||||
"'System.IO.Compression.FileSystem'; " &
|
|
||||||
"[IO.Compression.ZipFile]::ExtractToDirectory('$#', '.'); }\""
|
|
||||||
|
|
||||||
echo "# Extracting " & zipfile
|
|
||||||
discard execAction(&"cd {outdir.quoteShell} && {cmd % zipfile}")
|
|
||||||
|
|
||||||
proc downloadUrl*(url, outdir: string) =
|
|
||||||
## Download a file using curl or wget (or powershell on Windows) to the specified directory
|
|
||||||
##
|
|
||||||
## If a zip file, it is automatically extracted after download.
|
|
||||||
let
|
|
||||||
file = url.extractFilename()
|
|
||||||
ext = file.splitFile().ext.toLowerAscii()
|
|
||||||
|
|
||||||
if not (ext == ".zip" and fileExists(outdir/file)):
|
|
||||||
echo "# Downloading " & file
|
|
||||||
mkDir(outdir)
|
|
||||||
var cmd = findExe("curl")
|
|
||||||
if cmd.len != 0:
|
|
||||||
cmd &= " -L $# -o $#"
|
|
||||||
else:
|
|
||||||
cmd = findExe("wget")
|
|
||||||
if cmd.len != 0:
|
|
||||||
cmd &= " $# -o $#"
|
|
||||||
elif defined(Windows):
|
|
||||||
cmd = "powershell [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; wget $# -OutFile $#"
|
|
||||||
else:
|
|
||||||
doAssert false, "No download tool available - curl, wget"
|
|
||||||
discard execAction(cmd % [url, (outdir/file).quoteShell])
|
|
||||||
|
|
||||||
if ext == ".zip":
|
|
||||||
extractZip(file, outdir)
|
|
||||||
|
|
||||||
proc gitReset*(outdir: string) =
|
|
||||||
## Hard reset the git repository at the specified directory
|
|
||||||
echo "# Resetting " & outdir
|
|
||||||
|
|
||||||
let cmd = &"cd {outdir.quoteShell} && git reset --hard"
|
|
||||||
while execAction(cmd).contains("Permission denied"):
|
|
||||||
sleep(1000)
|
|
||||||
echo "# Retrying ..."
|
|
||||||
|
|
||||||
proc gitCheckout*(file, outdir: string) =
|
|
||||||
## Checkout the specified file in the git repository specified
|
|
||||||
##
|
|
||||||
## This effectively resets all changes in the file and can be
|
|
||||||
## used to undo any changes that were made to source files to enable
|
|
||||||
## successful wrapping with `cImport()` or `c2nImport()`.
|
|
||||||
echo "# Resetting " & file
|
|
||||||
let file2 = file.relativePath outdir
|
|
||||||
let cmd = &"cd {outdir.quoteShell} && git checkout {file2.quoteShell}"
|
|
||||||
while execAction(cmd).contains("Permission denied"):
|
|
||||||
sleep(500)
|
|
||||||
echo "# Retrying ..."
|
|
||||||
|
|
||||||
proc gitPull*(url: string, outdir = "", plist = "", checkout = "") =
|
|
||||||
## Pull the specified git repository to the output directory
|
|
||||||
##
|
|
||||||
## `plist` is the list of specific files and directories or wildcards
|
|
||||||
## to sparsely checkout. Multiple values can be specified one entry per
|
|
||||||
## line. It is optional and if omitted, the entire repository will be
|
|
||||||
## checked out.
|
|
||||||
##
|
|
||||||
## `checkout` is the git tag, branch or commit hash to checkout once
|
|
||||||
## the repository is downloaded. This allows for pinning to a specific
|
|
||||||
## version of the code.
|
|
||||||
if dirExists(outdir/".git"):
|
|
||||||
gitReset(outdir)
|
|
||||||
return
|
|
||||||
|
|
||||||
let
|
|
||||||
outdirQ = outdir.quoteShell
|
|
||||||
|
|
||||||
mkDir(outdir)
|
|
||||||
|
|
||||||
echo "# Setting up Git repo: " & url
|
|
||||||
discard execAction(&"cd {outdirQ} && git init .")
|
|
||||||
discard execAction(&"cd {outdirQ} && git remote add origin {url}")
|
|
||||||
|
|
||||||
if plist.len != 0:
|
|
||||||
# If a specific list of files is required, create a sparse checkout
|
|
||||||
# file for git in its config directory
|
|
||||||
let sparsefile = outdir / ".git/info/sparse-checkout"
|
|
||||||
|
|
||||||
discard execAction(&"cd {outdirQ} && git config core.sparsecheckout true")
|
|
||||||
writeFile(sparsefile, plist)
|
|
||||||
|
|
||||||
if checkout.len != 0:
|
|
||||||
echo "# Checking out " & checkout
|
|
||||||
discard execAction(&"cd {outdirQ} && git pull --tags origin master")
|
|
||||||
discard execAction(&"cd {outdirQ} && git checkout {checkout}")
|
|
||||||
else:
|
|
||||||
echo "# Pulling repository"
|
|
||||||
discard execAction(&"cd {outdirQ} && git pull --depth=1 origin master")
|
|
||||||
|
|
||||||
proc configure*(path, check: string, flags = "") =
|
|
||||||
## Run the GNU `configure` command to generate all Makefiles or other
|
|
||||||
## build scripts in the specified path
|
|
||||||
##
|
|
||||||
## If a `configure` script is not present and an `autogen.sh` script
|
|
||||||
## is present, it will be run before attempting `configure`.
|
|
||||||
##
|
|
||||||
## `check` is a file that will be generated by the `configure` command.
|
|
||||||
## This is required to prevent configure from running on every build. It
|
|
||||||
## is relative to the `path` and should not be an absolute path.
|
|
||||||
##
|
|
||||||
## `flags` are any flags that should be passed to the `configure` command.
|
|
||||||
if (path / check).fileExists():
|
|
||||||
return
|
|
||||||
|
|
||||||
echo "# Configuring " & path
|
|
||||||
|
|
||||||
if not fileExists(path / "configure"):
|
|
||||||
for i in @[path / "autogen.sh", path / "build" / "autogen.sh"]:
|
|
||||||
if fileExists(i):
|
|
||||||
echo "# Running autogen.sh"
|
|
||||||
|
|
||||||
discard execAction(&"cd {i.parentDir().quoteShell} && bash autogen.sh")
|
|
||||||
|
|
||||||
break
|
|
||||||
|
|
||||||
if fileExists(path / "configure"):
|
|
||||||
echo "# Running configure " & flags
|
|
||||||
|
|
||||||
var
|
|
||||||
cmd = &"cd {path.quoteShell} && bash configure"
|
|
||||||
if flags.len != 0:
|
|
||||||
cmd &= &" {flags}"
|
|
||||||
|
|
||||||
echo execAction(cmd)
|
|
||||||
|
|
||||||
doAssert (path / check).fileExists(), "# Configure failed"
|
|
||||||
|
|
||||||
proc cmake*(path, check, flags: string) =
|
|
||||||
## Run the `cmake` command to generate all Makefiles or other
|
|
||||||
## build scripts in the specified path
|
|
||||||
##
|
|
||||||
## `path` will be created since typically `cmake` is run in an
|
|
||||||
## empty directory.
|
|
||||||
##
|
|
||||||
## `check` is a file that will be generated by the `cmake` command.
|
|
||||||
## This is required to prevent `cmake` from running on every build. It
|
|
||||||
## is relative to the `path` and should not be an absolute path.
|
|
||||||
##
|
|
||||||
## `flags` are any flags that should be passed to the `cmake` command.
|
|
||||||
## Unlike `configure`, it is required since typically it will be the
|
|
||||||
## path to the repository, typically `..` when `path` is a subdir.
|
|
||||||
if (path / check).fileExists():
|
|
||||||
return
|
|
||||||
|
|
||||||
echo "# Running cmake " & flags
|
|
||||||
echo "# Path: " & path
|
|
||||||
|
|
||||||
mkDir(path)
|
|
||||||
|
|
||||||
var
|
|
||||||
cmd = &"cd {path.quoteShell} && cmake {flags}"
|
|
||||||
|
|
||||||
echo execAction(cmd)
|
|
||||||
|
|
||||||
doAssert (path / check).fileExists(), "# cmake failed"
|
|
||||||
|
|
||||||
proc make*(path, check: string, flags = "") =
|
|
||||||
## Run the `make` command to build all binaries in the specified path
|
|
||||||
##
|
|
||||||
## `check` is a file that will be generated by the `make` command.
|
|
||||||
## This is required to prevent `make` from running on every build. It
|
|
||||||
## is relative to the `path` and should not be an absolute path.
|
|
||||||
##
|
|
||||||
## `flags` are any flags that should be passed to the `make` command.
|
|
||||||
##
|
|
||||||
## If make.exe is missing and mingw32-make.exe is available, it will
|
|
||||||
## be copied over to make.exe in the same location.
|
|
||||||
if (path / check).fileExists():
|
|
||||||
return
|
|
||||||
|
|
||||||
echo "# Running make " & flags
|
|
||||||
echo "# Path: " & path
|
|
||||||
|
|
||||||
var
|
|
||||||
cmd = findExe("make")
|
|
||||||
|
|
||||||
if cmd.len == 0:
|
|
||||||
cmd = findExe("mingw32-make")
|
|
||||||
if cmd.len != 0:
|
|
||||||
cpFile(cmd, cmd.replace("mingw32-make", "make"))
|
|
||||||
doAssert cmd.len != 0, "Make not found"
|
|
||||||
|
|
||||||
cmd = &"cd {path.quoteShell} && make"
|
|
||||||
if flags.len != 0:
|
|
||||||
cmd &= &" {flags}"
|
|
||||||
|
|
||||||
echo execAction(cmd)
|
|
||||||
|
|
||||||
doAssert (path / check).fileExists(), "# make failed"
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import os, strutils
|
import os, strutils
|
||||||
|
|
||||||
import "."/[git, paths]
|
import "."/[build, paths]
|
||||||
|
|
||||||
proc treesitterSetup*() =
|
proc treesitterSetup*() =
|
||||||
gitPull("https://github.com/tree-sitter/tree-sitter", incDir() / "treesitter", """
|
gitPull("https://github.com/tree-sitter/tree-sitter", incDir() / "treesitter", """
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import os, strutils
|
import os, strutils
|
||||||
|
|
||||||
import nimterop/[cimport, git, paths]
|
import nimterop/[cimport, build, paths]
|
||||||
|
|
||||||
# Documentation:
|
# Documentation:
|
||||||
# https://github.com/nimterop/nimterop
|
# https://github.com/nimterop/nimterop
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import os, strutils
|
import os, strutils
|
||||||
|
|
||||||
import nimterop/[cimport, git, paths]
|
import nimterop/[cimport, build, paths]
|
||||||
|
|
||||||
const
|
const
|
||||||
baseDir = currentSourcePath.parentDir()/"build"
|
baseDir = currentSourcePath.parentDir()/"build"
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import os
|
import os
|
||||||
|
|
||||||
import nimterop/[cimport, git, paths]
|
import nimterop/[cimport, build, paths]
|
||||||
|
|
||||||
const
|
const
|
||||||
baseDir = nimteropBuildDir()/"pcre"
|
baseDir = nimteropBuildDir()/"pcre"
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import os, nimterop/[cimport, git, paths]
|
import os, nimterop/[cimport, build, paths]
|
||||||
|
|
||||||
const
|
const
|
||||||
baseDir = nimteropBuildDir()/"soloud"
|
baseDir = nimteropBuildDir()/"soloud"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue