summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2013-08-07 01:40:37 +0200
committerAraq <rumpf_a@web.de>2013-08-07 01:40:37 +0200
commit06b3852143b2f3857da0090b9c18ac63812ec3cc (patch)
tree48d09ac7567965481b7f46a63f4e4f444b334fad
parentaefa0da8a612df3bb363435dd78ed641b239c0c8 (diff)
parent5c32156a715b39061ee2bc353e886991fef28ab2 (diff)
downloadNim-06b3852143b2f3857da0090b9c18ac63812ec3cc.tar.gz
Merge branch 'master' of github.com:Araq/Nimrod
-rw-r--r--compiler/semexprs.nim4
-rw-r--r--compiler/sempass2.nim7
-rw-r--r--lib/pure/sockets.nim16
-rw-r--r--readme.md6
-rw-r--r--readme.txt6
-rw-r--r--tools/niminst/buildbat.tmpl13
-rw-r--r--tools/niminst/buildsh.tmpl20
-rw-r--r--tools/niminst/niminst.nim27
8 files changed, 67 insertions, 32 deletions
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim
index a524e71da..4591c3942 100644
--- a/compiler/semexprs.nim
+++ b/compiler/semexprs.nim
@@ -1361,7 +1361,9 @@ proc semQuoteAst(c: PContext, n: PNode): PNode =
     ids = newSeq[PNode]()
       # this will store the generated param names
 
-  internalAssert doBlk.kind == nkDo
+  if doBlk.kind != nkDo:
+    LocalError(n.info, errXExpected, "block")
+
   processQuotations(doBlk.sons[bodyPos], op, quotes, ids)
   
   doBlk.sons[namePos] = newAnonSym(skTemplate, n.info).newSymNode
diff --git a/compiler/sempass2.nim b/compiler/sempass2.nim
index f2e4fb02e..7dec557be 100644
--- a/compiler/sempass2.nim
+++ b/compiler/sempass2.nim
@@ -448,8 +448,11 @@ proc track(tracked: PEffects, n: PNode) =
     # p's effects are ours too:
     let a = n.sons[0]
     let op = a.typ
-    if op != nil and op.kind == tyProc:
-      InternalAssert op.n.sons[0].kind == nkEffectList
+    # XXX: in rare situations, templates and macros will reach here after
+    # calling getAst(templateOrMacro()). Currently, templates and macros
+    # are indistinguishable from normal procs (both have tyProc type) and
+    # we can detect them only by cheking for attached nkEffectList.
+    if op != nil and op.kind == tyProc and op.n.sons[0].kind == nkEffectList:
       var effectList = op.n.sons[0]
       if a.kind == nkSym and a.sym.kind == skMethod:
         propagateEffects(tracked, n, a.sym)
