first release
This commit is contained in:
parent
405b86068e
commit
916c25f9a7
321 changed files with 1785 additions and 1808 deletions
12
.bzrignore
Normal file
12
.bzrignore
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
web/*.html
|
||||
doc/*.html
|
||||
*.o
|
||||
*.pyc
|
||||
*.pyo
|
||||
*.obj
|
||||
*.ppu
|
||||
*.exe
|
||||
*.dll
|
||||
*.zip
|
||||
*.tar.gz
|
||||
dist
|
||||
0
Nimrod.geany
Executable file → Normal file
0
Nimrod.geany
Executable file → Normal file
0
cogapp.py
Executable file → Normal file
0
cogapp.py
Executable file → Normal file
0
config/doctempl.cfg
Executable file → Normal file
0
config/doctempl.cfg
Executable file → Normal file
290
config/nimrod.cfg
Executable file → Normal file
290
config/nimrod.cfg
Executable file → Normal file
|
|
@ -1,150 +1,140 @@
|
|||
# Configuration file for the Nimrod Compiler.
|
||||
# Generated by the koch.py script.
|
||||
# (c) 2008 Andreas Rumpf
|
||||
|
||||
# Feel free to edit the default values as you need.
|
||||
|
||||
# You may set environment variables with
|
||||
# @putenv "key" "val"
|
||||
# Environment variables cannot be used in the options, however!
|
||||
|
||||
# Just call the compiler with several options:
|
||||
cc = @if unix: gcc @else: bcc @end
|
||||
lib="$nimrod/lib"
|
||||
path="$lib/base"
|
||||
path="$lib/base/gtk"
|
||||
path="$lib/base/cairo"
|
||||
path="$lib/base/x11"
|
||||
path="$lib/windows"
|
||||
path="$lib/posix"
|
||||
path="$lib/extra"
|
||||
|
||||
# additional defines:
|
||||
#define=""
|
||||
# additional options always passed to the compiler:
|
||||
c_file_cache=on
|
||||
line_dir=off
|
||||
|
||||
hint[LineTooLong]=off
|
||||
hint[XDeclaredButNotUsed]=off
|
||||
|
||||
@if unix:
|
||||
passl= "-ldl"
|
||||
path = "$lib/base/gtk"
|
||||
@end
|
||||
|
||||
@if icc:
|
||||
passl = "-cxxlib"
|
||||
passc = "-cxxlib"
|
||||
@end
|
||||
|
||||
# Configuration for the Borland C++ Compiler:
|
||||
@if windows:
|
||||
bcc.path = r"C:\eigenes\compiler\cbuilder5\bin"
|
||||
@end
|
||||
bcc.options.debug = ""
|
||||
# turn off warnings about unreachable code and inline procs:
|
||||
bcc.options.always = "-w- -H- -q -RT- -a8 -w-8027 -w-8066"
|
||||
bcc.options.speed = "-O2 -6"
|
||||
bcc.options.size = "-O1 -6"
|
||||
|
||||
# Configuration for the Visual C/C++ compiler:
|
||||
@if vcc:
|
||||
@prepend_env path r"C:\Eigenes\compiler\vcc2005\Common7\IDE;"
|
||||
@prepend_env INCLUDE r"C:\Eigenes\compiler\vcc2005\VC\include;C:\Eigenes\compiler\vcc2005\VC\ATLMFC\INCLUDE;"
|
||||
@prepend_env LIB r"C:\Eigenes\compiler\vcc2005\VC\lib;C:\Eigenes\compiler\vcc2005\SDK\v2.0\Lib;"
|
||||
#~ @prepend_env VSINSTALLDIR C:\eigenes\compiler\vcc2005
|
||||
#~ @prepend_env VCINSTALLDIR C:\eigenes\compiler\vcc2005\VC
|
||||
#~ @prepend_env FrameworkDir C:\WINDOWS\Microsoft.NET\Framework
|
||||
#~ @prepend_env FrameworkVersion v2.0.50727
|
||||
#~ @prepend_env FrameworkSDKDir C:\eigenes\compiler\vcc2005\SDK\v2.0
|
||||
#~ @set DevEnvDir=C:\eigenes\compiler\vcc2005\Common7\IDE
|
||||
#~ @prepend_env PATH %DevEnvDir%;%VCINSTALLDIR%\BIN;%VSINSTALLDIR%\Common7\Tools;%VSINSTALLDIR%\Common7\Tools\bin;%VCINSTALLDIR%\PlatformSDK\bin;%FrameworkSDKDir%\bin;%FrameworkDir%\%FrameworkVersion%;%VCINSTALLDIR%\VCPackages;%PATH%
|
||||
#~ @prepend_env INCLUDE %VCINSTALLDIR%\ATLMFC\INCLUDE;%VCINSTALLDIR%\INCLUDE;%VCINSTALLDIR%\PlatformSDK\include;%FrameworkSDKDir%\include;%INCLUDE%
|
||||
#~ @prepend_env LIB %VCINSTALLDIR%\ATLMFC\LIB;%VCINSTALLDIR%\LIB;%VCINSTALLDIR%\PlatformSDK\lib;%FrameworkSDKDir%\lib;%LIB%
|
||||
#~ @prepend_env LIBPATH %FrameworkDir%\%FrameworkVersion%;%VCINSTALLDIR%\ATLMFC\LIB
|
||||
@end
|
||||
@if windows:
|
||||
vcc.path = r"C:\Eigenes\compiler\vcc2005\VC\bin"
|
||||
@end
|
||||
vcc.options.debug = "/GZ /ZI"
|
||||
vcc.options.always = "/nologo"
|
||||
vcc.options.speed = "/Ogityb2 /G7 /arch:SSE2"
|
||||
vcc.options.size = "/O1 /G7"
|
||||
|
||||
# Configuration for the Watcom C/C++ compiler:
|
||||
@if windows:
|
||||
wcc.path = r"C:\eigenes\compiler\watcom\binnt"
|
||||
@end
|
||||
wcc.options.debug = "-d2"
|
||||
wcc.options.always = "-6 -zw -w-"
|
||||
wcc.options.speed = "-ox -on -6 -d0 -fp6 -zW"
|
||||
wcc.options.size = "-ox -on -6 -d0 -fp6 -zW"
|
||||
|
||||
# Configuration for the GNU C/C++ compiler:
|
||||
@if windows:
|
||||
gcc.path = r"C:\eigenes\compiler\mingw\bin"
|
||||
@end
|
||||
gcc.options.debug = "-g"
|
||||
@if macosx:
|
||||
gcc.options.always = "-Wall -g -fasm-blocks"
|
||||
@else:
|
||||
gcc.options.always = "-Wall -g"
|
||||
@end
|
||||
gcc.options.speed = "-O3 -ffast-math"
|
||||
gcc.options.size = "-Os -ffast-math"
|
||||
|
||||
# Configuration for the Digital Mars C/C++ compiler:
|
||||
@if windows:
|
||||
dmc.path = r"C:\eigenes\compiler\d\dm\bin"
|
||||
@end
|
||||
dmc.options.debug = "-g"
|
||||
dmc.options.always = "-Jm"
|
||||
dmc.options.speed = "-ff -o -6"
|
||||
dmc.options.size = "-ff -o -6"
|
||||
|
||||
# Configuration for the LCC compiler:
|
||||
@if windows:
|
||||
lcc.path = r"C:\eigenes\compiler\lcc\bin"
|
||||
@end
|
||||
lcc.options.debug = "-g5"
|
||||
lcc.options.always = "-e1"
|
||||
lcc.options.speed = "-O -p6"
|
||||
lcc.options.size = "-O -p6"
|
||||
|
||||
# Configuration for the Tiny C Compiler:
|
||||
@if windows:
|
||||
tcc.path = r"C:\eigenes\compiler\tcc\bin"
|
||||
@end
|
||||
tcc.options.debug = "-b"
|
||||
tcc.options.always = ""
|
||||
tcc.options.speed = ""
|
||||
tcc.options.size = ""
|
||||
|
||||
# Configuration for the Pelles C compiler:
|
||||
@if windows:
|
||||
pcc.path = r"C:\eigenes\compiler\pellesc\bin"
|
||||
@end
|
||||
pcc.options.debug = "-Zi"
|
||||
pcc.options.always = "-Ze"
|
||||
pcc.options.speed = "-Ox"
|
||||
pcc.options.size = "-Os"
|
||||
|
||||
# Configuration for the LLVM GCC compiler:
|
||||
@if windows:
|
||||
llvm_gcc.path = r"c:\eignes\compiler\llvm-gcc\bin"
|
||||
@end
|
||||
llvm_gcc.options.debug = "-g"
|
||||
llvm_gcc.options.always = "-w"
|
||||
llvm_gcc.options.speed = "-O3 -ffast-math"
|
||||
llvm_gcc.options.size = "-Os -ffast-math"
|
||||
|
||||
@if windows:
|
||||
icc.path = r"c:\eignes\compiler\icc\bin"
|
||||
@end
|
||||
icc.options.debug = "-g"
|
||||
icc.options.always = "-w"
|
||||
icc.options.speed = "-O3 -ffast-math"
|
||||
icc.options.size = "-Os -ffast-math"
|
||||
|
||||
@write "used default config file"
|
||||
# Configuration file for the Nimrod Compiler.
|
||||
# Generated by the koch.py script.
|
||||
# (c) 2008 Andreas Rumpf
|
||||
|
||||
# Feel free to edit the default values as you need.
|
||||
|
||||
# You may set environment variables with
|
||||
# @putenv "key" "val"
|
||||
# Environment variables cannot be used in the options, however!
|
||||
|
||||
# Just call the compiler with several options:
|
||||
cc = @if unix: gcc @else: llvm_gcc @end
|
||||
lib="$nimrod/lib"
|
||||
path="$lib/base"
|
||||
path="$lib/base/gtk"
|
||||
path="$lib/base/cairo"
|
||||
path="$lib/base/x11"
|
||||
path="$lib/windows"
|
||||
path="$lib/posix"
|
||||
path="$lib/extra"
|
||||
|
||||
# additional defines:
|
||||
#define=""
|
||||
# additional options always passed to the compiler:
|
||||
force_build
|
||||
line_dir=off
|
||||
|
||||
hint[LineTooLong]=off
|
||||
hint[XDeclaredButNotUsed]=off
|
||||
|
||||
@if unix:
|
||||
passl= "-ldl"
|
||||
path = "$lib/base/gtk"
|
||||
@end
|
||||
|
||||
@if icc:
|
||||
passl = "-cxxlib"
|
||||
passc = "-cxxlib"
|
||||
@end
|
||||
|
||||
# Configuration for the LLVM GCC compiler:
|
||||
@if windows:
|
||||
llvm_gcc.path = r"dist\llvm-gcc4.2\bin"
|
||||
@end
|
||||
llvm_gcc.options.debug = "-g"
|
||||
llvm_gcc.options.always = "-w"
|
||||
llvm_gcc.options.speed = "-O3 -ffast-math"
|
||||
llvm_gcc.options.size = "-Os -ffast-math"
|
||||
|
||||
# Configuration for the Borland C++ Compiler:
|
||||
@if windows:
|
||||
bcc.path = r"C:\eigenes\compiler\cbuilder5\bin"
|
||||
@end
|
||||
bcc.options.debug = ""
|
||||
# turn off warnings about unreachable code and inline procs:
|
||||
bcc.options.always = "-w- -H- -q -RT- -a8 -w-8027 -w-8066"
|
||||
bcc.options.speed = "-O2 -6"
|
||||
bcc.options.size = "-O1 -6"
|
||||
|
||||
# Configuration for the Visual C/C++ compiler:
|
||||
@if vcc:
|
||||
@prepend_env path r"C:\Eigenes\compiler\vcc2005\Common7\IDE;"
|
||||
@prepend_env INCLUDE r"C:\Eigenes\compiler\vcc2005\VC\include;C:\Eigenes\compiler\vcc2005\VC\ATLMFC\INCLUDE;"
|
||||
@prepend_env LIB r"C:\Eigenes\compiler\vcc2005\VC\lib;C:\Eigenes\compiler\vcc2005\SDK\v2.0\Lib;"
|
||||
@end
|
||||
@if windows:
|
||||
vcc.path = r"C:\Eigenes\compiler\vcc2005\VC\bin"
|
||||
@end
|
||||
vcc.options.debug = "/GZ /ZI"
|
||||
vcc.options.always = "/nologo"
|
||||
vcc.options.speed = "/Ogityb2 /G7 /arch:SSE2"
|
||||
vcc.options.size = "/O1 /G7"
|
||||
|
||||
# Configuration for the Watcom C/C++ compiler:
|
||||
@if windows:
|
||||
wcc.path = r"C:\eigenes\compiler\watcom\binnt"
|
||||
@end
|
||||
wcc.options.debug = "-d2"
|
||||
wcc.options.always = "-6 -zw -w-"
|
||||
wcc.options.speed = "-ox -on -6 -d0 -fp6 -zW"
|
||||
wcc.options.size = "-ox -on -6 -d0 -fp6 -zW"
|
||||
|
||||
# Configuration for the GNU C/C++ compiler:
|
||||
@if windows:
|
||||
gcc.path = r"C:\eigenes\compiler\mingw\bin"
|
||||
@end
|
||||
gcc.options.debug = "-g"
|
||||
@if macosx:
|
||||
gcc.options.always = "-w -fasm-blocks"
|
||||
@else:
|
||||
gcc.options.always = "-w"
|
||||
@end
|
||||
gcc.options.speed = "-O3 -ffast-math"
|
||||
gcc.options.size = "-Os -ffast-math"
|
||||
|
||||
# Configuration for the Digital Mars C/C++ compiler:
|
||||
@if windows:
|
||||
dmc.path = r"C:\eigenes\compiler\d\dm\bin"
|
||||
@end
|
||||
dmc.options.debug = "-g"
|
||||
dmc.options.always = "-Jm"
|
||||
dmc.options.speed = "-ff -o -6"
|
||||
dmc.options.size = "-ff -o -6"
|
||||
|
||||
# Configuration for the LCC compiler:
|
||||
@if windows:
|
||||
lcc.path = r"C:\eigenes\compiler\lcc\bin"
|
||||
@end
|
||||
lcc.options.debug = "-g5"
|
||||
lcc.options.always = "-e1"
|
||||
lcc.options.speed = "-O -p6"
|
||||
lcc.options.size = "-O -p6"
|
||||
|
||||
# Configuration for the Tiny C Compiler:
|
||||
@if windows:
|
||||
tcc.path = r"C:\eigenes\compiler\tcc\bin"
|
||||
@end
|
||||
tcc.options.debug = "-b"
|
||||
tcc.options.always = ""
|
||||
tcc.options.speed = ""
|
||||
tcc.options.size = ""
|
||||
|
||||
# Configuration for the Pelles C compiler:
|
||||
@if windows:
|
||||
pcc.path = r"C:\eigenes\compiler\pellesc\bin"
|
||||
@end
|
||||
pcc.options.debug = "-Zi"
|
||||
pcc.options.always = "-Ze"
|
||||
pcc.options.speed = "-Ox"
|
||||
pcc.options.size = "-Os"
|
||||
|
||||
@if windows:
|
||||
icc.path = r"c:\eignes\compiler\icc\bin"
|
||||
@end
|
||||
icc.options.debug = "-g"
|
||||
icc.options.always = "-w"
|
||||
icc.options.speed = "-O3 -ffast-math"
|
||||
icc.options.size = "-Os -ffast-math"
|
||||
|
||||
@write "used default config file"
|
||||
|
|
|
|||
0
configure
vendored
Executable file → Normal file
0
configure
vendored
Executable file → Normal file
0
data/advopt.txt
Executable file → Normal file
0
data/advopt.txt
Executable file → Normal file
0
data/ast.yml
Executable file → Normal file
0
data/ast.yml
Executable file → Normal file
0
data/basicopt.txt
Executable file → Normal file
0
data/basicopt.txt
Executable file → Normal file
0
data/ccomps.txt
Executable file → Normal file
0
data/ccomps.txt
Executable file → Normal file
0
data/changes.txt
Executable file → Normal file
0
data/changes.txt
Executable file → Normal file
0
data/keywords.txt
Executable file → Normal file
0
data/keywords.txt
Executable file → Normal file
0
data/magic.yml
Executable file → Normal file
0
data/magic.yml
Executable file → Normal file
0
data/messages.yml
Executable file → Normal file
0
data/messages.yml
Executable file → Normal file
0
data/pas_keyw.yml
Executable file → Normal file
0
data/pas_keyw.yml
Executable file → Normal file
0
data/readme.txt
Executable file → Normal file
0
data/readme.txt
Executable file → Normal file
0
dist/empty.txt
vendored
Executable file → Normal file
0
dist/empty.txt
vendored
Executable file → Normal file
0
doc/docs.txt
Executable file → Normal file
0
doc/docs.txt
Executable file → Normal file
0
doc/endb.txt
Executable file → Normal file
0
doc/endb.txt
Executable file → Normal file
0
doc/filelist.txt
Executable file → Normal file
0
doc/filelist.txt
Executable file → Normal file
0
doc/grammar.txt
Executable file → Normal file
0
doc/grammar.txt
Executable file → Normal file
0
doc/html/empty.txt
Executable file → Normal file
0
doc/html/empty.txt
Executable file → Normal file
84
doc/intern.txt
Executable file → Normal file
84
doc/intern.txt
Executable file → Normal file
|
|
@ -82,7 +82,7 @@ Coding standards
|
|||
================
|
||||
|
||||
The compiler is written in a subset of Pascal with special annotations so
|
||||
that it can be translated to Nimrod code automatically. As a generell rule,
|
||||
that it can be translated to Nimrod code automatically. As a general rule,
|
||||
Pascal code that does not translate to Nimrod automatically is forbidden.
|
||||
|
||||
|
||||
|
|
@ -126,55 +126,6 @@ We already knew the type information as a graph in the compiler.
|
|||
Thus we need to serialize this graph as RTTI for C code generation.
|
||||
Look at the files ``lib/typeinfo.nim``, ``lib/hti.nim`` for more information.
|
||||
|
||||
However, generating type information proved to be difficult and the format
|
||||
wastes memory. Variant records make problems too. We use a mix of iterator
|
||||
procedures and constant data structures:
|
||||
|
||||
.. code-block:: Nimrod
|
||||
type
|
||||
TNimTypeSlot {.export.} = record
|
||||
offset: int
|
||||
typ: int
|
||||
name: CString
|
||||
TSlotIterator = proc (obj: pointer, field: int): ptr TNimTypeSlot
|
||||
TNimType {.export.} = record
|
||||
Kind: TNimTypeKind
|
||||
baseType, indexType: int
|
||||
size, len: int
|
||||
slots: TSlotIterator # instead of: ptr array [0..10_000, TNimTypeSlot]
|
||||
|
||||
This is not easy to understand either. Best is to use just the ``rodgen``
|
||||
module and store type information as string constants.
|
||||
|
||||
After thinking I came to the conclusion that this is again premature
|
||||
optimization. We should just construct the type graph at runtime. In the init
|
||||
section new types should be constructed and registered:
|
||||
|
||||
.. code-block:: Nimrod
|
||||
type
|
||||
TSlotTriple = record
|
||||
offset: int
|
||||
typ: PRTL_Type
|
||||
name: Cstring
|
||||
PSlots = ptr TSlots
|
||||
TSlots = record
|
||||
case kind
|
||||
of linear:
|
||||
fields: array [TSlotTriple]
|
||||
of nested:
|
||||
discriminant: TSlotTriple
|
||||
otherSlots: array [discriminant, PSlots]
|
||||
|
||||
TTypeKind = enum ...
|
||||
RTL_Type = record
|
||||
size: int
|
||||
base: PRTL_Type
|
||||
case kind
|
||||
of tyArray, tySequence:
|
||||
elemSize: int
|
||||
of tyRecord, tyObject, tyEnum:
|
||||
slots: PSlots
|
||||
|
||||
|
||||
The Garbage Collector
|
||||
=====================
|
||||
|
|
@ -457,39 +408,6 @@ the CCG. Therefore the module ``magicsys`` contains a table
|
|||
(``compilerprocs``) with all symbols that are marked as ``compilerproc``.
|
||||
|
||||
|
||||
How separate compilation will work
|
||||
==================================
|
||||
|
||||
Soon compiling from scratch every module that's needed will become too slow as
|
||||
programs grow. For easier cleaning all generated files are generated in the
|
||||
directory: ``$base/rod_gen``. This cannot be changed. The generated C files
|
||||
get the names of the modules they result from. A compiled Nimrod module has the
|
||||
extension ``.rod`` and is a binary file. The format may change from release
|
||||
to release. The rod-file is mostly a binary representation of the parse trees.
|
||||
|
||||
Nimrod currently compiles any module into its own C file. Some things like
|
||||
type-information, common string literals, common constant sets need to be
|
||||
shared though. We deal with this problem by writing the shared data
|
||||
in the main C file. Only "headers" are generated in the other modules. However,
|
||||
each precompiled Nimrod module lists the shared data it depends on. The same
|
||||
holds for procedures that have to generated from generics.
|
||||
|
||||
A big problem is that the data must get the same name each time it is compiled.
|
||||
|
||||
The C compiler is only called for the C files, that changed after the last
|
||||
compilation (or if their object file does not exist anymore). To work
|
||||
reliably, in the header comment of the C file these things are listed, so
|
||||
that the C compiler is called again should they change:
|
||||
|
||||
* Nimrod's Version
|
||||
* the target CC
|
||||
* the target OS
|
||||
* the target CPU
|
||||
|
||||
The version is questionable: If the resulting C file is the same, it does not
|
||||
matter that Nimrods's version has increased. We do it anyway to be on the safe
|
||||
side.
|
||||
|
||||
|
||||
Generation of dynamic link libraries
|
||||
====================================
|
||||
|
|
|
|||
0
doc/lib.txt
Executable file → Normal file
0
doc/lib.txt
Executable file → Normal file
0
doc/manual.txt
Executable file → Normal file
0
doc/manual.txt
Executable file → Normal file
0
doc/nimdoc.css
Executable file → Normal file
0
doc/nimdoc.css
Executable file → Normal file
0
doc/nimrodc.txt
Executable file → Normal file
0
doc/nimrodc.txt
Executable file → Normal file
0
doc/overview.txt
Executable file → Normal file
0
doc/overview.txt
Executable file → Normal file
0
doc/posix.txt
Executable file → Normal file
0
doc/posix.txt
Executable file → Normal file
0
doc/readme.txt
Executable file → Normal file
0
doc/readme.txt
Executable file → Normal file
0
doc/regexprs.txt
Executable file → Normal file
0
doc/regexprs.txt
Executable file → Normal file
0
doc/rst.txt
Executable file → Normal file
0
doc/rst.txt
Executable file → Normal file
0
doc/spec.txt
Executable file → Normal file
0
doc/spec.txt
Executable file → Normal file
2873
doc/theindex.txt
Executable file → Normal file
2873
doc/theindex.txt
Executable file → Normal file
File diff suppressed because it is too large
Load diff
0
doc/tutorial.txt
Executable file → Normal file
0
doc/tutorial.txt
Executable file → Normal file
0
dos2unix.py
Executable file → Normal file
0
dos2unix.py
Executable file → Normal file
0
gcccpuopt.sh
Executable file → Normal file
0
gcccpuopt.sh
Executable file → Normal file
0
ide/main.nim
Executable file → Normal file
0
ide/main.nim
Executable file → Normal file
0
ide/nimide.glade
Executable file → Normal file
0
ide/nimide.glade
Executable file → Normal file
50
install.txt
Executable file → Normal file
50
install.txt
Executable file → Normal file
|
|
@ -1,5 +1,26 @@
|
|||
Note: Installation does not work yet - you have to bootstrap. Play with the
|
||||
``koch.py`` script to compile the compiler.
|
||||
Installation
|
||||
============
|
||||
|
||||
Installation on Windows - the easy way
|
||||
--------------------------------------
|
||||
|
||||
Install Nimrod by downloading the appropriate .zip file and extracting it to a
|
||||
directory of your choice. The Nimrod Compiler will stay in this directory;
|
||||
do not use a temporary one! You should add the ``bin`` directory of Nimrod to
|
||||
your ``$PATH`` environment variable.
|
||||
|
||||
|
||||
|
||||
Installation on UNIX
|
||||
--------------------
|
||||
|
||||
Note:
|
||||
A C compiler is required - knowledge of C is not!
|
||||
|
||||
**Note: Installation under UNIX does not work yet** - you have to bootstrap.
|
||||
Play with the ``koch.py`` script to compile the compiler. Under Windows the
|
||||
``nim.exe`` is provided, so you don't need to do anything. Under UNIX you need
|
||||
to install the `FreePascal <www.freepascal.org>`_ compiler.
|
||||
Compile the compiler::
|
||||
|
||||
python koch.py nim
|
||||
|
|
@ -8,16 +29,6 @@ To bootstrap (does not work yet)::
|
|||
|
||||
python koch.py boot
|
||||
|
||||
|
||||
Installation
|
||||
============
|
||||
|
||||
Note:
|
||||
A C compiler is required - knowledge of C is not!
|
||||
|
||||
Installation on UNIX
|
||||
--------------------
|
||||
|
||||
The GNU C Compiler is fully supported, other compilers may work. The C compiler
|
||||
should be in your ``$PATH`` (most likely the case). Note that some Linux
|
||||
distributions do not ship with a C compiler preinstalled - then you have to
|
||||
|
|
@ -49,36 +60,29 @@ need to install Apple's developer's tools for the GNU Compiler Collection
|
|||
though.
|
||||
|
||||
|
||||
Installation on Windows
|
||||
-----------------------
|
||||
Installation on Windows - the hard way
|
||||
--------------------------------------
|
||||
|
||||
Windows does not ship with a C compiler; you have to install one. The
|
||||
following C compilers are supported under Windows:
|
||||
|
||||
- | Digital Mars C++
|
||||
| http://www.digitalmars.com/download/freecompiler.html
|
||||
|
||||
- | Watcom C++
|
||||
| http://www.openwatcom.org/ftp/
|
||||
|
||||
- | Borland C++ (5.5 or above; including Borland C++Builder)
|
||||
| http://www.borland.com/downloads/download_cbuilder.html
|
||||
| (Download the package under "compiler" - this requires registration though.)
|
||||
|
||||
- | Microsoft's Visual C++
|
||||
| http://msdn.microsoft.com/visualc
|
||||
| (You may need the SDK too - but not the full one: Essential are only
|
||||
the win32api header files and import libraries.)
|
||||
|
||||
- | Gnu C Compiler (the mingw version; the cygwin version has not been tested!)
|
||||
| http://www.mingw.org/download.shtml
|
||||
|
||||
- | LLVM with GNU C/C++ frontend
|
||||
| http://llvm.org/releases/download.html#2.2
|
||||
|
||||
- | Pelles C Compiler
|
||||
| http://www.smorgasbordet.com/pellesc
|
||||
|
||||
- | Lcc-win32
|
||||
| http://www.cs.virginia.edu/~lcc-win32
|
||||
|
||||
|
|
@ -91,8 +95,8 @@ LLVM.
|
|||
After you have made sure that a C compiler is available, install
|
||||
Nimrod by downloading the appropriate .zip file and extracting it to a
|
||||
directory of your choice. The Nimrod Compiler will stay in this
|
||||
directory; do not use a temporary one! Then run ``config.exe`` in the
|
||||
``bin`` subdirectory. Choose your C compiler and press ``OK``. You should
|
||||
directory; do not use a temporary one! Then adapt the ``config/nimrod.cfg``
|
||||
file appropriately. Choose your C compiler and press ``OK``. You should
|
||||
add Nimrod to your ``$PATH``.
|
||||
|
||||
Alternatively, you can install Nimrod with the ``koch.py`` script just like
|
||||
|
|
|
|||
129
koch.py
Executable file → Normal file
129
koch.py
Executable file → Normal file
|
|
@ -8,7 +8,7 @@
|
|||
##########################################################################
|
||||
|
||||
import os, os.path, sys, re, zipfile, filecmp, shutil, cPickle, time
|
||||
import string, getopt, textwrap, glob, shutil, getopt, string
|
||||
import string, getopt, textwrap, glob, shutil, getopt, string, stat
|
||||
|
||||
|
||||
if sys.version_info[0] >= 3: # this script does not work with Python 3.0
|
||||
|
|
@ -20,7 +20,7 @@ from kochmod import *
|
|||
|
||||
CFLAGS = "" # modify to set flags to the first compilation step
|
||||
|
||||
NIMROD_VERSION = '0.2.1'
|
||||
NIMROD_VERSION = '0.5.1'
|
||||
# This string contains Nimrod's version. It is the only place
|
||||
# where the version needs to be updated. The rest is done by
|
||||
# the build process automatically. It is replaced **everywhere**
|
||||
|
|
@ -118,10 +118,9 @@ Possible Commands:
|
|||
configure configures the environment for developing Nimrod
|
||||
doc builds the documentation in HTML
|
||||
clean cleans Nimrod project; removes generated files
|
||||
dist produces a distribution as
|
||||
dist [target] produces a distribution as
|
||||
nimrod_$target_$version.zip
|
||||
boot [options] bootstraps with given command line options
|
||||
tests [options] runs the complete testsuite (with options)
|
||||
rodsrc generates Nimrod version from Pascal version
|
||||
web generates the website (requires Cheetah)
|
||||
""" % (NIMROD_VERSION + ' ' * (44-len(NIMROD_VERSION)))
|
||||
|
|
@ -149,9 +148,11 @@ def main(args):
|
|||
elif cmd == "configure": cmd_configure()
|
||||
elif cmd == "doc": cmd_doc()
|
||||
elif cmd == "clean": cmd_clean()
|
||||
elif cmd == "dist": cmd_dist()
|
||||
elif cmd == "dist":
|
||||
if i < len(args)-1: cmd_dist(args[i+1])
|
||||
else: cmd_dist()
|
||||
elif cmd == "boot": cmd_boot(" ".join(args[i+1:]))
|
||||
elif cmd == "tests": cmd_tests(" ".join(args[i+1:]))
|
||||
#elif cmd == "tests": cmd_tests(" ".join(args[i+1:]))
|
||||
elif cmd == "install": cmd_install(args[i+1:])
|
||||
elif cmd == "rodsrc": cmd_rodsrc()
|
||||
elif cmd == "web": cmd_web()
|
||||
|
|
@ -243,7 +244,8 @@ def cmd_web():
|
|||
]
|
||||
TEMPLATE_FILE = "web/sunset.tmpl"
|
||||
#CMD = "rst2html.py --template=web/docutils.tmpl web/%s.txt web/%s.temp "
|
||||
CMD = "nim rst2html --compileonly -o:web/%s.temp web/%s.txt"
|
||||
CMD = "nim rst2html --compileonly " \
|
||||
" --putenv:nimrodversion=%s -o:web/%s.temp web/%s.txt"
|
||||
|
||||
c = Changed("web", Glob("web/*.txt") + [TEMPLATE_FILE, "koch.py"] +
|
||||
Glob("doc/*.txt") + Glob("lib/*.txt") + Glob("lib/*.nim")+
|
||||
|
|
@ -251,10 +253,10 @@ def cmd_web():
|
|||
EXPLAIN)
|
||||
if c or force:
|
||||
cmd_nim() # we need Nimrod for processing the documentation
|
||||
Exec(CMD % ("news","news"))
|
||||
Exec(CMD % (NIMROD_VERSION, "news","news"))
|
||||
newsText = file("web/news.temp").read()
|
||||
for t in TABS:
|
||||
Exec(CMD % (t[1],t[1]))
|
||||
Exec(CMD % (NIMROD_VERSION, t[1],t[1]))
|
||||
|
||||
tmpl = Cheetah.Template.Template(file=TEMPLATE_FILE)
|
||||
tmpl.content = file("web/%s.temp" % t[1]).read()
|
||||
|
|
@ -262,14 +264,14 @@ def cmd_web():
|
|||
tmpl.tab = t[1]
|
||||
tmpl.tabs = TABS
|
||||
tmpl.lastupdate = time.strftime("%Y-%m-%d %X", time.gmtime())
|
||||
f = file("web/%s.html" % t[1], "w+")
|
||||
f = file("web/upload/%s.html" % t[1], "w+")
|
||||
f.write(str(tmpl))
|
||||
f.close()
|
||||
# remove temporaries:
|
||||
Remove("web/news.temp")
|
||||
for t in TABS: Remove("web/%s.temp" % t[1])
|
||||
buildDoc("web")
|
||||
if Exists("web/index.html"):
|
||||
buildDoc("web/upload")
|
||||
if Exists("web/upload/index.html"):
|
||||
c.success()
|
||||
|
||||
# ------------------ doc ------------------------------------------------------
|
||||
|
|
@ -306,7 +308,10 @@ def cmd_clean(dir = "."):
|
|||
for name in files:
|
||||
if (extRegEx.match(name)
|
||||
or (root == "tests" and ('.' not in name))):
|
||||
Remove(os.path.join(root, name))
|
||||
x = os.path.join(root, name)
|
||||
if "/dist/" not in x and "\\dist\\" not in x:
|
||||
Echo("removing: " + x)
|
||||
Remove(os.path.join(root, name))
|
||||
for name in dirs:
|
||||
if name == "rod_gen":
|
||||
shutil.rmtree(path=os.path.join(root, name), ignore_errors=True)
|
||||
|
|
@ -318,48 +323,48 @@ def cmd_clean(dir = "."):
|
|||
|
||||
distlist = {
|
||||
'common': (
|
||||
"copying.txt",
|
||||
"gpl.html",
|
||||
"koch.py",
|
||||
"*.txt",
|
||||
"*.html",
|
||||
"*.py",
|
||||
|
||||
"lib/nimbase.h -> lib/nimbase.h",
|
||||
"lib/*.nim -> lib",
|
||||
|
||||
"rod/*.nim -> rod",
|
||||
"nim/*.pas -> nim",
|
||||
"nim/*.txt -> nim",
|
||||
"rod/*.* -> rod",
|
||||
"build/*.* -> build",
|
||||
"nim/*.* -> nim",
|
||||
|
||||
"data/*.yml -> data",
|
||||
"data/*.txt -> data",
|
||||
"obj/*.txt",
|
||||
|
||||
"config/nimrod.cfg -> config/nimrod.cfg",
|
||||
"config/*.cfg -> config",
|
||||
# documentation:
|
||||
"doc/*.txt", # only include the text documentation; saves bandwidth!
|
||||
# the installation program should generate the HTML
|
||||
"readme.txt -> readme.txt",
|
||||
"install.txt -> install.txt",
|
||||
|
||||
"doc/*.txt",
|
||||
"doc/*.html",
|
||||
# tests:
|
||||
"tests/*.*",
|
||||
# library:
|
||||
"lib/base/pcre_all.c -> lib/base/pcre_all.c",
|
||||
"lib/base/pcre.nim -> lib/base/pcre.nim",
|
||||
"lib/base/regexprs.nim -> lib/base/regexprs.nim",
|
||||
#"lib/windows/winapi.nim -> lib/windows/winapi.nim"
|
||||
"lib/base/*.c -> lib/base",
|
||||
"lib/base/*.nim -> lib/base",
|
||||
"lib/base/gtk/*.nim -> lib/base/gtk",
|
||||
"lib/base/cairo/*.nim -> lib/base/cairo",
|
||||
"lib/windows/*.nim -> lib/windows",
|
||||
"lib/posix/*.nim -> lib/posix"
|
||||
# don't be too clever here; maybe useful on Linux
|
||||
# for cross-compiling to Windows?
|
||||
),
|
||||
'windows': (
|
||||
"bin/nim.exe -> bin/nim.exe",
|
||||
"koch.exe -> koch.exe",
|
||||
"lib/dlmalloc.h -> lib/dlmalloc.h",
|
||||
"lib/dlmalloc.c -> lib/dlmalloc.c",
|
||||
"dist/llvm-gcc4.2",
|
||||
),
|
||||
'linux': (
|
||||
"lib/rod_gen/*.c -> build",
|
||||
"rod/rod_gen/*.c -> build",
|
||||
),
|
||||
'macosx': (
|
||||
'unix': (
|
||||
"lib/rod_gen/*.c -> build",
|
||||
"rod/rod_gen/*.c -> build",
|
||||
"lib/dlmalloc.h -> lib/dlmalloc.h",
|
||||
"lib/dlmalloc.c -> lib/dlmalloc.c",
|
||||
)
|
||||
}
|
||||
|
||||
|
|
@ -370,6 +375,14 @@ def getHost():
|
|||
# a heuristic that could work (most likely not :-):
|
||||
else: return re.sub(r"[0-9]+$", r"", sys.platform).lower()
|
||||
|
||||
def mydirwalker(dir, L):
|
||||
for name in os.listdir(dir):
|
||||
path = os.path.join(dir, name)
|
||||
if os.path.isdir(path):
|
||||
mydirwalker(path, L)
|
||||
else:
|
||||
L.append(path)
|
||||
|
||||
def iterInstallFiles(target=getHost()):
|
||||
for section in ['common', target]:
|
||||
for rule in distlist[section]:
|
||||
|
|
@ -378,16 +391,27 @@ def iterInstallFiles(target=getHost()):
|
|||
source, dest = splittedRule
|
||||
if '*' in source:
|
||||
for f in Glob(source):
|
||||
yield (Path(f), Path(dest + '/' + os.path.split(f)[1]))
|
||||
if not stat.S_ISDIR(os.stat(f)[stat.ST_MODE]):
|
||||
yield (Path(f), Path(dest + '/' + os.path.split(f)[1]))
|
||||
else:
|
||||
yield (Path(source), Path(dest))
|
||||
elif os.path.isdir(Path(rule)):
|
||||
L = []
|
||||
mydirwalker(Path(rule), L)
|
||||
for f in L:
|
||||
yield f, f
|
||||
else:
|
||||
for f in Glob(rule):
|
||||
yield (Path(f), Path(f))
|
||||
if not stat.S_ISDIR(os.stat(f)[stat.ST_MODE]):
|
||||
yield (Path(f), Path(f))
|
||||
|
||||
def cmd_dist(target=getHost()):
|
||||
def cmd_dist(target=""):
|
||||
from zipfile import ZipFile
|
||||
distfile = Path('dist/nimrod_%s_%s.zip' % (target, getVersion()))
|
||||
if not target:
|
||||
if os.name == "nt": target = "windows"
|
||||
else: target = "unix"
|
||||
distfile = Path('web/upload/download/nimrod_%s_%s.zip' %
|
||||
(target, getVersion()))
|
||||
Echo("creating: %s..." % distfile)
|
||||
z = ZipFile(distfile, 'w', zipfile.ZIP_DEFLATED)
|
||||
for source, dest in iterInstallFiles(target):
|
||||
|
|
@ -407,8 +431,8 @@ DefaultDirName={code:GiveMeAPath|nimrod}
|
|||
DefaultGroupName=Nimrod
|
||||
AllowNoIcons=yes
|
||||
LicenseFile=nim\copying.txt
|
||||
OutputDir=dist
|
||||
OutputBaseFilename=install_nimrod_$version
|
||||
OutputDir=web\upload\download
|
||||
OutputBaseFilename=nimrod_windows_$version
|
||||
Compression=lzma
|
||||
SolidCompression=yes
|
||||
PrivilegesRequired=none
|
||||
|
|
@ -464,8 +488,6 @@ def makeKochExe():
|
|||
|
||||
def cmd_wininstaller():
|
||||
FILENAME = "install_nimrod.iss"
|
||||
makeKochExe()
|
||||
|
||||
# generate an installer file
|
||||
files = ""
|
||||
for source, dest in iterInstallFiles("windows"):
|
||||
|
|
@ -692,13 +714,14 @@ CONFIG_TEMPLATE = r"""# Configuration file for the Nimrod Compiler.
|
|||
# Environment variables cannot be used in the options, however!
|
||||
|
||||
# Just call the compiler with several options:
|
||||
cc = @if unix: %(cc)s @else: vcc @end
|
||||
cc = @if unix: %(cc)s @else: llvm_gcc @end
|
||||
lib="$nimrod/lib"
|
||||
path="$lib/base"
|
||||
path="$lib/base/gtk"
|
||||
path="$lib/base/cairo"
|
||||
path="$lib/base/x11"
|
||||
path="$lib/windows"
|
||||
path="$lib/posix"
|
||||
path="$lib/extra"
|
||||
|
||||
# additional defines:
|
||||
|
|
@ -720,6 +743,15 @@ hint[XDeclaredButNotUsed]=off
|
|||
passc = "-cxxlib"
|
||||
@end
|
||||
|
||||
# Configuration for the LLVM GCC compiler:
|
||||
@if windows:
|
||||
llvm_gcc.path = r"dist\llvm-gcc4.2\bin"
|
||||
@end
|
||||
llvm_gcc.options.debug = "-g"
|
||||
llvm_gcc.options.always = "-w"
|
||||
llvm_gcc.options.speed = "-O3 -ffast-math"
|
||||
llvm_gcc.options.size = "-Os -ffast-math"
|
||||
|
||||
# Configuration for the Borland C++ Compiler:
|
||||
@if windows:
|
||||
bcc.path = r"C:\eigenes\compiler\cbuilder5\bin"
|
||||
|
|
@ -802,15 +834,6 @@ pcc.options.always = "-Ze"
|
|||
pcc.options.speed = "-Ox"
|
||||
pcc.options.size = "-Os"
|
||||
|
||||
# Configuration for the LLVM GCC compiler:
|
||||
@if windows:
|
||||
llvm_gcc.path = r"c:\eignes\compiler\llvm-gcc\bin"
|
||||
@end
|
||||
llvm_gcc.options.debug = "-g"
|
||||
llvm_gcc.options.always = "-w"
|
||||
llvm_gcc.options.speed = "-O3 -ffast-math"
|
||||
llvm_gcc.options.size = "-Os -ffast-math"
|
||||
|
||||
@if windows:
|
||||
icc.path = r"c:\eignes\compiler\icc\bin"
|
||||
@end
|
||||
|
|
|
|||
0
kochmod.py
Executable file → Normal file
0
kochmod.py
Executable file → Normal file
0
lib/amd64.asm.in
Executable file → Normal file
0
lib/amd64.asm.in
Executable file → Normal file
0
lib/ansi_c.nim
Executable file → Normal file
0
lib/ansi_c.nim
Executable file → Normal file
0
lib/arithm.nim
Executable file → Normal file
0
lib/arithm.nim
Executable file → Normal file
0
lib/assign.nim
Executable file → Normal file
0
lib/assign.nim
Executable file → Normal file
0
lib/base/dialogs.nim
Executable file → Normal file
0
lib/base/dialogs.nim
Executable file → Normal file
0
lib/base/gtk/atk.nim
Executable file → Normal file
0
lib/base/gtk/atk.nim
Executable file → Normal file
0
lib/base/gtk/gdk2.nim
Executable file → Normal file
0
lib/base/gtk/gdk2.nim
Executable file → Normal file
0
lib/base/gtk/gdk2pixbuf.nim
Executable file → Normal file
0
lib/base/gtk/gdk2pixbuf.nim
Executable file → Normal file
0
lib/base/gtk/gdkglext.nim
Executable file → Normal file
0
lib/base/gtk/gdkglext.nim
Executable file → Normal file
0
lib/base/gtk/glib2.nim
Executable file → Normal file
0
lib/base/gtk/glib2.nim
Executable file → Normal file
0
lib/base/gtk/gtk2.nim
Executable file → Normal file
0
lib/base/gtk/gtk2.nim
Executable file → Normal file
0
lib/base/gtk/gtkglext.nim
Executable file → Normal file
0
lib/base/gtk/gtkglext.nim
Executable file → Normal file
0
lib/base/gtk/gtkhtml.nim
Executable file → Normal file
0
lib/base/gtk/gtkhtml.nim
Executable file → Normal file
0
lib/base/gtk/libglade2.nim
Executable file → Normal file
0
lib/base/gtk/libglade2.nim
Executable file → Normal file
0
lib/base/gtk/pango.nim
Executable file → Normal file
0
lib/base/gtk/pango.nim
Executable file → Normal file
0
lib/base/gtk/pangoutils.nim
Executable file → Normal file
0
lib/base/gtk/pangoutils.nim
Executable file → Normal file
0
lib/base/nregex.nim
Executable file → Normal file
0
lib/base/nregex.nim
Executable file → Normal file
0
lib/base/pcre.nim
Executable file → Normal file
0
lib/base/pcre.nim
Executable file → Normal file
0
lib/base/pcre_all.c
Executable file → Normal file
0
lib/base/pcre_all.c
Executable file → Normal file
0
lib/base/regexprs.nim
Executable file → Normal file
0
lib/base/regexprs.nim
Executable file → Normal file
0
lib/cntbits.nim
Executable file → Normal file
0
lib/cntbits.nim
Executable file → Normal file
0
lib/complex.nim
Executable file → Normal file
0
lib/complex.nim
Executable file → Normal file
0
lib/copying.txt
Executable file → Normal file
0
lib/copying.txt
Executable file → Normal file
0
lib/debugger.nim
Executable file → Normal file
0
lib/debugger.nim
Executable file → Normal file
0
lib/dlmalloc.c
Executable file → Normal file
0
lib/dlmalloc.c
Executable file → Normal file
0
lib/dlmalloc.h
Executable file → Normal file
0
lib/dlmalloc.h
Executable file → Normal file
0
lib/dyncalls.nim
Executable file → Normal file
0
lib/dyncalls.nim
Executable file → Normal file
0
lib/excpt.nim
Executable file → Normal file
0
lib/excpt.nim
Executable file → Normal file
0
lib/gc.nim
Executable file → Normal file
0
lib/gc.nim
Executable file → Normal file
0
lib/hti.nim
Executable file → Normal file
0
lib/hti.nim
Executable file → Normal file
0
lib/i386.asm.in
Executable file → Normal file
0
lib/i386.asm.in
Executable file → Normal file
0
lib/int64s.nim
Executable file → Normal file
0
lib/int64s.nim
Executable file → Normal file
0
lib/lgpl.txt
Executable file → Normal file
0
lib/lgpl.txt
Executable file → Normal file
0
lib/locks.nim
Executable file → Normal file
0
lib/locks.nim
Executable file → Normal file
0
lib/math.nim
Executable file → Normal file
0
lib/math.nim
Executable file → Normal file
0
lib/memman.nim
Executable file → Normal file
0
lib/memman.nim
Executable file → Normal file
0
lib/nimbase.h
Executable file → Normal file
0
lib/nimbase.h
Executable file → Normal file
0
lib/optparse.nim
Executable file → Normal file
0
lib/optparse.nim
Executable file → Normal file
7
lib/os.nim
Executable file → Normal file
7
lib/os.nim
Executable file → Normal file
|
|
@ -294,6 +294,10 @@ proc existsDir*(dir: string): bool
|
|||
proc getLastModificationTime*(file: string): TTime
|
||||
## Gets the time of the `file`'s last modification.
|
||||
|
||||
proc fileNewer*(a, b: string): bool
|
||||
## returns true if the file `a` is newer than file `b`, i.e. if `a`'s
|
||||
## modification time is later than `b`'s.
|
||||
|
||||
# procs dealing with environment variables:
|
||||
proc putEnv*(key, val: string)
|
||||
## Sets the value of the environment variable named `key` to `val`.
|
||||
|
|
@ -936,4 +940,7 @@ else:
|
|||
|
||||
proc paramCount(): int = return cmdCount-1
|
||||
|
||||
proc fileNewer(a, b: string): bool =
|
||||
result = getLastModificationTime(a) - getLastModificationTime(b) > 0
|
||||
|
||||
{.pop.}
|
||||
|
|
|
|||
0
lib/posix/posix.nim
Executable file → Normal file
0
lib/posix/posix.nim
Executable file → Normal file
0
lib/powerpc.asm.in
Executable file → Normal file
0
lib/powerpc.asm.in
Executable file → Normal file
0
lib/process.nim
Executable file → Normal file
0
lib/process.nim
Executable file → Normal file
0
lib/ptrset.nim
Executable file → Normal file
0
lib/ptrset.nim
Executable file → Normal file
0
lib/repr.nim
Executable file → Normal file
0
lib/repr.nim
Executable file → Normal file
0
lib/sets.nim
Executable file → Normal file
0
lib/sets.nim
Executable file → Normal file
0
lib/strutils.nim
Executable file → Normal file
0
lib/strutils.nim
Executable file → Normal file
0
lib/sysio.nim
Executable file → Normal file
0
lib/sysio.nim
Executable file → Normal file
0
lib/sysstr.nim
Executable file → Normal file
0
lib/sysstr.nim
Executable file → Normal file
0
lib/system.nim
Executable file → Normal file
0
lib/system.nim
Executable file → Normal file
0
lib/times.nim
Executable file → Normal file
0
lib/times.nim
Executable file → Normal file
0
lib/typeinfo.nim
Executable file → Normal file
0
lib/typeinfo.nim
Executable file → Normal file
0
lib/unicode.nim
Executable file → Normal file
0
lib/unicode.nim
Executable file → Normal file
0
lib/windows/mmsystem.nim
Executable file → Normal file
0
lib/windows/mmsystem.nim
Executable file → Normal file
0
lib/windows/nb30.nim
Executable file → Normal file
0
lib/windows/nb30.nim
Executable file → Normal file
0
lib/windows/ole2.nim
Executable file → Normal file
0
lib/windows/ole2.nim
Executable file → Normal file
0
lib/windows/shellapi.nim
Executable file → Normal file
0
lib/windows/shellapi.nim
Executable file → Normal file
0
lib/windows/shfolder.nim
Executable file → Normal file
0
lib/windows/shfolder.nim
Executable file → Normal file
0
lib/windows/windows.nim
Executable file → Normal file
0
lib/windows/windows.nim
Executable file → Normal file
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue