Qore started out as a purely UNIX language, but, as of Qore 0.8.3, it is possible to build a fully-functional native Qore DLL (and qore.exe) for windows (i.e. without cygwin).

BINARIES
--------
For Windows binaries, check for a zip package for the latest version on github:
    https://github.com/qorelanguage/qore/releases

BUILDING
--------
Currently Qore can only be (easily) built with the mingw compiler as a cross-compiler (from Linux, OSX, etc).
Information about this cross-compiler can be found here:
        http://mxe.cc/

It requires the dlfcn library as well for dynamic module loading:
        http://code.google.com/p/dlfcn-win32/

Once dlfcn has been built and installed using the mingw cross-compiler, configure Qore on the source (ie UNIX) host as follows (make sure the mmxe/mingw cross compiler binaries are in your PATH and unset CXX if it's set to a native compiler):
configure --host=i686-pc-mingw32 --with-dl-dir=<wherever you installed dlfcn> --prefix=<wherever you want windows qore>

Then a Qore DLL is built along with a qore.exe when you type "make"

"make install" will install everything; the library and headers can be used with the same compiler to build qore modules for windows.

The Qore DLL built this way will be statically linked with the libraries necessary for it to run (pcre, openssl, libxml2, etc).  This makes for a pretty large DLL, but eliminates the need for all the supporting DLLs in one place.

Currently Windows XP is required as the mininum required Windows target.

PROBLEMS
--------
if you get a configure error like:
   checking for the wsock32 library... configure: error: cannot find the wsock32 library which is needed to compile Qore for the target platform (Windows)
make sure you don't have the CXX environment variable set to a native compiler; as this will override the cross-compiler set by the --host-i686-pc-mingw32 configure option (for example, I have CXX=clang++ so I have to call configure like:
        CXX= configure --host=i686-pc-mingw32 --with-dl-dir=<wherever you installed dlfcn> --prefix=<wherever you want windows qore>


=======
RUNNING
-------
set PATH to the binary directory where qore.exe and qore.dll are located:
    set PATH=%PATH%;c:\qopre\bin

set QORE_MODULE_PATH to the module directory where Qore was installed, don't forget the versioned subdirectory for user modules; ex:\
    set QORE_MODULE_PATH=c:\qore\lib\qore-modules:c:\qore\lib\qore-modules\0.8.5

report any bugs to david@qore.org or post on the Qore forums:
    http://www.qore.org/forums

FUNCTIONAL NOTES
----------------
The following is a list of things particular to the Windows build:
* unsupported functionality
Some things are not available on Windows because they are UNIX-specific, others because the standard UNIX API is not available on Windows, and therefore they have to be ported to another API.  For each unsupported feature, there is a constant listed that can be used either at runtime or at parse time (with the %ifdef or %ifndef parse directives) in portable programs to handle the lack of a feature gracefully.

function implementations missing in the Windows build (calling these will cause a MISSING-FEATURE-ERROR to be issued at runtime):
  + is_executable() (HAVE_IS_EXECUTABLE)
  + is_link() (HAVE_UNIX_FILEMGT)
  + getuid() (HAVE_UNIX_USERMGT)
  + geteuid() (HAVE_UNIX_USERMGT)
  + getgid() (HAVE_UNIX_USERMGT)
  + getegid() (HAVE_UNIX_USERMGT)
  + getppid() (HAVE_GETPPID)
  + fork() (HAVE_FORK)
  + kill() (HAVE_KILL)
  + statvfs() (HAVE_STATVFS)
  + mkfifo() (HAVE_UNIX_FILEMGT)
  + setuid() (HAVE_UNIX_USERMGT)
  + seteuid() (HAVE_UNIX_USERMGT)
  + setgid() (HAVE_UNIX_USERMGT)
  + setegid() (HAVE_UNIX_USERMGT)
  + setsid() (HAVE_SETSID)
  + chown() (HAVE_UNIX_FILEMGT)
  + lchown() (HAVE_UNIX_FILEMGT)
  + readlink() (HAVE_UNIX_FILEMGT)
  + set_signal_handler() (HAVE_SIGNAL_HANDLING)
  + remove_signal_handler() (HAVE_SIGNAL_HANDLING)
  + getpwuid() (HAVE_UNIX_USERMGT)
  + getpwuid2() (HAVE_UNIX_USERMGT)
  + getpwnam() (HAVE_UNIX_USERMGT)
  + getpwnam2() (HAVE_UNIX_USERMGT)
  + getgrgid() (HAVE_UNIX_USERMGT)
  + getgrgid2() (HAVE_UNIX_USERMGT)
  + getgrnam() (HAVE_UNIX_USERMGT)
  + getgrnam2() (HAVE_UNIX_USERMGT)

method implementations missing in the Windows build (calling these will cause a MISSING-FEATURE-ERROR to be issued at runtime):
  + Dir::chown() (HAVE_UNIX_FILEMGT)
  + Dir::chgrp() (HAVE_UNIX_FILEMGT)
  + Dir::statvfs() (HAVE_STATVFS)
  + File::lock() (HAVE_FILE_LOCKING)
  + File::lockBlocking() (HAVE_FILE_LOCKING)
  + File::getLockInfo() (HAVE_FILE_LOCKING)
  + File::chown() (HAVE_UNIX_FILEMGT)
  + File::getTerminalAttributes() (HAVE_TERMIOS)
  + File::setTerminalAttributes() (HAVE_TERMIOS)
  + File::statvfs() (HAVE_STATVFS)
  + static File::statvfs() (HAVE_STATVFS)

class implementations missing in the Windows build (calling any methods or trying to instantiate the class will cause a MISSING-FEATURE-ERROR to be issued at runtime):
  + TermIOS (HAVE_TERMIOS)

Also all TermIOS-related constants are missing on Windows

* different functionality
functions:
  + lstat() is an alias for stat() on Windows
  + hlstat() is an alias for hstat() on Windows
  + glob() is implemented by transforming the glob argument to a regular expression and then applying the regex to the list of files returned; it should give the same results as UNIX glob(), but in case it doesn't please let me know (david@qore.org)

methods:
  + File::lstat() is an alias for File::stat() on Windows
  + File::hlstat() is an alias for File::hstat() on Windows
  + static File::lstat() is an alias for File::stat() on Windows
  + static File::hlstat() is an alias for File::hstat() on Windows

* time zone handling
On Windows, Qore's time zone information is read from binary time zone data in the Windows registry under HKEY_LOCAL_MACHINE SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones as mapped from zoneinfo names.

* socket support
There are no UNIX sockets available on Windows, otherwise the Socket class should work the same as on UNIX systems; error messages will be Windows error messages

* threading
threading should work identically as on UNIX

* path separator
The path separator is understood to be "\" on windows
