aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGanesh Viswanathan <dev@genotrance.com>2019-09-06 23:10:28 -0500
committerGanesh Viswanathan <dev@genotrance.com>2019-10-02 15:31:12 -0500
commit9f196e3f77be2728ec7cd5e8caa51b7b882637cd (patch)
treee3a51d15ffd78e812ae1a8f84e58c26fac9366bd
parent2049787f435440a51c7989ca9939a89d9b2aeff6 (diff)
downloadnimterop-9f196e3f77be2728ec7cd5e8caa51b7b882637cd.tar.gz
nimterop-9f196e3f77be2728ec7cd5e8caa51b7b882637cd.zip
Fix paths, git for Windows build
-rw-r--r--appveyor.yml42
-rw-r--r--nimterop/build.nim56
-rw-r--r--nimterop/cimport.nim20
-rw-r--r--nimterop/compat.nim12
-rw-r--r--nimterop/getters.nim17
-rw-r--r--nimterop/treesitter/api.nim12
-rw-r--r--nimterop/treesitter/c.nim2
-rw-r--r--nimterop/treesitter/cpp.nim2
8 files changed, 87 insertions, 76 deletions
diff --git a/appveyor.yml b/appveyor.yml
index 5386bbc..50d9813 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,8 +1,8 @@
version: '{build}'
image:
+ - Visual Studio 2015
- Ubuntu
- - Visual Studio 2017
matrix:
fast_finish: true
@@ -16,13 +16,12 @@ for:
-
matrix:
only:
- - image: Visual Studio 2017
+ - image: Visual Studio 2015
environment:
- ARCH: 32
- MINGW_URL: https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/8.1.0/threads-posix/dwarf
- MINGW_ARCHIVE: i686-8.1.0-release-posix-dwarf-rt_v6-rev0.7z
- SFNET_URL: https://sourceforge.net/projects/msys2/files/REPOS/MINGW/i686
+ ARCH: 64
+ GIT_URL: https://github.com/git-for-windows/git/releases/download/v2.23.0.windows.1/
+ GIT_ARCHIVE: PortableGit-2.23.0-64-bit.7z.exe
install:
- CD c:\
@@ -30,20 +29,23 @@ for:
echo %NIM_VERSION% &&
MKDIR binaries &&
CD binaries &&
- appveyor DownloadFile "%MINGW_URL%/%MINGW_ARCHIVE%/download" -FileName "%MINGW_ARCHIVE%" &&
- 7z x -y "%MINGW_ARCHIVE%"> nul &&
- del "%MINGW_ARCHIVE%" &&
+ MKDIR git &&
+ CD git &&
+ appveyor DownloadFile "%GIT_URL%/%GIT_ARCHIVE%" -FileName "%GIT_ARCHIVE%" &&
+ 7z x -y -bd "%GIT_ARCHIVE%"> nul &&
+ del "%GIT_ARCHIVE%" &&
+ CD .. &&
appveyor DownloadFile "https://nim-lang.org/download/nim-%NIM_VERSION%_x%ARCH%.zip" -FileName "nim-%NIM_VERSION%_x%ARCH%.zip" &&
7z x -y "nim-%NIM_VERSION%_x%ARCH%.zip"> nul &&
del "nim-%NIM_VERSION%_x%ARCH%.zip")
- - SET PATH=c:\binaries\mingw%ARCH%\bin;c:\binaries\nim-%NIM_VERSION%\bin;%USERPROFILE%\.nimble\bin;%PATH%
+ - SET PATH=c:\binaries\git\bin;C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin;c:\binaries\nim-%NIM_VERSION%\bin;%USERPROFILE%\.nimble\bin;%PATH%
- CD %APPVEYOR_BUILD_FOLDER%
- on_finish:
- - 7z a -r buildlogs-win-pkgs.zip %USERPROFILE%\.nimble\pkgs
- - appveyor PushArtifact buildlogs-win-pkgs.zip
- - 7z a -r buildlogs-win-projects.zip c:\projects\*
- - appveyor PushArtifact buildlogs-win-projects.zip
+# on_finish:
+# - 7z a -r buildlogs-win-pkgs.zip %USERPROFILE%\.nimble\pkgs
+# - appveyor PushArtifact buildlogs-win-pkgs.zip
+# - 7z a -r buildlogs-win-projects.zip c:\projects\*
+# - appveyor PushArtifact buildlogs-win-projects.zip
cache:
- c:\binaries
@@ -71,11 +73,11 @@ for:
- export PATH=/home/appveyor/binaries/nim-$NIM_VERSION/bin:~/.nimble/bin:$PATH
- cd $APPVEYOR_BUILD_FOLDER
- on_finish:
- - zip -r -q buildlogs-lin-pkgs.zip ~/.nimble/pkgs
- - appveyor PushArtifact buildlogs-lin-pkgs.zip
- - zip -r -q buildlogs-lin-projects.zip /home/appveyor/projects
- - appveyor PushArtifact buildlogs-lin-projects.zip
+# on_finish:
+# - zip -r -q buildlogs-lin-pkgs.zip ~/.nimble/pkgs
+# - appveyor PushArtifact buildlogs-lin-pkgs.zip
+# - zip -r -q buildlogs-lin-projects.zip /home/appveyor/projects
+# - appveyor PushArtifact buildlogs-lin-projects.zip
cache:
- /home/appveyor/binaries
diff --git a/nimterop/build.nim b/nimterop/build.nim
index ee7c4ee..7a1aaf9 100644
--- a/nimterop/build.nim
+++ b/nimterop/build.nim
@@ -4,6 +4,11 @@ import os except findExe
import "."/[compat]
+proc sanitizePath*(path: string, noQuote = false): string =
+ result = path.multiReplace([("\\\\", $DirSep), ("\\", $DirSep), ("/", $DirSep)])
+ if not noQuote:
+ result = result.quoteShell
+
proc execAction*(cmd: string, nostderr=false): string =
## Execute an external command - supported at compile time
##
@@ -39,7 +44,7 @@ proc findExe*(exe: string): string =
(oup, code) = gorgeEx(cmd)
if code == 0:
- return oup.strip()
+ return oup.splitLines()[0].strip()
proc mkDir*(dir: string) =
## Create a directory at cmopile time
@@ -49,7 +54,7 @@ proc mkDir*(dir: string) =
if not dirExists(dir):
let
flag = when not defined(Windows): "-p" else: ""
- discard execAction(&"mkdir {flag} {dir.quoteShell}")
+ discard execAction(&"mkdir {flag} {dir.sanitizePath}")
proc cpFile*(source, dest: string, move=false) =
## Copy a file from source to destination at compile time
@@ -68,7 +73,7 @@ proc cpFile*(source, dest: string, move=false) =
else:
"cp -f"
- discard execAction(&"{cmd} {source.quoteShell} {dest.quoteShell}")
+ discard execAction(&"{cmd} {source.sanitizePath} {dest.sanitizePath}")
proc mvFile*(source, dest: string) =
## Move a file from source to destination at compile time
@@ -87,7 +92,7 @@ proc rmFile*(source: string, dir = false) =
else:
"rm -rf"
- discard execAction(&"{cmd} {source.quoteShell}")
+ discard execAction(&"{cmd} {source.sanitizePath}")
proc rmDir*(source: string) =
## Remove a directory or pattern at compile time
@@ -103,7 +108,7 @@ proc extractZip*(zipfile, outdir: string) =
"[IO.Compression.ZipFile]::ExtractToDirectory('$#', '.'); }\""
echo "# Extracting " & zipfile
- discard execAction(&"cd {outdir.quoteShell} && {cmd % zipfile}")
+ discard execAction(&"cd {outdir.sanitizePath} && {cmd % zipfile}")
proc extractTar*(tarfile, outdir: string) =
## Extract a tar file using tar, 7z or 7za to the specified output directory
@@ -121,20 +126,22 @@ proc extractTar*(tarfile, outdir: string) =
of ".bz2": "j"
else: ""
- cmd = "tar xvf" & typ & " " & tarfile.quoteShell
+ cmd = "tar xvf" & typ & " " & tarfile.sanitizePath
else:
for i in ["7z", "7za"]:
if findExe(i).len != 0:
- cmd = i & " x $#" % tarfile.quoteShell
+ cmd = i & " x $#" % tarfile.sanitizePath
name = tarfile.splitFile().name
if ".tar" in name.toLowerAscii():
- cmd &= " && " & i & " x $#" % name.quoteShell
+ cmd &= " && " & i & " x $#" % name.sanitizePath
break
+ doAssert cmd.len != 0, "No extraction tool - tar, 7z, 7za - available for " & tarfile.sanitizePath
+
echo "# Extracting " & tarfile
- discard execAction(&"cd {outdir.quoteShell} && {cmd}")
+ discard execAction(&"cd {outdir.sanitizePath} && {cmd}")
if name.len != 0:
rmFile(outdir / name)
@@ -152,7 +159,7 @@ proc downloadUrl*(url, outdir: string) =
mkDir(outdir)
var cmd = findExe("curl")
if cmd.len != 0:
- cmd &= " -L $# -o $#"
+ cmd &= " -Lk $# -o $#"
else:
cmd = findExe("wget")
if cmd.len != 0:
@@ -161,7 +168,7 @@ proc downloadUrl*(url, outdir: string) =
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])
+ discard execAction(cmd % [url, (outdir/file).sanitizePath])
if ext == ".zip":
extractZip(file, outdir)
@@ -172,7 +179,7 @@ proc gitReset*(outdir: string) =
## Hard reset the git repository at the specified directory
echo "# Resetting " & outdir
- let cmd = &"cd {outdir.quoteShell} && git reset --hard"
+ let cmd = &"cd {outdir.sanitizePath} && git reset --hard"
while execAction(cmd).contains("Permission denied"):
sleep(1000)
echo "# Retrying ..."
@@ -185,7 +192,7 @@ proc gitCheckout*(file, outdir: string) =
## successful wrapping with `cImport()` or `c2nImport()`.
echo "# Resetting " & file
let file2 = file.relativePath outdir
- let cmd = &"cd {outdir.quoteShell} && git checkout {file2.quoteShell}"
+ let cmd = &"cd {outdir.sanitizePath} && git checkout {file2.sanitizePath}"
while execAction(cmd).contains("Permission denied"):
sleep(500)
echo "# Retrying ..."
@@ -206,7 +213,7 @@ proc gitPull*(url: string, outdir = "", plist = "", checkout = "") =
return
let
- outdirQ = outdir.quoteShell
+ outdirQ = outdir.sanitizePath
mkDir(outdir)
@@ -279,7 +286,7 @@ proc configure*(path, check: string, flags = "") =
if fileExists(path / i):
echo "# Running autogen.sh"
- echo execAction(&"cd {(path / i).parentDir().quoteShell} && bash autogen.sh")
+ echo execAction(&"cd {(path / i).parentDir().sanitizePath} && bash autogen.sh")
break
@@ -288,7 +295,7 @@ proc configure*(path, check: string, flags = "") =
if fileExists(path / i):
echo "# Running autoreconf"
- echo execAction(&"cd {path.quoteShell} && autoreconf -fi")
+ echo execAction(&"cd {path.sanitizePath} && autoreconf -fi")
break
@@ -296,7 +303,7 @@ proc configure*(path, check: string, flags = "") =
echo "# Running configure " & flags
var
- cmd = &"cd {path.quoteShell} && bash configure"
+ cmd = &"cd {path.sanitizePath} && bash configure"
if flags.len != 0:
cmd &= &" {flags}"
@@ -327,7 +334,7 @@ proc cmake*(path, check, flags: string) =
mkDir(path)
var
- cmd = &"cd {path.quoteShell} && cmake {flags}"
+ cmd = &"cd {path.sanitizePath} && cmake {flags}"
echo execAction(cmd)
@@ -359,7 +366,7 @@ proc make*(path, check: string|Regex, flags = "") =
cpFile(cmd, cmd.replace("mingw32-make", "make"))
doAssert cmd.len != 0, "Make not found"
- cmd = &"cd {path.quoteShell} && make"
+ cmd = &"cd {path.sanitizePath} && make"
if flags.len != 0:
cmd &= &" {flags}"
@@ -383,8 +390,7 @@ proc getGccPaths*(mode = "c"): seq[string] =
break
if inc:
var
- path = line.strip()
- path.normalizePath()
+ path = line.strip().myNormalizedPath()
if path notin result:
result.add path
@@ -400,15 +406,13 @@ proc getGccLibPaths*(mode = "c"): seq[string] =
if "LIBRARY_PATH=" in line:
for path in line[13 .. ^1].split(PathSep):
var
- path = path.strip()
- path.normalizePath()
+ path = path.strip().myNormalizedPath()
if path notin result:
result.add path
break
elif '\t' in line:
var
- path = line.strip()
- path.normalizePath()
+ path = line.strip().myNormalizedPath()
if path notin result:
result.add path
@@ -504,7 +508,7 @@ proc buildLibrary(lname, outdir, conFlags, cmakeFlags, makeFlags: string): strin
gen = "MinGW Makefiles"
else:
gen = "Unix Makefiles"
- cmake(outdir / "build", "Makefile", &".. -G {gen.quoteShell} {cmakeFlags}")
+ cmake(outdir / "build", "Makefile", &".. -G {gen.sanitizePath} {cmakeFlags}")
cmakeDeps = true
makePath = outdir / "build"
else:
diff --git a/nimterop/cimport.nim b/nimterop/cimport.nim
index fc03bc5..3c99c81 100644
--- a/nimterop/cimport.nim
+++ b/nimterop/cimport.nim
@@ -79,11 +79,11 @@ proc getFileDate(fullpath: string): string =
ret = 0
cmd =
when defined(Windows):
- &"cmd /c for %a in ({fullpath.quoteShell}) do echo %~ta"
+ &"cmd /c for %a in ({fullpath.sanitizePath}) do echo %~ta"
elif defined(Linux):
- &"stat -c %y {fullpath.quoteShell}"
+ &"stat -c %y {fullpath.sanitizePath}"
elif defined(OSX):
- &"stat -f %m {fullpath.quoteShell}"
+ &"stat -f %m {fullpath.sanitizePath}"
(result, ret) = gorgeEx(cmd)
@@ -120,7 +120,7 @@ proc getNimCheckError(output: string): tuple[tmpFile, errors: string] =
getCurrentCompilerExe()
else:
"nim"
- (check, _) = gorgeEx(&"{nim} check {result.tmpFile.quoteShell}")
+ (check, _) = gorgeEx(&"{nim} check {result.tmpFile.sanitizePath}")
result.errors = "\n\n" & check
@@ -131,7 +131,7 @@ proc getToast(fullpath: string, recurse: bool = false, dynlib: string = "",
cmd = when defined(Windows): "cmd /c " else: ""
let toastExe = toastExePath()
- doAssert fileExists(toastExe), "toast not compiled: " & toastExe.quoteShell &
+ doAssert fileExists(toastExe), "toast not compiled: " & toastExe.sanitizePath &
" make sure 'nimble build' or 'nimble install' built it"
cmd &= &"{toastExe} --preprocess"
@@ -145,7 +145,7 @@ proc getToast(fullpath: string, recurse: bool = false, dynlib: string = "",
cmd.add &" --defines+={i.quoteShell}"
for i in gStateCT.includeDirs:
- cmd.add &" --includeDirs+={i.quoteShell}"
+ cmd.add &" --includeDirs+={i.sanitizePath}"
if not noNimout:
cmd.add &" --pnim"
@@ -157,12 +157,12 @@ proc getToast(fullpath: string, recurse: bool = false, dynlib: string = "",
cmd.add &" --symOverride={gStateCT.symOverride.join(\",\")}"
when (NimMajor, NimMinor, NimPatch) >= (0, 19, 9):
- cmd.add &" --nim:{getCurrentCompilerExe().quoteShell}"
+ cmd.add &" --nim:{getCurrentCompilerExe().sanitizePath}"
if gStateCT.pluginSourcePath.nBl:
- cmd.add &" --pluginSourcePath={gStateCT.pluginSourcePath.quoteShell}"
+ cmd.add &" --pluginSourcePath={gStateCT.pluginSourcePath.sanitizePath}"
- cmd.add &" {fullpath.quoteShell}"
+ cmd.add &" {fullpath.sanitizePath}"
# see https://github.com/nimterop/nimterop/issues/69
(result, ret) = gorgeEx(cmd, cache=getCacheValue(fullpath))
@@ -527,7 +527,7 @@ macro cImport*(filename: static string, recurse: static bool = false, dynlib: st
let
fullpath = findPath(filename)
- echo "# Importing " & fullpath
+ echo "# Importing " & fullpath.sanitizePath
let
output = getToast(fullpath, recurse, dynlib, mode, flags)
diff --git a/nimterop/compat.nim b/nimterop/compat.nim
index 7f89358..1115252 100644
--- a/nimterop/compat.nim
+++ b/nimterop/compat.nim
@@ -6,10 +6,18 @@ put everything that requires `when (NimMajor, NimMinor, NimPatch)` here
import os
when (NimMajor, NimMinor, NimPatch) >= (0, 19, 9):
+ proc myNormalizedPath*(path: string): string = path.normalizedPath()
+
export relativePath
+
else:
import std/[ospaths,strutils]
+ proc myNormalizedPath*(path: string): string =
+ result = path.normalizedPath()
+ when defined(windows):
+ result = result.strip(trailing = false, chars = {'\\'})
+
proc relativePath*(file, base: string): string =
## naive version of `os.relativePath` ; remove after nim >= 0.19.9
runnableExamples:
@@ -17,8 +25,8 @@ else:
check:
"/foo/bar/baz/log.txt".unixToNativePath.relativePath("/foo/bar".unixToNativePath) == "baz/log.txt".unixToNativePath
"foo/bar/baz/log.txt".unixToNativePath.relativePath("foo/bar".unixToNativePath) == "baz/log.txt".unixToNativePath
- var base = base.normalizedPath
- var file = file.normalizedPath
+ var base = base.myNormalizedPath
+ var file = file.myNormalizedPath
if not base.endsWith DirSep: base.add DirSep
doAssert file.startsWith base
result = file[base.len .. ^1]
diff --git a/nimterop/getters.nim b/nimterop/getters.nim
index f1559db..c5c839d 100644
--- a/nimterop/getters.nim
+++ b/nimterop/getters.nim
@@ -73,9 +73,6 @@ const gTypeMap = {
"long double": "clongdouble"
}.toTable()
-proc sanitizePath*(path: string): string =
- path.multiReplace([("\\\\", $DirSep), ("\\", $DirSep), ("/", $DirSep)])
-
proc getType*(str: string): string =
if str == "void":
return "object"
@@ -205,15 +202,15 @@ proc getPreprocessor*(gState: State, fullpath: string, mode = "cpp"): string =
rdata: seq[string] = @[]
start = false
- sfile = fullpath.sanitizePath
+ sfile = fullpath.sanitizePath(noQuote = true)
for inc in gState.includeDirs:
- cmd &= &"-I{inc.quoteShell} "
+ cmd &= &"-I{inc.sanitizePath} "
for def in gState.defines:
cmd &= &"-D{def} "
- cmd &= &"{fullpath.quoteShell}"
+ cmd &= &"{fullpath.sanitizePath}"
# Include content only from file
for line in execAction(cmd).splitLines():
@@ -221,19 +218,19 @@ proc getPreprocessor*(gState: State, fullpath: string, mode = "cpp"): string =
if line.len > 1 and line[0 .. 1] == "# ":
start = false
let
- saniLine = line.sanitizePath
+ saniLine = line.sanitizePath(noQuote = true)
if sfile in saniLine:
start = true
elif not ("\\" in line) and not ("/" in line) and extractFilename(sfile) in line:
start = true
elif gState.recurse:
let
- pDir = sfile.expandFilename().parentDir().sanitizePath()
+ pDir = sfile.expandFilename().parentDir().sanitizePath(noQuote = true)
if pDir.len == 0 or pDir in saniLine:
start = true
else:
for inc in gState.includeDirs:
- if inc.absolutePath().sanitizePath in saniLine:
+ if inc.absolutePath().sanitizePath(noQuote = true) in saniLine:
start = true
break
else:
@@ -395,7 +392,7 @@ proc loadPlugin*(gState: State, sourcePath: string) =
pdll = sourcePath.dll
if not fileExists(pdll) or
sourcePath.getLastModificationTime() > pdll.getLastModificationTime():
- discard execAction(&"{gState.nim.quoteShell} c --app:lib {sourcePath.quoteShell}")
+ discard execAction(&"{gState.nim.sanitizePath} c --app:lib {sourcePath.sanitizePath}")
doAssert fileExists(pdll), "No plugin binary generated for " & sourcePath
let lib = loadLib(pdll)
diff --git a/nimterop/treesitter/api.nim b/nimterop/treesitter/api.nim
index 62ebe3b..2c11a60 100644
--- a/nimterop/treesitter/api.nim
+++ b/nimterop/treesitter/api.nim
@@ -7,17 +7,17 @@ import ".."/[setup, paths, types]
static:
treesitterSetup()
-const sourcePath = incDir() / "treesitter/lib"
+const sourcePath = incDir() / "treesitter" / "lib"
when defined(Linux):
{.passC: "-std=c11".}
{.passC: "-DUTF8PROC_STATIC".}
-{.passC: "-I$1/include" % sourcePath.}
-{.passC: "-I$1/src" % sourcePath.}
-{.passC: "-I$1/../../utf8proc" % sourcePath.}
+{.passC: "-I$1" % (sourcePath / "include").}
+{.passC: "-I$1" % (sourcePath / "src").}
+{.passC: "-I$1" % (sourcePath / ".." / ".." / "utf8proc").}
-{.compile: sourcePath / "src/lib.c".}
+{.compile: sourcePath / "src" / "lib.c".}
### Generated below
@@ -27,7 +27,7 @@ defineEnum(TSInputEncoding)
defineEnum(TSSymbolType)
defineEnum(TSLogType)
const
- headerapi {.used.} = sourcePath / "include/tree_sitter/api.h"
+ headerapi {.used.} = sourcePath / "include" / "tree_sitter" / "api.h"
TREE_SITTER_LANGUAGE_VERSION* = 9
TSInputEncodingUTF8* = 0.TSInputEncoding
TSInputEncodingUTF16* = 1.TSInputEncoding
diff --git a/nimterop/treesitter/c.nim b/nimterop/treesitter/c.nim
index a39ee65..38fa003 100644
--- a/nimterop/treesitter/c.nim
+++ b/nimterop/treesitter/c.nim
@@ -5,7 +5,7 @@ import ".."/[setup, paths]
static:
treesitterCSetup()
-const srcDir = incDir() / "treesitter_c/src"
+const srcDir = incDir() / "treesitter_c" / "src"
import "."/api
diff --git a/nimterop/treesitter/cpp.nim b/nimterop/treesitter/cpp.nim
index 1b47206..131e57f 100644
--- a/nimterop/treesitter/cpp.nim
+++ b/nimterop/treesitter/cpp.nim
@@ -5,7 +5,7 @@ import ".."/[setup, paths]
static:
treesitterCppSetup()
-const srcDir = incDir() / "treesitter_cpp/src"
+const srcDir = incDir() / "treesitter_cpp" / "src"
{.passC: "-I$1" % srcDir.}