diff options
author | Araq <rumpf_a@web.de> | 2013-08-07 01:40:37 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2013-08-07 01:40:37 +0200 |
commit | 06b3852143b2f3857da0090b9c18ac63812ec3cc (patch) | |
tree | 48d09ac7567965481b7f46a63f4e4f444b334fad | |
parent | aefa0da8a612df3bb363435dd78ed641b239c0c8 (diff) | |
parent | 5c32156a715b39061ee2bc353e886991fef28ab2 (diff) | |
download | Nim-06b3852143b2f3857da0090b9c18ac63812ec3cc.tar.gz |
Merge branch 'master' of github.com:Araq/Nimrod
-rw-r--r-- | compiler/semexprs.nim | 4 | ||||
-rw-r--r-- | compiler/sempass2.nim | 7 | ||||
-rw-r--r-- | lib/pure/sockets.nim | 16 | ||||
-rw-r--r-- | readme.md | 6 | ||||
-rw-r--r-- | readme.txt | 6 | ||||
-rw-r--r-- | tools/niminst/buildbat.tmpl | 13 | ||||
-rw-r--r-- | tools/niminst/buildsh.tmpl | 20 | ||||
-rw-r--r-- | tools/niminst/niminst.nim | 27 |
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: |