diff --git a/lib/pure/sockets.nim b/lib/pure/sockets.nim
index 72546dd10..73a189fee 100644
--- a/lib/pure/sockets.nim
+++ b/lib/pure/sockets.nim
@@ -1511,13 +1511,19 @@ proc send*(socket: TSocket, data: pointer, size: int): int {.
 
 proc send*(socket: TSocket, data: string) {.tags: [FWriteIO].} =
   ## sends data to a socket.
-  if send(socket, cstring(data), data.len) != data.len:
+  if socket.nonblocking:
+    raise newException(EInvalidValue, "This function cannot be used on non-blocking sockets.")
+  let sent = send(socket, cstring(data), data.len)
+  if sent < 0:
     when defined(ssl):
       if socket.isSSL:
         SSLError()
     
     OSError(OSLastError())
 
+  if sent != data.len:
+    raise newException(EOS, "Could not send all data.")
+
 proc sendAsync*(socket: TSocket, data: string): int {.tags: [FWriteIO].} =
   ## sends data to a non-blocking socket.
   ## Returns ``0`` if no data could be sent, if data has been sent
@@ -1620,7 +1626,13 @@ proc setBlocking(s: TSocket, blocking: bool) =
       if fcntl(s.fd, F_SETFL, mode) == -1:
         OSError(OSLastError())
   s.nonblocking = not blocking
-  
+
+discard """ proc setReuseAddr*(s: TSocket) =
+  var blah: int = 1
+  var mode = SO_REUSEADDR
+  if setsockopt(s.fd, SOL_SOCKET, mode, addr blah, TSOcklen(sizeof(int))) == -1:
+    OSError(OSLastError()) """
+
 proc connect*(socket: TSocket, address: string, port = TPort(0), timeout: int,
              af: TDomain = AF_INET) {.tags: [FReadIO, FWriteIO].} =
   ## Connects to server as specified by ``address`` on port specified by ``port``.
diff --git a/readme.md b/readme.md
index 069863636..59546653b 100644
--- a/readme.md
+++ b/readme.md
@@ -26,7 +26,6 @@ To build from source you will need:
 
   * gcc 3.x or later recommended. Other alternatives which may work
     are: clang, Visual C++, Intel's C++ compiler
-  * unzip
   * git or wget
 
 If you are on a fairly modern *nix system, the following steps should work:
@@ -34,10 +33,9 @@ If you are on a fairly modern *nix system, the following steps should work:
 ```
 $ git clone git://github.com/Araq/Nimrod.git
 $ cd Nimrod
-$ cd build
-$ unzip csources.zip
+$ git clone --depth 1 git://github.com/nimrod-code/csources
+$ cd csources && ./build.sh
 $ cd ..
-$ ./build.sh
 $ bin/nimrod c koch
 $ ./koch boot -d:release
 ```
diff --git a/readme.txt b/readme.txt
index 069863636..59546653b 100644
--- a/readme.txt
+++ b/readme.txt
@@ -26,7 +26,6 @@ To build from source you will need:
 
   * gcc 3.x or later recommended. Other alternatives which may work
     are: clang, Visual C++, Intel's C++ compiler
-  * unzip
   * git or wget
 
 If you are on a fairly modern *nix system, the following steps should work:
@@ -34,10 +33,9 @@ If you are on a fairly modern *nix system, the following steps should work:
 ```
 $ git clone git://github.com/Araq/Nimrod.git
 $ cd Nimrod
-$ cd build
-$ unzip csources.zip
+$ git clone --depth 1 git://github.com/nimrod-code/csources
+$ cd csources && ./build.sh
 $ cd ..
-$ ./build.sh
 $ bin/nimrod c koch
 $ ./koch boot -d:release
 ```
diff --git a/tools/niminst/buildbat.tmpl b/tools/niminst/buildbat.tmpl
index a8dfd597f..256f61b3d 100644
--- a/tools/niminst/buildbat.tmpl
+++ b/tools/niminst/buildbat.tmpl
@@ -5,6 +5,11 @@ SET CC=gcc
 SET LINKER=gcc
 SET COMP_FLAGS=?{c.ccompiler.flags}
 SET LINK_FLAGS=?{c.linker.flags}
+SET BIN_DIR=?{firstBinPath(c)}
+
+if EXIST ..\koch.nim SET BIN_DIR=..\bin
+
+if NOT EXIST %BIN_DIR%\nul mkdir %BIN_DIR%
 
 REM call the compiler:
 
@@ -12,13 +17,13 @@ REM call the compiler:
 #    var linkCmd = ""
 #    for ff in items(c.cfiles[1][ord(target)]):
 #      let f = ff.replace('/', '\\')
-ECHO %CC% %COMP_FLAGS% -Ibuild -c ?{f} -o ?{changeFileExt(f, "o")}
-%CC% %COMP_FLAGS% -Ibuild -c ?{f} -o ?{changeFileExt(f, "o")}
+ECHO %CC% %COMP_FLAGS% -Isrc -c ?{f} -o ?{changeFileExt(f, "o")}
+%CC% %COMP_FLAGS% -Isrc -c ?{f} -o ?{changeFileExt(f, "o")}
 #      linkCmd.add(" " & changeFileExt(f, "o"))
 #    end for
 
-ECHO %LINKER% -o ?{firstBinPath(c)\toLower(c.name)}.exe ?linkCmd %LINK_FLAGS%
-%LINKER% -o ?{firstBinPath(c)\toLower(c.name)}.exe ?linkCmd %LINK_FLAGS%
+ECHO %LINKER% -o ?{"%BIN_DIR%"\toLower(c.name)}.exe ?linkCmd %LINK_FLAGS%
+%LINKER% -o ?{"%BIN_DIR%"\toLower(c.name)}.exe ?linkCmd %LINK_FLAGS%
 
 #  end block
 
diff --git a/tools/niminst/buildsh.tmpl b/tools/niminst/buildsh.tmpl
index da9c40f55..1ce182b63 100644
--- a/tools/niminst/buildsh.tmpl
+++ b/tools/niminst/buildsh.tmpl
@@ -34,6 +34,16 @@ LINK_FLAGS="?{c.linker.flags}"
 #  add(result, "# platform detection\n")
 ucpu=`uname -m`
 uos=`uname`
+#  add(result, "# bin dir detection\n")
+binDir=?{firstBinPath(c)}
+
+if [ -s ../koch.nim ]; then
+  binDir="../bin"
+fi
+
+if [ ! -d $binDir ]; then
+  mkdir $binDir
+fi
 
 #  add(result, "# convert to lower case:\n")
 ucpu=`echo $ucpu | tr "[:upper:]" "[:lower:]"`
@@ -117,12 +127,12 @@ case $myos in
   ?{c.cpus[cpuA-1]})
 #      var linkCmd = ""
 #      for f in items(c.cfiles[osA][cpuA]):
-    echo "$CC $COMP_FLAGS -Ibuild -c ?{f} -o ?{changeFileExt(f, "o")}"
-    $CC $COMP_FLAGS -Ibuild -c ?{f} -o ?{changeFileExt(f, "o")}
+    echo "$CC $COMP_FLAGS -Isrc -c ?{f} -o ?{changeFileExt(f, "o")}"
+    $CC $COMP_FLAGS -Isrc -c ?{f} -o ?{changeFileExt(f, "o")}
 #        add(linkCmd, " \\\n" & changeFileExt(f, "o"))
-#      end for    
-    echo "$LINKER -o ?{firstBinPath(c)/toLower(c.name)} ?linkCmd $LINK_FLAGS"
-    $LINKER -o ?{firstBinPath(c)/toLower(c.name)} ?linkCmd $LINK_FLAGS
+#      end for
+    echo "$LINKER -o ?{"$binDir"/toLower(c.name)} ?linkCmd $LINK_FLAGS"
+    $LINKER -o ?{"$binDir"/toLower(c.name)} ?linkCmd $LINK_FLAGS
     ;;
 #    end for
   *)
diff --git a/tools/niminst/niminst.nim b/tools/niminst/niminst.nim
index 98a7ab8bb..faad2fb15 100644
--- a/tools/niminst/niminst.nim
+++ b/tools/niminst/niminst.nim
@@ -357,7 +357,10 @@ proc readCFiles(c: var TConfigData, osA, cpuA: int) =
     quit("Cannot open: " & f)
 
 proc buildDir(os, cpu: int): string =
-  return "build" / ($os & "_" & $cpu)
+  return "src" / ($os & "_" & $cpu)
+
+proc getOutputDir(c: var TConfigData): string =
+  if c.outdir.len > 0: c.outdir else: "build"
 
 proc writeFile(filename, content, newline: string) =
   var f: TFile
@@ -392,11 +395,14 @@ proc writeInstallScripts(c: var TConfigData) =
     writeFile(deinstallShFile, GenerateDeinstallScript(c), "\10")
 
 proc srcdist(c: var TConfigData) =
+  if not existsDir(getOutputDir(c) / "src"):
+    createDir(getOutputDir(c) / "src")
   for x in walkFiles(c.libpath / "lib/*.h"):
-    CopyFile(dest="build" / extractFilename(x), source=x)
+    echo(getOutputDir(c) / "src" / extractFilename(x))
+    CopyFile(dest=getOutputDir(c) / "src" / extractFilename(x), source=x)
   for osA in 1..c.oses.len:
     for cpuA in 1..c.cpus.len:
-      var dir = buildDir(osA, cpuA)
+      var dir = getOutputDir(c) / buildDir(osA, cpuA)
       if existsDir(dir): removeDir(dir)
       createDir(dir)
       var cmd = ("nimrod compile -f --symbolfiles:off --compileonly " &
@@ -409,14 +415,15 @@ proc srcdist(c: var TConfigData) =
         quit("Error: call to nimrod compiler failed")
       readCFiles(c, osA, cpuA)
       for i in 0 .. c.cfiles[osA][cpuA].len-1:
-        var dest = dir / extractFilename(c.cfiles[osA][cpuA][i])
+        let dest = dir / extractFilename(c.cfiles[osA][cpuA][i])
+        let relDest = buildDir(osA, cpuA) / extractFilename(c.cfiles[osA][cpuA][i])
         CopyFile(dest=dest, source=c.cfiles[osA][cpuA][i])
-        c.cfiles[osA][cpuA][i] = dest
+        c.cfiles[osA][cpuA][i] = relDest
   # second pass: remove duplicate files
   removeDuplicateFiles(c)
-  writeFile(buildShFile, GenerateBuildShellScript(c), "\10")
-  writeFile(buildBatFile32, GenerateBuildBatchScript(c, tWin32), "\13\10")
-  writeFile(buildBatFile64, GenerateBuildBatchScript(c, tWin64), "\13\10")
+  writeFile(getOutputDir(c) / buildShFile, GenerateBuildShellScript(c), "\10")
+  writeFile(getOutputDir(c) / buildBatFile32, GenerateBuildBatchScript(c, tWin32), "\13\10")
+  writeFile(getOutputDir(c) / buildBatFile64, GenerateBuildBatchScript(c, tWin64), "\13\10")
   writeInstallScripts(c)
 
 # --------------------- generate inno setup -----------------------------------
@@ -467,8 +474,8 @@ when haveZipLib:
 # -- prepare build files for .deb creation
 
 proc debDist(c: var TConfigData) =
-  if not existsFile("build.sh"): quit("No build.sh found.")
-  if not existsFile("install.sh"): quit("No install.sh found.")
+  if not existsFile(getOutputDir(c) / "build.sh"): quit("No build.sh found.")
+  if not existsFile(getOutputDir(c) / "install.sh"): quit("No install.sh found.")
   
   if c.debOpts.shortDesc == "": quit("shortDesc must be set in the .ini file.")
   if c.debOpts.licenses.len == 0: